繁体   English   中英

引号中的mypy显式类型提示仍给出未定义的错误

[英]mypy explicit type hint in quotes still gives not defined error

我正在尝试做以下事情:

self.sender = None # type: 'Node'

我无法导入Node,因为会循环。 因此,我将其写在这里提到的引号中http://mypy.readthedocs.io/en/latest/common_issues.html#import-cycles但我仍然收到以下错误

error: Name 'Node' is not defined

有什么解决办法吗?

谢谢!

简短的回答,您需要包括该类的模块名称,并且需要在一些无法访问的代码中导入该模块,如下所示:

if False:
    # for forward-reference type-checking:
    import mymodule

class MyClass(object):
    def __init__(self):
        self.sender = None  # type: mymodule.Node

为了理解为什么需要这样做(以及为什么它起作用),您必须首先意识到mypy正在执行静态代码分析。 这意味着它不导入模块,而是分析和分析从模块文件读取的文本。

导入上面的模块时, import mymodule行将永远不会运行,因此将避免您的周期性导入,但是mypy仍然可以解析它。 这就是mypy如何在分析期间解析对mymodule.Node的引用。

为了完整起见,我应该提到不需要使用模块名称,可以使用在解析过程中不会引起冲突的任何名称:

if False:
    from mymodule import Node

class MyClass(object):
    def __init__(self):
        self.sender = None  # type: Node

另请注意,您不需要在注释中出现的类型名称周围使用引号。 仅当类型注释直接出现在python对象中时才需要这样做。 以下是一些可能发生的情况:

from typing import Optional, NamedTuple
if False:
    from mymodule import Node

NodeInfo = NamedTuple('NodeInfo', [('node', 'Node'), ('info', dict)])

class MyClass(object):
    def __init__(self, sender: Optional['Node'] = None):
        self.sender = sender

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM