导入 functools 后出现 Cannot import name 'MappingProxyType' 错误

Cannot import name 'MappingProxyType' error after importing functools

导入 functools 后,我从解释器收到这样的消息:

Traceback (most recent call last): File "C:/Users/Admin/Documents/Python/decorator.py", line 1, in import functools File "C:\Python3\lib\functools.py", line 22, in from types import MappingProxyType ImportError: cannot import name '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 作为解释器

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

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

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

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

更新: 这是Python中比较普遍的现象。当心!每当你给你的模块起一个已经被任何导入的 Python 模块使用的名字时(你可能不知道这些名字!)你将有可能得到或多或少类似于所描述的奇怪错误在问题中。

接受的解决方案强制您重命名您的模块,但是:

在你的包中有一个名为 types 的模块没有错,实际上如果解释器是 运行 当前目录或 PYTHONPATH 你会得到这个错误目录设置为包含模块的目录。

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

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