Python 内置函数和用户定义函数的不同属性

Python 内置函数和用户定义函数的不同属性,python,Python,有以下代码: 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__',

有以下代码:

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
是内置函数,但为什么它们没有相同的属性?

因为C定义的函数是不同的类型,只有用户定义的函数支持某些功能,比如添加属性或嵌套函数定义以及引用范围名称

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

>>> sorted(set(dir(f)) - set(dir(len)))
['__annotations__', '__closure__', '__code__', '__defaults__', '__dict__', '__get__', '__globals__', '__kwdefaults__']
例如,C定义的函数永远不会有闭包或全局变量,也不会有字节码。把每一个分开:

  • \uuuuuuuuuuuuuuuuuuuuuuuuuuu注释:添加到函数定义中的注释;您只能使用用户定义的函数来实现这一点,因为这是Python的语法特性
  • \uuuu closure\uuuu
    :从作用域闭包中获取的单元格列表;C定义的函数不能在另一个函数中定义,因此这些函数没有闭包
  • \uuuu code\uuuu
    :Python字节码对象;C定义的函数没有这个功能
  • \uuuu默认值\uuuu
    :C定义的函数可能有默认值(关键字),但它们没有定义为可以内省的Python值
  • \uuuu dict\uuuu
    :C定义函数不能设置任意属性,而用户定义函数可以
  • \uuuu get\uuuu
    :这使得用户定义的函数成为描述符,使它们作为类中的方法工作。大多数C函数不需要这个
  • \uuuuu globals\uuuuuu
    :用户定义的函数在模块中定义;这指向全局名称空间。C定义的函数没有可指向的python模块命名空间
  • \uuuu kwdefaults\uuuuu
    :类似于
    \uuuu defaults\uuuuuu
    ,但仅用于关键字参数,作为一个dict;同样,只有Python函数可以有这些

@thegrinner:是的,那里有一段时间有些奇怪。