首页 > 解决方案 > python类的类型提示

问题描述

是否可以键入一个班级的自我?

原因是基于模棱两可的动态类的类,该类具有在称为BaseClassBand的提示存根中给出的定义SubClassD

我原以为这是有效的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

标签: pythonpycharmtype-hinting

解决方案


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

可能最好的解决方法是只提供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 变量是通用的时,这种技术通常是保留的——参见PEP 484 中的这个例子,以及mypy 文档中的这个迷你教程。

但是原则上,您可以self使用任何类型提示进行注释,实际上包括联合,只要它与您的类的本质不兼容 - 您的注释self本质上需要与MyClass.

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

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


推荐阅读