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
我正在制作解析器,我想在我的代码中制作一些 "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