Python 是否有一个uu init uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;没有显式赋值的s字段?

Python 是否有一个uu init uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;没有显式赋值的s字段?,python,decorator,python-decorators,Python,Decorator,Python Decorators,这些很棒的装饰器:@copy\u args\u to\u internal\u fields和@copy\u args\u to\u public\u fields。他们完全按照罐头上说的做,也正是我要找的 有没有一个独立的软件包可以做到这一点(我在谷歌上找不到)?不用说,我不想将整个pinject添加为依赖项。有点过分了。我在追求快速编辑和节省我打字 编辑:删除许可证要求;pinject的Apache许可证很好,所以我想我可以复制它们的实现。将pinject.initializers模块转换为

这些很棒的装饰器:
@copy\u args\u to\u internal\u fields
@copy\u args\u to\u public\u fields
。他们完全按照罐头上说的做,也正是我要找的

有没有一个独立的软件包可以做到这一点(我在谷歌上找不到)?不用说,我不想将整个
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
这在没有依赖性的情况下也可以实现

演示:

>>从独立的\u初始值设定项导入*
>>>类Foo(对象):
...     @将参数复制到公共字段
...     定义初始化(self,foo,bar=None,baz=1):
...         打印变量(自身)
... 
>>>傅(1,2)
{'foo':1,'bar':2}
>>>类Foo(对象):
...     @将参数复制到内部字段
...     定义初始化(self,foo,bar=None,baz=1):
...         打印变量(自身)
... 
>>>傅(1,2)
{“ufoo”:1,“ubar”:2}

那为什么不直接复制一下呢?
pinject
项目也对。Apache许可证到底有什么问题?谢谢Martijn-你质疑了我的假设。我不确定我能不能使用什么许可证;所以我在上面贴了一个这样的问题;)这样我就可以得到关于我是否是个白痴的反馈。实际上,我的项目已经使用了一些Apache许可库。它看起来对我的目的非常宽容,我真的可以利用它。我会接受你的答案,当我让它与我的代码工作!另一件事是。。。复制到字段似乎很常见。“当然已经存在了”顺便说一句,如果这只是
pinject
中的代码,那么它仍然包含在他们的许可证中,不管有人重新发布它。即使将其发布在SO上进行讨论可被视为不受许可限制的“合理使用”(或您所在司法管辖区内的同等内容),但并不意味着任何人在SO上看到该代码的所有使用都是不受许可限制的“合理使用”。SO的cc by sa许可证也没有推翻原始Apache许可证(除非Martijn Pieters是
pinject
的版权持有人,在这种情况下,通过在此处发布部分内容,他只是重新授权了该部分内容)。此处的代码功能是最小的,相同或类似的功能在此之前已在此处发布。如果你愿意,我可以从头重写,但结果看起来几乎一样。无论你是否重写,我都不会打扰我:-)如果提问者有一个严肃的理由想要避免项目的授权,那么,不管用自己的30行复制功能有多简单,复制粘贴30行源代码都是不可接受的。当然,除非,
pinject
自己从其他人那里剽窃了这些行,在这种情况下,他们不能要求版权或限制其使用的权利。综上所述,版权法是复杂的,最终归结到你的律师认为你可以逃脱的问题上……我的观点是,提问者不能希望通过要求某人逐字重发来“清洗”其许可证之外的开放源代码,所以:-)谢谢你们的反馈,伙计们@SteveJessop,事实证明Apache对于我来说是很好的,尽管我在问题中明确指出了它(好吧,对不起,我不是律师!),但很明显,这个约束已经引起了一些关于合理使用的有趣讨论。您的观点是正确的,但我想我将继续使用pinject代码的一部分=]
>>> 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>