Python - 有没有办法让稍后声明的输入

Python - Is there a way to make typing that declared later

我正在制作解析器,我想在我的代码中制作一些 "typing" 用于类型提示。但是,一个文件的classes已经相互引用和继承了。所以,我的代码现在是意大利面条:(

我已经尝试了很多我能做的案例。我在一个 class 中尝试了所有内容,然后更改了顺序。但是,一切都没有改变。尽管如此,还是有点错误 'Unresolved reference'

from abc import ABC, abstractmethod

class Expression(ABC):
    class Visitor(ABC):
        @abstractmethod
        def visit_assign(self, expr: Assign):
            pass

    @abstractmethod
    def accept(self, visitor: Visitor):
        pass

class Assign(Expression):
    def accept(self, visitor: Visitor):
        # ...

Assign 的声明晚于 Visitor class。因此,它发生 "Unresolved Reference" 错误。

cross-references 问题的解决方案可以是先声明您可以声明的内容,然后再添加其余内容。

所以你可以有这样的东西:

from abc, import ABC, abstractmethod

class Expression(ABC):
    class Visitor(ABC):
        pass

class Assign(Expression):
    def accept(self, visitor: Visitor):
        # ...

@abstractmethod
def visit_assign(self, expr: Assign):
    pass

@abstractmethod
def accept(self, visitor: Visitor):
    pass

Expression.Visitor.visit_assign = visit_assign
Expression.accept = accept

有两种方法可以做到这一点。

第一个是 运行 from __future__ import annotations,它将注释解析延迟到 运行 时间,允许您的代码 运行 未修改。

第二种是将你的类型注解改为strings,效果几乎一样:

from abc import ABC, abstractmethod

class Expression(ABC):
    class Visitor(ABC):
        @abstractmethod
        def visit_assign(self, expr: 'Assign'):
            pass

    @abstractmethod
    def accept(self, visitor: 'Visitor'):  # not needed; for consistency only
        pass

class Assign(Expression):
    def accept(self, visitor: 'Visitor'):
        pass