3

有这个代码:

def f():
  pass

print("f: ", dir(f))
print("len: ", dir(len))

输出:

f:  ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
len:  ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

为什么函数f和函数len有不同的属性?我知道这len是内置函数,但是为什么它们没有相同的属性?

4

1 回答 1

9

因为 C 定义的函数是一种不同的类型,并且只有用户定义的函数才支持某些功能,例如添加属性或嵌套函数定义以及引用作用域名称。

看看用户定义函数为您提供的额外属性:

>>> sorted(set(dir(f)) - set(dir(len)))
['__annotations__', '__closure__', '__code__', '__defaults__', '__dict__', '__get__', '__globals__', '__kwdefaults__']

例如,C 定义的函数永远不会有闭包或全局变量,也不会有字节码。逐一破解:

  • __annotations__:添加到函数定义中的注释;您只能使用用户定义的函数来执行此操作,因为这是 Python 语法功能。
  • __closure__:从范围闭包中获取的单元格列表;C 定义的函数不能在另一个函数内部定义,因此这些函数没有闭包。
  • __code__: Python 字节码对象;C 定义的函数没有。
  • __defaults__:C 定义的函数可能具有默认值(关键字),但它们未定义为您可以自省的 Python 值。
  • __dict__:C 定义的函数不能在其上设置任意属性,而用户定义的函数可以。
  • __get__:这使用户定义的函数成为描述符,使它们作为类中的方法工作。大多数 C 函数不需要这个。
  • __globals__:用户自定义函数在模块中定义;this 指向全局命名空间。C 定义的函数没有可指向的 python 模块命名空间。
  • __kwdefaults__: 像__defaults__但是对于仅关键字参数,作为字典;同样只有 Python 函数可以拥有这些。
于 2013-05-28T18:18:39.217 回答