安全地向 Python 方法添加成员的规则是什么?

Cor*_*ica 1 python attributes function dynamic

我正在查看这样的代码:

def foo():
    return 42

foo.x = 5
Run Code Online (Sandbox Code Playgroud)

这显然向名为 的函数对象添加了一个成员foo。我发现这非常有用,因为它使这些函数对象看起来与带有函数的对象非常相似__call__。

是否有我必须遵守的规则以确保我不会在 Python 的未来更新中引起问题,例如我必须避免的名称?也许有一个 PEP 或文档部分提到了规则?

Mar*_*ers 6

除了考虑保留的标识符类别外,没有其他规则。具体来说,尽量避免使用dunder名称:

系统定义的名称,非正式地称为“dunder”名称。[...] 任何使用的__*__名称,在任何情况下,不遵循明确记载的使用,如有破损不会发出警告。

除此之外,接受任意属性的函数没有什么特别之处。如果有放置它们的地方(几乎总是一个__dict__属性),Python 中的几乎任何东西都接受任意属性。

在 Python 标准库中,函数属性用于将装饰器包装函数链接到原始包装函数(通过functools.update_wrapper()函数及其附带的@functools.wraps()装饰器函数),并在由装饰器扩充时将状态和方法附加到函数(例如该singledispatch()装饰增加了几个方法和注册表来装饰功能)。