【问题标题】:How to correctly specify the type of a variable in Python in order to prevent unresolved reference in PyCharm?如何在 Python 中正确指定变量的类型以防止 PyCharm 中未解析的引用?
【发布时间】:2021-02-09 14:46:08
【问题描述】:

我有一个函数:

def foo(path):
    """ 
    :param path: Path to a folder
    :type path: pathlib.Path
    """
    new_path = path / 'tmp'
    return new_path

它获取一个pathlib.Path 对象并在此路径的末尾添加'tmp'。但是 PyCharm 在new_path = path / 'tmp' 中的path 下显示了一个“未解决的引用”。

很明显,如果此类变量的类型是内置的,则不会发生这种情况。请注意,如果我导入from pathlib import Path 并将def foo(path) 更改为def foo(path: Path),则可以解决此问题。但我想知道是否有任何方法可以在没有不必要的进口的情况下做到这一点。我阅读了有关 Python 类型的文章,但找不到解决方案。

【问题讨论】:

  • @CATboardBETA 不用担心。 pathlib 库中的 Path 对象提供了将除法运算符实现为连接运算符的此类行为。所以不用传统的os.path.join(path, 'tmp'),你可以简单地做path / 'tmp'
  • 在功能上按ctrl+q 我什至在描述中得到了所需的def foo(path: Path) -> Path(不导入pathlib
  • @Tomerikoo 是的,Pycharm 就是这样做的。但是你会得到“NameError: name 'Path' is not defined”,因为路径没有被导入
  • FWIW,这些导入不是不必要的。其他代码检查您的函数是完全有效的,这需要正确解析名称。除非有明确的技术原因(例如循环导入),否则您应该添加导入。
  • @MisterMiyagi 我假设 path 是一个可以通过不同模块传递的对象,因为它可以被 python 识别为内部人员,我不应该使用另一个导入。所以你说它不是pythonic?

标签: python pycharm python-typing


【解决方案1】:

在下面的示例中,PyCharm 确实发出警告 Unresolved reference 'Path',因为在注释中,类型提示 argument_path 的类型 Path 尚未从 pathlib 导入。对参数和变量都发出警告。

def foo(argument_path: Path):
    """
    :param path: Path to a folder
    :type path: Path
    """
    new_path: Path = argument_path / 'tmp'
    return new_path

解决这个问题的明显方法是在模块顶部使用from pathlib import Path

from pathlib import Path

def foo(argument_path: Path):
    new_path: Path = argument_path / 'tmp'

但我想知道是否有任何方法可以避免不必要的导入。

有两种方法可以在没有导入的情况下执行此操作,或者使用注解 pathlib.Path 中的完全限定名称

def foo(argument_path: pathlib.Path):
    new_path: pathlib.Path = argument_path / 'tmp'

或者不使用类型注解,直接在文档字符串中指定类型。

如果您在文档字符串中声明了无法解析的类型,PyCharm 的静态类型检查器不会发出警告。相反,当您尝试使用该功能时,PyCharm 会发出警告。在下面的示例中,签名或变量声明中没有使用类型提示,类型仅在文档字符串中指定。

def foo3(argument_path):
    """
    :param argument_path: Path to a folder
    :type argument_path: pathlib.Path
    """
    new_path = path / 'tmp'
    return new_path

# PyCharm will issue this warning:
foo3("a_string")  # Expected type 'Path', got 'str' instead

最后你在文档字符串中使用reStructuredText语法,这个选项应该在项目设置中指定:Settings>Tools>Python Integrated ToolsPython Integrated ToolsDocString Format

【讨论】:

  • 解决了我的问题。但是我尝试了“在注释pathlib.Path中使用完全限定名”并没有奏效。
  • @masoud 仔细检查您没有任何拼写错误,我发布的确切示例肯定会起作用。还要将其隔离在一个文件中进行测试,以确保模块中的其他功能不会造成干扰。
  • @bad_coder 应该提到我在设置中启用了Python Debugger收集运行时类型信息以进行代码洞察
  • 我刚试过你提到的the example,它对我有用。如果问题仍然存在,请尝试 invalidate cachesClear caches -禁用该选项以获得清晰的开始。如果它仍然不起作用wipe your temporary files。如果这些示例不起作用,则需要首先修复 IDE 的严重问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 2010-09-13
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
相关资源
最近更新 更多