Python模块中“list=list”的效果是什么?
我在Python标准库的这个文件里看到了以下代码:/usr/lib/python2.7/multiprocessing/dummy/__init__.py
:
list = list
dict = dict
这个写法是什么意思呢?我猜测是:“我们来检查一下dict
和list
是否存在”。
这只是古老时代留下来的代码吗?那个时候__builtins__
里没有list
和dict
吗?
我还有一个疯狂的猜测:为了提高查找速度,把list
从全局范围移到模块范围,这样做合理吗?不过如果我把这个猜测应用到多进程上,发现这个假设是错的。
1 个回答
30
导出。然后你可以这样做:
from multiprocessing.dummy import list
... 这实际上就是普通的 list
。
如果没有那一行代码,包 multiprocessing.dummy
中就不会有 list
这个东西。
这样做是为了让不同的包之间有统一的接口。比如说,所有的包都应该提供一个 list
类。包 a
选择提供一个自定义的实现,而包 b
则想使用 __builtins__
中的 list
。
powerful/__init__.py:
from powerfulinternals import PowerfulList as list
from simple.simpleinternals import Something as whoo
simple/__init__.py:
list = list
from simpleinternals import Something as whoo
application.py:
try:
import powerful as api
else:
import simple as api
mylist = api.list()
woot = api.whoo()
这样做还有更多原因。例如,可以明确你正在使用的是什么。
list = list
这也可以看作是一个声明:“如果你想改变我使用的列表类型,就在这里改。”
在这个特定的情况下,确实是前者。list
和 dict
被暴露为:
manager = multiprocessing.dummy.Manager()
l = manager.list()
d = manager.dict()
而 Manager
的定义是:
def Manager():
return sys.modules[__name__]
也就是说,Manager.list = list
。