非常小的包,可以自动保护可变函数参数,防止它们被修改。

immutable_default_args的Python项目详细描述


PyPI PackagePyPI Python VersionsPyPI Package LicenseCurrent build status for Travis CICurrent build status for AppVeyorCode Health

此模块提供了转换可变默认函数参数的工具。 变成不变的。它相当轻量级,没有非标准依赖项。 您可以使用标准的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一次修复所有方法classmethodsstaticmethods

使用装饰符:

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包的代码….永远。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JavaFX触控事件未触发Ubuntu 20.04触控笔记本电脑   java如何在AWT中关闭窗口?   java Dagger 2:注入具有构造函数参数的成员   创建对象的Java调用类   对象我想在A.java中添加两个数字,并在B.java中打印结果(如何?)   java如何使用AWS SDK for Android从数字海洋空间下载图像?   java Facebook sdk 4.0.1无法使用Android studio获取某些字段   4分钟后web应用程序(Angular 8和Rest API)中的java自动会话超时   在Eclipse for Java EE developers edition中禁用HTML警告   java按字母顺序排列字符串我错过了什么明显的东西吗?   java在Jshell中println和printf有什么不同