【问题标题】:Reference sibling of parent class父类的引用兄弟
【发布时间】:2019-05-14 13:51:28
【问题描述】:

我正在尝试定义类型定义 (pyi) 文件。在我描述的模块中,有一个类的成员属于父类的成员类型(请参阅下面的代码 sn-p 以获得更清晰的解释)。我的问题是,如果WidgetDialog 之前定义,为什么WidgetDialog 内部引用时会引发flake8“未定义名称”错误?如何正确引用Widget

    class types():
        class Widget():
            ...

        class Dialog():
            def __getattr__(name) -> Widget:
                ...

【问题讨论】:

    标签: python scope reference flake8 python-typing


    【解决方案1】:

    你需要引用Widgetas 'Widget'(python 3.7):

    class types():
        class Widget():
            ...
    
        class Dialog():
            def __getattr__(name) -> 'Widget':
                ...
    

    我不确定为什么在这种特殊情况下有必要。

    [编辑]:对于某些极端情况,类型提示可能比 linter 稍早一些;忽略 linter,此语法不会引发错误,而您发布的语法会引发 NameError: name 'Widget' is not defined。

    OTH,这行得通:

    class Widget:
        pass
    
    class Dialog:
        def __getattr__(name) -> Widget:
            pass
    

    【讨论】:

    • 我在使用这种方法时遇到与使用原始方法相同的错误。
    • 好的,谢谢您的反馈;对于某些极端情况,类型提示可能比 linter 有点早;忽略 linter,此语法不会引发错误,而您发布的语法会引发 NameError: name 'Widget' is not defined
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多