【问题标题】:Python - Is there a way to make typing that declared laterPython - 有没有办法进行稍后声明的类型
【发布时间】:2019-06-07 00:21:20
【问题描述】:

我正在制作解析器的东西,我想在我的代码中进行一些“键入”以进行类型提示。但是,文件的类已被相互引用和继承。所以,我的代码现在是意大利面条:(

我已经尝试了很多可以制作的案例。我在一节课上尝试了所有内容,然后更改了顺序。但是,一切都没有改变。尽管如此,还是得到了一些“未解决的参考”的错误

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 的声明晚于访问者类。因此,会出现“未解析的引用”错误。

【问题讨论】:

    标签: python compiler-construction interpreter type-hinting


    【解决方案1】:

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

    第一个是运行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
    

    【讨论】:

      【解决方案2】:

      交叉引用问题的解决方案可以是先声明可以声明的内容,然后再添加其余内容。

      所以你可以有类似的东西:

      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
      

      【讨论】:

        猜你喜欢
        • 2022-10-07
        • 2018-02-23
        • 2023-03-20
        • 2013-01-18
        • 1970-01-01
        • 1970-01-01
        • 2018-04-26
        • 1970-01-01
        • 2021-07-16
        相关资源
        最近更新 更多