Python 与内置函数的命名冲突
我犯了如下错误:Python 与内置函数的命名冲突,python,list,built-in,Python,List,Built In,我犯了如下错误: >>> list = ['a', 'b', 'c'] 但是现在我想使用内置函数list()。如您所见,listnamelist和内置函数list()之间存在命名冲突 如何在不重新启动Python shell的情况下将list用作内置函数而不是变量?在py2x中使用\uuuuuuuuuuuuuuuuuuuuuuu.list: >>> import __builtin__ >>> __builtin__.list <t
>>> list = ['a', 'b', 'c']
但是现在我想使用内置函数list()
。如您所见,listnamelist
和内置函数list()
之间存在命名冲突
如何在不重新启动Python shell的情况下将
list
用作内置函数而不是变量?在py2x中使用\uuuuuuuuuuuuuuuuuuuuuuu.list
:
>>> import __builtin__
>>> __builtin__.list
<type 'list'>
使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
无需进口:
>>> __builtins__.list
<type 'list'>
不要使用内置函数或类型作为变量名。就这么简单,语言并不是为了这个。这样做毫无意义
不仅如此,使用“list”这个名称作为列表是非常模糊的,我怀疑它在任何真正的代码中都是远程可用的
有几个原因可以说明为什么你不应该给一个内置的影子投下阴影。以下是一些更严重的问题:
- 兼容性,代码将无法与其他模块一起工作
- 混乱,任何阅读您的代码的人都不会理解发生了什么
- 在这种情况下,许多内置程序使用其他内置程序,更改一个内置程序可能会在代码的其他方面产生意外的结果
它始终作为\uuuuuu内置项\uuuuuuuu.列表提供
:
>>> __builtins__.list
<class 'list'>
>>> list = [1, 2, 3]
>>> __builtins__.list
<class 'list'>
第一步:将列表重新绑定到其他名称
lst = list
步骤二:删除列表
变量
del list
第三步:不要再做了
我更喜欢这个而不是\uuuuu内置的.list
,原因很简单,因为它保存了键入的内容,而且您还没有留下名为list
的变量。然而,最好是完全避免这个问题。在编写生产代码时,请始终记住不要将变量命名为与内置函数相同的名称。是的,上面有人说,不要将内置函数的名称用作变量名称。这适用于列表
,目录
,等等
同样,正如其他人所说,您可以通过\uuuu内置\uuuuu.list
访问类型列表。因此,如果您需要调用列表
,您仍然可以找到它,只要您还没有反弹\uuuuuu内置\uuuuuuu.list
重要的是,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'>
>>\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
>>>名单
>>>列表=[1,2,3]
>>>名单
[1, 2, 3]
>>>弗雷德=名单
>>>弗雷德
[1, 2, 3]
>>>列表=\uuuu内置\uuuuu.list
>>>名单
要修复错误,还有另一个选项-如果我们记得内置的“函数”list()
实际上是一个类,那么我们可以这样做:
list = type([])
不需要导入
,好吧。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。不管怎样,这段代码都不能像写的那样工作;它需要import\uuuuu builtin\uuuuuu
或\uuuuu builtins\uuuuuuu.list
。好问题,每当人们使用内置名称时,我们都应该链接到这个链接。值得注意的是:您最好使用以下方法之一访问内置版本,并将列表
名称重新绑定到它,以撤销错误<代码>列表=\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。“仅仅因为你能,并不意味着你应该。”福格伯德说,鉴于OP给出的情况——口译员犯了一个错误,我认为这样做没有什么错。显然,在任何写在文件中的代码中,情况都不同。这是一个很好的答案。除了您提到的优点外,它不依赖于CPython实现细节!对不起,这在我的书里是个错误的答案-1.这肯定是一种可能性,但这与我认为的编码敏感性背道而驰。这导致您的代码到处都与其他Python脱节,任何查看代码段的人都会感到困惑,并且无法与其他模块很好地协同工作。换言之,这将不断中断,并且非常脆弱。@InbarRose中的问题特别适用于Python解释器外壳。在生产代码中使用这些答案中提供的任何黑客都是疯狂的,我指的是在实时解释器之外编写的任何代码。如果不重新启动Python shell,如何将list用作内置函数而不是list变量?
@InbarRose-这可能是在shell中键入的最简单方法,还记得先提到将现有变量重新绑定到其他变量。。。(不仅仅是把列表
拿回来)@InbarRose你似乎没有考虑到问题的背景。不要使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
:这并不能回答问题-OP,但是他正在使用shell并希望修复错误。那么,当您覆盖类型时,您会怎么做?因为这正是我的情况:我有一个带有type
属性的类,我需要解决\uuuu init\uuuu
中的歧义,同时仍然允许调用方调用,例如事务(type=Transaction.T\u SINGLE)
。我不能使用不同的名称,如\u type
,因为我正在实现一个API,type
,作为\uuuuuu init\uuuu
的函数参数,是面向用户的。您可能认为删除函数中的类型
会像在全局范围中一样有效,但它会导致python在一个表面上错误的UnboundLocalError
上崩溃。因此,我最后做的是在名为\u typeof
的类中进行“备份”。我使用了名称\u typeof
,因此很明显,其目的是类型检查(alajavascript);联合国
del list
>>> __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'>
list = type([])