命名与内置函数的冲突
我犯了一个错误,如下所示:
>>> list = ['a', 'b', 'c']
但是现在我想使用内置的函数list()
。 如您所见,listname list
和内置函数list()
之间存在命名冲突。
如何在不重新启动Python shell的情况下将list
作为内置函数而不是variables?
使用__builtins__.list
或__builtins__['__list__']
(取决于上下文),或者再次删除list
( del 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
第二步 :删除list
variables
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名。 这是list
, dict
等
同样,正如其他人所说,您可以通过__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'>