在python内置函数上应用`getattr()`

Phy*_*her 0 python keyword built-in getattr python-3.x

我想申请getattr()python内置函数,可以吗?(参考

例如:

getattr(???, 'abs')
Run Code Online (Sandbox Code Playgroud)

我知道我可以简单地做:

>>> abs
<built-in function abs>
Run Code Online (Sandbox Code Playgroud)

但我想使用getattr,因为关键字名称是字符串。

U10*_*ard 9

builtins模块:

您可以尝试导入builtins模块:

>>> import builtins
>>> getattr(builtins, 'abs')
<built-in function abs>
>>> 
Run Code Online (Sandbox Code Playgroud)

文档中所述:

该模块提供对 Python 的所有“内置”标识符的直接访问;例如,builtins.open是内置函数的全名open()。有关文档,请参阅内置函数和内置常量。

所以上面提到的builtins.open就是open函数。所以abs是一样的builtins.abs是一样的东西abs。但对于gettatrgetattr(builtins, 'abs')也一样builtins.abs

原版__bultins__(不推荐):

你可以尝试从__builtins__

>>> getattr(__builtins__, 'abs')
<built-in function abs>
>>> 
Run Code Online (Sandbox Code Playgroud)

文档中所述:

CPython 实现细节:用户不应触摸__builtins__;它严格来说是一个实现细节。想要覆盖builtins命名空间中的值的用户应该import使用builtins模块并适当地修改其属性。

builtins与代码块执行相关的命名空间实际上是通过__builtins__在其全局命名空间中查找名称来找到的;这应该是字典或模块(在后一种情况下使用模块的字典)。默认情况下,当在 模块中时,__builtins__是内置模块builtins;在任何其他模块中时,__builtins__builtins模块本身字典的别名 。

如您所见,不推荐使用,通常__builtins__也是 a dict,而不是模块。

如果您在模块编写代码,__builtins__将返回的字典别名builtins模块,这将使类似:{..., 'abs': <built-in function abs>, ...}

更多关于getattr

只是为了有更多的想法getattr,如文档中所述:

返回object的命名属性的。name 必须是字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,getattr(x, 'foobar')相当于x.foobar。如果命名属性不存在,则如果提供则返回默认值,否则AttributeError引发。

所以:

>>> import builtins
>>> getattr(builtins, 'abs')
<built-in function abs>
>>> 
Run Code Online (Sandbox Code Playgroud)

是相同的:

>>> import builtins
>>> builtins.abs
<built-in function abs>
>>> 
Run Code Online (Sandbox Code Playgroud)

所以你可能想知道,因为:

>>> abs
<built-in function abs>
Run Code Online (Sandbox Code Playgroud)

给出同样的东西,为什么我们不能只做:

getattr(abs)
Run Code Online (Sandbox Code Playgroud)

我们不能这样做的原因是,这getattr是假设来调用方法/功能/班一类/模块。

使用getattr(builtins, 'abs')works的原因是因为它builtins是一个模块并且abs是一个类/方法,它将所有内置的Python关键字存储为该模块中的方法。

所有关键字都显示在文档的此页面上。