python内置方法是否在其他命名空间中可用?

6 投票
2 回答
2312 浏览
提问于 2025-04-16 09:25

请问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 个回答

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 所做的任何操作),所以在函数和类内部也能正常使用。

14

如果你在用Python 3,可以使用builtins这个模块;如果你在用Python 2,就用__builtin__

def open():
    pass

import __builtin__

print open
print __builtin__.open

这样你就能得到:

<function open at 0x011E8670>
<built-in function open>

撰写回答