python内置方法是否在其他命名空间中可用?
请问Python的内置方法在某个包里可以找到吗?
让我来解释一下。在我刚开始学习Python的时候,我做了一个类似于下面的Django模型:
class MyModel(models.Model):
first_name = models.CharField(max_length=100, null=True, blank=True)
last_name = models.CharField(max_length=100, null=True, blank=True)
property = models.ForeignKey("Property")
后来我需要给这个模型添加一个属性。现在我的模型变成了这样:
class MyModel(models.Model):
first_name = models.CharField(max_length=100, null=True, blank=True)
last_name = models.CharField(max_length=100, null=True, blank=True)
property = models.ForeignKey("Property")
@property
def name(self):
return "{} {}".format(first_name, last_name)
结果在运行时我遇到了一个错误:TypeError: 'ForeignKey' object is not callable
。这个错误发生的原因是,属性的ForeignKey替代了Python内置的属性标识符。我希望能做到的是,不用@property
,而是用@sys.property
(或者类似的东西)。
注意:我已经知道可以通过把属性名称放在属性字段声明之前来解决这个问题。我并不太关心这个具体的情况,更想知道的是有没有其他地方可以引用Python的内置方法。
2 个回答
Python 有一个叫做 builtins
的模块,这里存放着一些“真正全球”的东西,通常就是 标准的内置函数和类型。在 Python 2 中,这个模块叫做 __builtin__
,但大体上功能是一样的。
你可以像使用其他模块一样导入这个模块,但它还有一个神奇的功能,就是为每个其他模块提供内置名称(前提是这些模块没有隐藏它们)。
如果你想知道这是怎么回事,builtins
的文档中提到:
作为一个实现细节,大多数模块都有一个名为
__builtins__
的变量,它是它们全局变量的一部分。__builtins__
的值通常是这个模块本身,或者是这个模块的__dict__
属性的值。由于这是一个实现细节,其他 Python 实现可能不会使用它。
而 exec
的说明中说:
如果 globals 字典中没有
__builtins__
这个键的值,就会在这个键下插入对内置模块builtins
字典的引用。这样,你可以通过在传递给exec()
之前,将自己的__builtins__
字典插入到 globals 中,来控制执行代码时可用的内置函数。
所以,至少在 CPython 中,当你调用 abs
函数时,它会先在 globals()['abs']
中查找,如果找不到,就会在 globals()['__builtins__'].__dict__['abs']
中查找。
每当 Python(或者至少是 CPython)创建一个新的模块对象时,它的代码会在一个 globals
中执行,这个 globals
的 __builtins__
是空的,这意味着默认的 builtins
模块的值会被填充进去,所以这样就能正常工作。而这个 globals
会被复制到模块中定义的每个函数和类中(以及你在没有显式替换 __builtins__
的情况下对 globals
所做的任何操作),所以在函数和类内部也能正常使用。
如果你在用Python 3,可以使用builtins
这个模块;如果你在用Python 2,就用__builtin__
。
def open():
pass
import __builtin__
print open
print __builtin__.open
这样你就能得到:
<function open at 0x011E8670>
<built-in function open>