gpt4 book ai didi

python - 如何将 [] 与自定义 __builtin__ 列表一起使用?

转载 作者:行者123 更新时间:2023-11-28 17:20:29 24 4
gpt4 key购买 nike

我正在尝试了解 __builtin__ 在 Python 中的工作原理。我的代码如下:

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 类型?

最佳答案

如果您使用 dis 模块检查 CPython 解释器如何处理 [],您会看到它生成了 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 都会在 __builtin__ 伪模块中搜索 list 构造函数,那将是慢得多,所以这种行为可以被认为是一种优化。

所以你的要求在 vanilla CPython 中是无法实现的。

关于python - 如何将 [] 与自定义 __builtin__ 列表一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41863850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com