覆盖Python

时间:2015-04-22 13:09:03

标签: python keyword

如果我无意中覆盖/屏蔽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, ...)

2 个答案:

答案 0 :(得分:3)

您不会在此处覆盖内置min,只需创建一个min本地,如果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 :< / p>

min

要在整个模块中隐藏min = "3.4.4" # Now all calls of min will go to that string class MyCompileTool(object): pass ,请在全局命名空间中执行此操作:

user=> (make-new '(1 2 (3 4)))
IllegalArgumentException Don't know how to create ISeq from: java.lang.Long 
   clojure.lang.RT.seqFrom (RT.java:505)   

有关如何在Python中解析名称的更多信息,请查看文档:{​​{3}}

答案 1 :(得分:0)

在这种特殊情况下,可能/将会出现多大问题。您只是在方法中使用局部变量隐藏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)

总的来说,这是一种不好的做法。不要这样做。