gpt4 book ai didi

python - 是否有 __init__ 的装饰器包可以将参数复制到对象的字段中而无需显式赋值?

转载 作者:行者123 更新时间:2023-12-01 05:36:11 25 4
gpt4 key购买 nike

pinject这些很棒的装饰器:@copy_args_to_internal_fields@copy_args_to_public_fields。他们完全按照 jar 头上所说的去做,并且正是我正在寻找的东西。

是否有一个独立的包(我似乎在谷歌上找不到它)可以做到这一点?不用说,我不想将整个 pinject 添加为依赖项。有点矫枉过正了。我想要快速编辑并节省打字时间!

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

最佳答案

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

这不需要 decorator 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>

关于python - 是否有 __init__ 的装饰器包可以将参数复制到对象的字段中而无需显式赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18992242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com