【问题标题】:Cannot import name 'MappingProxyType' error after importing functools导入 functools 后无法导入名称“MappingProxyType”错误
【发布时间】:2017-09-13 04:26:59
【问题描述】:

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

Traceback(最近一次调用最后一次): 文件“C:/Users/Admin/Documents/Python/decorator.py”,第 1 行,在 导入功能工具 文件“C:\Python3\lib\functools.py”,第 22 行,在 从类型导入 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 作为解释器

【问题讨论】:

    标签: python import functools


    【解决方案1】:

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

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

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

    尽管如此,如果读者收到此错误消息,请先检查您是否在代码中的某处不小心将某些“类型”命名为解决问题的第一种方法,然后再检查该错误消息的其他原因。

    更新: 这是 Python 中相当普遍的现象。当心!每当您为您的模块指定一个已用于任何导入的 Python 模块的名称时(并且您可能不知道这些名称!),您将有可能遇到与问题中描述的错误或多或少相似的奇怪错误。

    【讨论】:

    • 成功了!!我将一个模块命名为types.py,然后出现了这个错误。重命名后一切正常。谢谢!
    • @Prashanth 我还命名了一个模块types.py,它确实干扰了导入过程。由于 numpy 错误消息中没有提到这一点,请考虑将您的评论更改为完整答案,以向未来遇到相同问题的开发人员突出显示。 (不过只是一个建议):-)
    • 英雄!我也有一个名为 types 的模块。从没想过这是原因。谢谢! @Regis 梅
    • 对于我的情况,我命名了一个文件夹 types,重命名后它运行良好
    【解决方案2】:

    公认的解决方案会强制您重命名模块,但是:

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

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

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

    【讨论】:

    • 我没有使用 IDE。
    • 在 Pycharm 上,我没有选中“将源根目录添加到 PYTHONPATH”,一切都很好。谢谢!
    猜你喜欢
    • 2017-05-25
    • 2017-08-11
    • 2021-02-19
    • 2014-01-29
    • 2016-11-21
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多