命名与内置函数的冲突

我犯了一个错误,如下所示:

>>> list = ['a', 'b', 'c'] 

但是现在我想使用内置的函数list() 。 如您所见,listname list和内置函数list()之间存在命名冲突。

如何在不重新启动Python shell的情况下将list作为内置函数而不是variables?

使用__builtins__.list__builtins__['__list__'] (取决于上下文),或者再次删除listdel list )。

不需要import:

 >>> __builtins__.list <type 'list'> 

__builtins__的存在是一个CPython实现细节; 在__main__模块中,它是一个模块,其他地方都是模块__dict__字典。 Jython,IronPython和PyPy可能会select不提供此function。 对于这些平台使用__builtin__模块 ,或者对于Python 3兼容的实现,使用builtins模块 :

 >>> import __builtin__ >>> __builtin__.list <type 'list'> 

第一步 :重新将列表重新命名为不同的名称

 lst = list 

第二步 :删除listvariables

 del list 

第三步不要再做了


我更喜欢__builtins__.list因为它保存了input,而且你还没有留下名为list的variables。 但是,总是最好避免这个问题。 在编写生产代码时,一定要记住不要将variables命名为与内置函数相同的variables。

不要使用内置函数或types作为variables名称。 它就这么简单,语言不是为了那个。 这样做没有意义。

不仅如此,而且使用名单“list”作为列表是非常模糊的,我怀疑它在任何实际的代码中都是远程可用的。


有几个原因可能导致你不应该隐藏内置的。 一些更严重的是:

  • 兼容性,代码不会与其他模块一起工作。
  • 混乱,任何人读你的代码将不知道发生了什么。
  • 情况下,许多内置插件使用其他内置插件,更改一个可能会在代码的其他方面有意想不到的结果。

要修复这个错误,还有另外一个select – 如果我们记得内置的“function” list()实际上是一个类,那么我们可以这样做:

 list = type([]) 

在py2x中使用__builtin__.list

 >>> import __builtin__ >>> __builtin__.list <type 'list'> 

不要使用__builtins__.list

从文档 :

CPython实现细节:用户不应该触摸__builtins__ ; 这是严格的实施细节。 想要覆盖builtins命名空间中的值的用户应该导入__builtin__ (no's')模块并适当修改其属性。

对于py3x:

 >>> import builtins >>> builtins.list <class 'list'> 

它始终可用__builtins__.list

 >>> __builtins__.list <class 'list'> >>> list = [1, 2, 3] >>> __builtins__.list <class 'list'> 

如果你碰巧重新绑定,那么你就没有select了。

您也可以使用模块__builtin__ (或者在Python 3中builtins ,不带下划线),但是您必须导入它。 但是这些拼写相同的东西的方法是不同的,而不是一个额外的选项 – 修改一个影响两个:

 >>> import builtins >>> builtins.list <class 'list'> >>> builtins.list = [1, 2, 3] >>> builtins.list [1, 2, 3] >>> __builtins__.list [1, 2, 3] 

是的,其他人在上面说过,不要用内build的名字作为variables名。 这是listdict

同样,正如其他人所说,您可以通过__builtins__.list访问types__builtins__.list 。 所以,如果你需要打电话给list ,你仍然可以find它,只要你还没有反弹__builtins__.list也。

重要的是, list是一个名字。 你已经把它反弹到一个列表的实例。 如果你想list再次意味着<type 'list'> type'list <type 'list'> ,只需重新绑定它。 在Python 2.7中:

 >>> __builtins__.list <type 'list'> >>> list <type 'list'> >>> list = [1, 2, 3] >>> list [1, 2, 3] >>> fred = list >>> fred [1, 2, 3] >>> list = __builtins__.list >>> list <type 'list'>