导入functools后,我收到口译员发来的消息:
追踪(最近一次通话): 文件" C:/Users/Admin/Documents/Python/decorator.py" ;,第1行,在 导入functools 文件" C:\ Python3 \ lib \ functools.py",第22行,in 从类型导入MappingProxyType ImportError:无法导入名称' MappingProxyType'
import functools
def trace(func):
def inner(*args, **kwargs):
print(func.__name__, args, kwargs)
return func(*args, **kwargs)
functools.update_wrapper(inner, func)
return inner
@trace
def foo(x):
return x
foo(42)
使用PyCharm作为IDE,使用CPython作为解释器
答案 0 :(得分:25)
这不是一个真正的答案,而是一个评论。
首先:我无法验证所提出的问题:问题中的代码在我正在使用的标准python中完美运行。
第二:我偶然发现了这个问题,因为我有相同的错误信息,但可能是出于其他原因。我不小心将模块命名为“类型”。奇怪的是,python框架在从导入的系统模块中解析引用时选择了这个新的“类型”模块。这表明python的解析引用算法有点......嗯......有点非常简单的设计。
然而,如果读者收到此错误消息,请先检查您是否在代码中某处意外命名了“type”,作为解决问题的第一种方法,然后再检查该错误消息的其他原因。
更新: 这是Python中非常常见的现象。小心!每当您为模块提供一个已用于任何导入的Python模块的名称(并且您可能不知道这些名称!)时,您将有可能得到与问题中描述的错误类似的奇怪错误。
答案 1 :(得分:2)
已接受的解决方案迫使您重命名模块,但是:
在程序包中包含名为types
的模块没有任何问题,实际上,如果在当前目录或将PYTHONPATH
目录设置为目录的情况下运行解释器,则会出现此错误包含模块。
如果避免这种情况,则不必重命名模块。
如果使用IDE,请检查运行配置,以确保未将PYTHONPATH
或当前目录设置为包括您的模块。