非常小的包,可以自动保护可变函数参数,防止它们被修改。
immutable_default_args的Python项目详细描述
此模块提供了转换可变默认函数参数的工具。 变成不变的。它相当轻量级,没有非标准依赖项。 您可以使用标准的pip命令安装此软件包:
$ pip install immutable_default_args
关于mutable argument default values的问题在python中非常有名。 基本上,可变的默认值在定义时间分配一次,然后可以 在函数体中被修改,这可能会让人吃惊。 下面是来自stackoverfow线程的示例:
def foo(a=[]): a.append(5) return a >>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] ...
防止这种行为的默认方法是使用None作为默认值 并在函数体中检查它,如下所示:
def foo(a=None): a = a if (type(a) is list) else [] a.append(5) return a >>> foo() [5] >>> foo() [5] ...
用法
此软件包旨在提供两个附加选项来解决此问题:
- 使用一个方便的函数装饰器@fix_mutable_kwargs修复某个函数。
- 使用元类ImmutableDefaultArguments一次修复所有方法,classmethods和staticmethods。
使用装饰符:
from immutable_default_args import fix_mutable_kwargs @fix_mutable_kwargs def foo(a=[]): a.append(5) return a >>> foo() [5] >>> foo() [5] ...
iterable是否为空并不重要:
@fix_mutable_kwargs def foo(a=[1, 2, {'key': 'value'}, 3, 4]): a.append(5) return a >>> foo() [1, 2, {'key': 'value'}, 3, 4, 5] >>> foo() [1, 2, {'key': 'value'}, 3, 4, 5] ...
通过对象修复所有对象的所有可变默认值 ImmutableDefaultArguments元类:
class Foo(object): __metaclass__ = ImmutableDefaultArguments # Py2 syntax def foo(self, a=[]): a.append(5) return a @classmethod # staticmethods work as well def foo_classmethod(cls, a=[]): a.append(5) return a instance_of_foo = Foo() >>> instance_of_foo.foo() [5] >>> instance_of_foo.foo() [5] ... >>> Foo.foo_classmethod() [5] >>> Foo.foo_classmethod() [5]
兼容性
immutable_default_args包是根据py2/3测试的,并且受支持 来自上游的py2.7。
更改日志
0.0.8(2016年5月8日)
- 加上.landscape.yml和badges还有更多爵士乐。
0.0.7(2016年5月8日)
- 加上ci和徽章以及所有爵士乐。
0.0.5(2016年5月8日)
- 固定文档
0.0.2(2016年5月8日)
- 添加了@fix_mutable_kwargsdecorator
- 重构/清理
0.0.1(2016年5月8日)
- 第一次释放。仅包含ImmutableDefaultArguments元类
许可证
你可以随心所欲地使用代码。请注意我不是 对执行 来自immutable_default_args包的代码….永远。