2017-01-25 34 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中无法实现的。

相关问题