2013-05-13 60 views
15

我做了如下錯誤命名衝突:具有內置功能

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

但現在我想用內置的功能list()。如您所見,名稱list與內置函數list()之間存在命名衝突。

如何在不重新啓動Python shell的情況下使用list作爲內置函數而不是變量?

+2

很好的問題,每當有人使用內建名稱時,我們應該鏈接到這個 – jamylak 2013-05-13 13:55:01

+2

值得注意的是:可能最好的辦法是使用以下方法之一訪問內置版本,並重新綁定「list」名稱去解決你的錯誤。 'list = __builtins __。list' – 2013-05-13 14:00:38

回答

26

使用__builtins__.list__builtins__['__list__'](取決於上下文),或者簡單地再次刪除listdel list)。

否進口需要:

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

__builtins__存在是一個CPython的實現細節;在__main__模塊中它是一個模塊,其他地方都是模塊__dict__字典。 Jython,IronPython和PyPy可能會選擇不提供此功能。使用__builtin__ module這些平臺,或爲Python 3兼容的實現中,builtins module

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

Re:'__builtins __。list' - 不要這樣做。只因爲你可以不意味着你應該。 – FogleBird 2013-05-13 14:02:52

+1

@FogleBird鑑於OP給出的情況 - 解釋者的錯誤,我不認爲這樣做有什麼問題。很明顯,在用文件編寫的任何代碼中,情況都不一樣。 – 2013-07-21 10:10:30

+0

ipdb get「*** AttributeError:'dict'object has no attribute'list'」,I use'__builtings __ ['list']' – Pegasus 2017-09-27 15:18:12

2

使用__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 the builtins namespace should import the __builtin__ (no ‘s’) module and modify its attributes appropriately.

爲py3x:

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

不需要'import',AFAIK。 – 2013-05-13 13:53:31

+1

'__builtins__',而不是'__builtin__' – 2013-05-13 13:55:43

+1

@HenryKeiter:不,有一個['__builtin__'模塊](http://docs.python.org/2/library/__builtin__.html)。 – 2013-05-13 13:56:17

8

不要使用內置函數,或類型的變量名。它就這麼簡單,這個語言並不意味着這一點。這樣做沒有意義。

不僅如此 - 而且使用名稱「list」作爲列表非常含糊,我懷疑它甚至可以在任何實際代碼中遠程使用。


有幾個原因,你應該曾經陰影內置。其中一些更嚴重的如下:

  • 兼容性,該代碼將無法與其他模塊一起使用。
  • 混亂,任何讀你代碼的人都不會理解發生了什麼。
  • 環境中,許多內置插件使用其他內置插件,更改其中一個可能會在代碼的其他方面產生意想不到的結果。
+6

這並沒有回答這個問題--OP知道他所做的是錯誤的,但他正在使用shell並想修復這個錯誤。 – 2013-07-21 10:11:02

1

它總是可以作爲__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] 
+0

不要使用'__builtins__':http://docs.python.org/2/reference/executionmodel.html – 2013-05-13 14:15:46

28

第一步:重新綁定列表以不同的名稱

lst = list 

第二步:刪除list變量

del list 

第三步不要再幹


我寧願這些__builtins__.list,只是因爲它節省了打字,而且你是不是還留下了一個名爲list變量。但是,總是最好避免這個問題。在編寫產品代碼時,請始終記住而不是以使變量名稱與內置函數相同。

+1

這是一個很好的答案。除了您提到的優點之外,它不依賴CPython實現細節! – Adam 2013-05-13 14:07:29

+0

對不起,這是我書中的一個不好的答案。 -1。這絕對是一種可能性,但是它違背了我認爲的編碼的敏感性。這會導致您的代碼與其他Python無關,任何查看代碼片段的人都會感到困惑,並且與其他模塊無法正常工作。換句話說,這會不斷斷斷續續,並且非常脆弱。 – 2013-05-13 14:09:37

+9

@InbarRose這個問題特別適用於Python解釋器shell。使用*這些答案中提供的任何*黑客將在生產代碼中瘋狂*因此,我的意思是任何寫在現場解釋器外部的代碼。 – Adam 2013-05-13 14:11:59

0

是的,其他人在上面說過,不要使用內建名作爲變量名。這適用於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'> 
4

要修復的錯誤,還有另外一個選擇 - 如果我們記得內置的「功能」 list()實際上是一類,那麼我們就可以做到這一點:

list = type([]) 
相關問題