我做了如下錯誤命名衝突:具有內置功能
>>> list = ['a', 'b', 'c']
但現在我想用內置的功能list()
。如您所見,名稱list
與內置函數list()
之間存在命名衝突。
如何在不重新啓動Python shell的情況下使用list
作爲內置函數而不是變量?
我做了如下錯誤命名衝突:具有內置功能
>>> list = ['a', 'b', 'c']
但現在我想用內置的功能list()
。如您所見,名稱list
與內置函數list()
之間存在命名衝突。
如何在不重新啓動Python shell的情況下使用list
作爲內置函數而不是變量?
使用__builtins__.list
或__builtins__['__list__']
(取決於上下文),或者簡單地再次刪除list
(del list
)。
否進口需要:
>>> __builtins__.list
<type 'list'>
的__builtins__
存在是一個CPython的實現細節;在__main__
模塊中它是一個模塊,其他地方都是模塊__dict__
字典。 Jython,IronPython和PyPy可能會選擇不提供此功能。使用__builtin__
module這些平臺,或爲Python 3兼容的實現中,builtins
module:
>>> import __builtin__
>>> __builtin__.list
<type 'list'>
Re:'__builtins __。list' - 不要這樣做。只因爲你可以不意味着你應該。 – FogleBird 2013-05-13 14:02:52
@FogleBird鑑於OP給出的情況 - 解釋者的錯誤,我不認爲這樣做有什麼問題。很明顯,在用文件編寫的任何代碼中,情況都不一樣。 – 2013-07-21 10:10:30
ipdb get「*** AttributeError:'dict'object has no attribute'list'」,I use'__builtings __ ['list']' – Pegasus 2017-09-27 15:18:12
使用__builtin__.list
在py2x:
>>> import __builtin__
>>> __builtin__.list
<type 'list'>
不要使用__builtins__.list
:
從docs:
CPython implementation detail: Users should not touch
__builtins__
; it is strictly an implementation detail. Users wanting to override values in thebuiltins
namespace should import the__builtin__
(no ‘s’) module and modify its attributes appropriately.
爲py3x:
>>> import builtins
>>> builtins.list
<class 'list'>
不需要'import',AFAIK。 – 2013-05-13 13:53:31
'__builtins__',而不是'__builtin__' – 2013-05-13 13:55:43
@HenryKeiter:不,有一個['__builtin__'模塊](http://docs.python.org/2/library/__builtin__.html)。 – 2013-05-13 13:56:17
不要使用內置函數,或類型的變量名。它就這麼簡單,這個語言並不意味着這一點。這樣做沒有意義。
不僅如此 - 而且使用名稱「list」作爲列表非常含糊,我懷疑它甚至可以在任何實際代碼中遠程使用。
有幾個原因,你應該不曾經陰影內置。其中一些更嚴重的如下:
這並沒有回答這個問題--OP知道他所做的是錯誤的,但他正在使用shell並想修復這個錯誤。 – 2013-07-21 10:11:02
它總是可以作爲__builtins__.list
:
>>> __builtins__.list
<class 'list'>
>>> list = [1, 2, 3]
>>> __builtins__.list
<class 'list'>
如果你碰巧重新綁定是,但是,你出的選項。
您還可以使用模塊__builtin__
(或builtins
,在Python 3中不帶下劃線),但是您必須導入它。但這些不同的方式來拼寫同樣的事情,而不是多了一種選擇 - 修改一個既影響:
>>> import builtins
>>> builtins.list
<class 'list'>
>>> builtins.list = [1, 2, 3]
>>> builtins.list
[1, 2, 3]
>>> __builtins__.list
[1, 2, 3]
不要使用'__builtins__':http://docs.python.org/2/reference/executionmodel.html – 2013-05-13 14:15:46
第一步:重新綁定列表以不同的名稱
lst = list
第二步:刪除list
變量
del list
第三步:不要再幹
我寧願這些__builtins__.list
,只是因爲它節省了打字,而且你是不是還留下了一個名爲list
變量。但是,總是最好避免這個問題。在編寫產品代碼時,請始終記住而不是以使變量名稱與內置函數相同。
這是一個很好的答案。除了您提到的優點之外,它不依賴CPython實現細節! – Adam 2013-05-13 14:07:29
對不起,這是我書中的一個不好的答案。 -1。這絕對是一種可能性,但是它違背了我認爲的編碼的敏感性。這會導致您的代碼與其他Python無關,任何查看代碼片段的人都會感到困惑,並且與其他模塊無法正常工作。換句話說,這會不斷斷斷續續,並且非常脆弱。 – 2013-05-13 14:09:37
@InbarRose這個問題特別適用於Python解釋器shell。使用*這些答案中提供的任何*黑客將在生產代碼中瘋狂*因此,我的意思是任何寫在現場解釋器外部的代碼。 – Adam 2013-05-13 14:11:59
是的,其他人在上面說過,不要使用內建名作爲變量名。這適用於list
,dict
等。
同樣,正如其他人所說的,您可以通過__builtins__.list
訪問類型list
。所以如果你需要撥打list
,你仍然可以找到它,只要你還沒有反彈__builtins__.list
也。
重要的是,list
是一個名字。您已將它重新映射到列表的一個實例。如果您想要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'>
要修復的錯誤,還有另外一個選擇 - 如果我們記得內置的「功能」 list()
實際上是一類,那麼我們就可以做到這一點:
list = type([])
很好的問題,每當有人使用內建名稱時,我們應該鏈接到這個 – jamylak 2013-05-13 13:55:01
值得注意的是:可能最好的辦法是使用以下方法之一訪問內置版本,並重新綁定「list」名稱去解決你的錯誤。 'list = __builtins __。list' – 2013-05-13 14:00:38