getattr()
来访问Python的内置函数。这可能吗?
例如:
getattr(???, 'abs')
我知道我可以简单地做:
>>> abs
<built-in function abs>
但是我想使用
getattr
,因为关键字名称是字符串。
builtins
模块:您可以尝试导入
builtins
模块:
>>> import builtins
>>> getattr(builtins, 'abs')
<built-in function abs>
>>>
如文档中所述:
该模块提供对Python所有“内置”标识符的直接访问;例如,
是内置函数builtins.open
的全名。请参阅内置函数和内置常量以获取文档。open()
所以上面提到
builtins.open
就是open
函数。所以 abs
是相同的 builtins.abs
与 abs
是相同的。但对于 gettatr
,getattr(builtins, 'abs')
也与 builtins.abs
相同。
__builtins__
(不推荐):您可以尝试从
__builtins__
获取:
>>> getattr(__builtins__, 'abs')
<built-in function abs>
>>>
如文档中所述:
CPython 实现细节: 用户不应触摸
;它 严格来说是一个实施细节。想要覆盖值的用户 在__builtins__
命名空间中应该builtins
import
模块并修改 它的属性适当。builtins
与代码块的执行关联的
命名空间 实际上是通过在其全局中查找名称builtins
找到的 命名空间;这应该是一个字典或一个模块(在后一种情况下 使用模块的字典)。默认情况下,当在 main 中时 模块,__builtins__
为内置模块__builtins__
;当在任何 其他模块,builtins
是字典的别名__builtins__
模块本身。builtins
如您所见,不推荐这样做,而且通常
__builtins__
是 dict
,而不是模块。
如果您在模块中编写代码,
__builtins__
将返回builtins
模块的字典别名,这将给出类似:{..., 'abs': <built-in function abs>, ...}
。
getattr
:只是为了更多地了解
getattr
,如 文档中所述:
返回object的命名属性的值。名称必须是字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,
相当于getattr(x, 'foobar')
。如果指定的属性不存在,则返回默认值(如果提供),否则会引发x.foobar
。AttributeError
所以:
>>> import builtins
>>> getattr(builtins, 'abs')
<built-in function abs>
>>>
等同于:
>>> import builtins
>>> builtins.abs
<built-in function abs>
>>>
所以你可能想知道:
>>> abs
<built-in function abs>
给出同样的事情,为什么我们不能这样做:
getattr(abs)
我们不能这样做的原因是
getattr
应该调用类/模块的方法/函数/类。
使用 getattr(builtins, 'abs')
有效的原因是因为
builtins
是一个模块,而
abs
是一个类/方法,它将所有内置的 Python 关键字存储为该模块中的方法。所有关键字都显示在文档的第
页上。