簡體   English   中英

覆蓋Python中的內置函數

[英]Overwriting built-in function in 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,...)

你不要在這里覆蓋builtin min ,你只需要創建一個min local,如果后續的compile代碼包含對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 ,請在全局命名空間中執行此操作:

min = "3.4.4"
# Now all calls of min will go to that string

class MyCompileTool(object):
     pass

有關如何在Python中解析名稱的更多信息,請查看文檔: 4.1。 命名和綁定

在這種特殊情況下,可能/將會出現的問題並不多。 你只是在你的方法中用局部變量遮蔽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
>>>

這可能會讓您感到困惑,或者(甚至更糟)可能會讓以后需要進入並支持您的代碼的人感到困惑。 如果你在全球范圍內做到這一點會更糟糕,例如:

min = "3.4.4"

def main():
    x = min(3, 4, 5)

總的來說,這是不好的做法。 不要這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM