是否有一个uu init uuu的decorator包,它可以将参数复制到对象的字段中,而无需显式赋值?

2024-04-25 03:36:54 发布

您现在位置:Python中文网/ 问答频道 /正文

pinject这些很棒的装饰器:@copy_args_to_internal_fields@copy_args_to_public_fields。他们完全照罐头上说的做,正是我要找的。你知道吗

有没有一个独立的软件包(我在Google上找不到)可以做到这一点?不用说,我不想将整个pinject添加为依赖项。有点过分了。我在追求快速编辑和保存我打字!你知道吗

编辑:删除了许可证要求;pinject的Apache许可证很好,所以我想我可以复制它们的实现。你知道吗


Tags: to编辑fieldsapachegoogleargs装饰public
1条回答
网友
1楼 · 发布于 2024-04-25 03:36:54

pinject.initializers模块转换为独立版本:

import inspect
from functools import wraps


def copy_args_to_internal_fields(fn):
    """Copies the initializer args to internal member fields.

    This is a decorator that applies to __init__.
    """
    return _copy_args_to_fields(fn, 'copy_args_to_internal_fields', '_')


def copy_args_to_public_fields(fn):
    """Copies the initializer args to public member fields.

    This is a decorator that applies to __init__.
    """
    return _copy_args_to_fields(fn, 'copy_args_to_public_fields', '')


def _copy_args_to_fields(fn, decorator_name, field_prefix):
    if fn.__name__ != '__init__':
        raise ValueError('@{0} cannot be applied to non-initializer {1}.{2}'.format(
            decorator_name, inspect.getmodule(fn).__name__, fn.__name__))

    arg_names, varargs, unused_keywords, unused_defaults = (
        inspect.getargspec(fn))

    if varargs is not None:
        raise ValueError('decorator @{0} cannot be applied to {1}.{2} with *{3}'.format(
            decorator_name, inspect.getmodule(fn).__name__, fn.__name__, varargs))

    @wraps(fn)
    def CopyThenCall(self, *pargs, **kwargs):
        for index, parg in enumerate(pargs, start=1):
            setattr(self, field_prefix + arg_names[index], parg)
        for kwarg, kwvalue in kwargs.iteritems():
            setattr(self, field_prefix + kwarg, kwvalue)
        fn(self, *pargs, **kwargs)

    return CopyThenCall

这也不需要^{} package依赖关系。你知道吗

演示:

>>> from standalone_initializers import *
>>> class Foo(object):
...     @copy_args_to_public_fields
...     def __init__(self, foo, bar=None, baz=1):
...         print vars(self)
... 
>>> Foo(1, 2)
{'foo': 1, 'bar': 2}
<__main__.Foo object at 0x106bb2e90>
>>> class Foo(object):
...     @copy_args_to_internal_fields
...     def __init__(self, foo, bar=None, baz=1):
...         print vars(self)
... 
>>> Foo(1, 2)
{'_foo': 1, '_bar': 2}
<__main__.Foo object at 0x106bb2f50>

相关问题 更多 >