无法导入名称' MappingProxyType'导入functools

时间:2017-04-17 14:26:35

标签: python import functools

导入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作为解释器

2 个答案:

答案 0 :(得分:25)

这不是一个真正的答案,而是一个评论。

首先:我无法验证所提出的问题:问题中的代码在我正在使用的标准python中完美运行。

第二:我偶然发现了这个问题,因为我有相同的错误信息,但可能是出于其他原因。我不小心将模块命名为“类型”。奇怪的是,python框架在从导入的系统模块中解析引用时选择了这个新的“类型”模块。这表明python的解析引用算法有点......嗯......有点非常简单的设计。

然而,如果读者收到此错误消息,请先检查您是否在代码中某处意外命名了“type”,作为解决问题的第一种方法,然后再检查该错误消息的其他原因。

更新: 这是Python中非常常见的现象。小心!每当您为模块提供一个已用于任何导入的Python模块的名称(并且您可能不知道这些名称!)时,您将有可能得到与问题中描述的错误类似的奇怪错误。

答案 1 :(得分:2)

已接受的解决方案迫使您重命名模块,但是:

在程序包中包含名为types的模块没有任何问题,实际上,如果在当前目录或将PYTHONPATH目录设置为目录的情况下运行解释器,则会出现此错误包含模块。

如果避免这种情况,则不必重命名模块。

如果使用IDE,请检查运行配置,以确保未将PYTHONPATH或当前目录设置为包括您的模块。