2017-01-25 56 views
3

我想了解__builtin__如何在Python中工作。我的代碼如下:如何將[]與自定義__builtin__列表一起使用?

import __builtin__ 

class MyList(list): 
    pass 

__builtin__.list = MyList 

a = [1,2,3,4,5] 
b = list([1,2,3,4,5]) 

print 'A: ', type(a) 
print 'B: ', type(b) 

當我打印類型兩個列表的,我得到:

A: <type 'list'> 
B: <class '__main__.MyList'> 

爲什麼不MyList型的兩份名單,我怎麼能做到這一點[]語法也將是MyList

+0

因爲'[]'是一個文字。 –

+0

@martineau我很快就讀到了這個問題,並且被誤解了。 OP正在詢問是否重寫字面語法。 –

+0

所以,你可能會破解語法樹來實現這個目標,但是這聽起來像是很少的獎勵。 –

回答

2

如果檢查有[]由CPython的interprerter與dis模塊處理,你會看到它產生BUILD_LIST指令:

>>> def x(): 
...  x = [1,2] 
... 
>>> dis.dis(x) 
    2   0 LOAD_CONST    1 (1) 
       3 LOAD_CONST    2 (2) 
       6 BUILD_LIST    2 
       9 STORE_FAST    0 (x) 
      12 LOAD_CONST    0 (None) 
      15 RETURN_VALUE 

相應的指令觸發直接調用C函數PyList_New(它ceval被處理.C):

2202  case BUILD_LIST: 
2203   x = PyList_New(oparg); 

我認爲,如果CPython中會搜索list構造在每次__builtin__僞模塊[]在源代碼中使用,它會慢得多,所以這種行爲可以被認爲是一種優化。

所以你問的是在香草CPython中無法實現的。

相關問題