【问题标题】:Typehints for python classpython类的类型提示
【发布时间】:2020-01-14 21:14:17
【问题描述】:

是否可以键入提示类的自我?

原因是基于一个模棱两可的动态类,该类在名为BaseClassBSubClassD 的提示存根中给出了定义。

我原以为这是有效的 python,但事实并非如此。有没有办法输入基类参数来创建类?

我也接受任何让 PyC​​harm 正确地自动完成自我的技巧作为答案,因为这似乎在 3.7.4 中不受 Python 支持。

例如

class MyClass(BaseClassAmbiguous: Union[BaseClassB, SubClassD])
    def func(self):
        self.self_doesnt_autocomplete_correctly
        self. # Desired functionality is this to autocomplete according to BaseClassB and SubClassD

【问题讨论】:

    标签: python pycharm type-hinting


    【解决方案1】:

    我怀疑类型检查器阻塞代码的原因是它实际上不是有效的语法。您的基类列表中的注释是语法错误。

    可能最好的解决方法是给 BaseClassAmbiguous 一个假类型,像这样:

    from typing import Union, TYPE_CHECKING
    
    if TYPE_CHECKING:
        class BaseClassAmbiguous(BaseClassB, SubClassD): pass
    else:
        # Create your ambiguous base class however it's actually
        # constructed at runtime
    
    class MyClass(BaseClassAmbiguous):
        def func(self) -> None:
            self.blah
    

    基本上,对你的类型检查器撒谎并假装BaseClassAmbiguous 直接继承自你的两个类。我不确定 Pycharm 是否特别支持这种东西,但它原则上应该支持。 (例如,可以在 Python 中进行这些恶作剧)。

    也就是说,如果您要使用这种方法,最好让BaseClassAmbiguous实际上尽可能直接从两个子类继承。


    要回答您最初的问题,是的,注释 self 方法是合法的。当你想让你的 self 变量是通用的时,这种技术通常是保留的——参见this example in PEP 484,以及这个迷你教程in the mypy docs

    但是原则上你可以使用任何类型提示来注释self,真的,包括联合,只要它与你的类的本质不兼容——你对self的注释需要本质上是相同的键入为MyClass 的超类型或超类型。

    也就是说,这种技术在这里可能对您没有帮助:您需要的是交集类型,而不是联合类型,并且注释 self 无助于解决基类列表中的语法错误。

    我认为这里更广泛的问题是 PEP 484 生态系统不一定能很好地处理模棱两可或动态的基类。也许这在你的情况下是不可能的,但如果我站在你的立场上,我会集中精力使基类更加具体。

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 2022-09-29
      • 2017-11-03
      • 2022-11-02
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多