在Python中覆盖内置函数

2024-10-01 07:31:51 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我无意中重写/屏蔽Python中的内置函数,可能会出什么问题?在

我能体验到比访问本地函数而不是内置函数的明显陷阱更糟糕的事情吗?在

例如:

def max(a, b):
  pass

class MyCompileTool(object):
    def __init__(self, id):
        self.id = id

    def compile(self):
        min = "3.4.4"
        ...

甚至在一些官方模块中:argparse.add_argument(..., type, ...)


Tags: 函数selfidobjectinitdefpass事情
2条回答

在这种特殊情况下,可能不会出什么问题。您只是在方法中使用一个局部变量来跟踪min,所以您可能不会造成太大的损害。一般来说,你可以看到这样的情况:

>>> min = "3.4.4"
>>> x = min(3, 4, 5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
>>>

这可能会使您感到困惑,或者(更糟的是)它可能会使那些稍后必须进入并支持您的代码的人感到困惑。如果你在全球范围内这样做,情况会更糟,比如:

^{pr2}$

总的来说,这是不好的做法。别这么做。在

您不必重写min这里,您只需创建一个min本地,如果{}的后续代码将包含对min的调用,则首选该方法:

class MyCompileTool(object):
    ...

    def compile(self):
        min = "3.4.4"
        x = min(1, 2)
        #   ^^^ "3.4.4".__call__(1, 2)
        #   This will throw exception because strings doesn't have __call__
x = min(3, 4)
#   ^^^ __builtins__.min

要在整个模块中隐藏min,请在全局命名空间中执行此操作:

^{pr2}$

有关如何在Python中解析名称的详细信息,请查看文档:4.1. Naming and binding

相关问题 更多 >