使用 getattr() 访问内置函数

问题描述 投票:0回答:1

我想使用

getattr()
来访问Python的内置函数。这可能吗?

例如:

getattr(???, 'abs')

我知道我可以简单地做:

>>> abs
<built-in function abs>

但是我想使用

getattr
,因为关键字名称是字符串。

python python-3.x keyword built-in getattr
1个回答
19
投票

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
命名空间 实际上是通过在其全局中查找名称
__builtins__
找到的 命名空间;这应该是一个字典或一个模块(在后一种情况下 使用模块的字典)。默认情况下,当在 main 中时 模块,
__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 关键字存储为该模块中的方法。

所有关键字都显示在文档的第

上。

© www.soinside.com 2019 - 2024. All rights reserved.