python类的类型提示 是否可以键入一个类的自我提示?
原因是基于一个模糊动态类的类,该类的定义在名为python类的类型提示 是否可以键入一个类的自我提示?,python,pycharm,type-hinting,Python,Pycharm,Type Hinting,原因是基于一个模糊动态类的类,该类的定义在名为BaseClassB和subcasd的提示存根中给出 我本以为这是有效的python,但事实并非如此。有没有一种方法可以键入基类参数来创建类 我也愿意接受任何让PyCharm正确自动完成self的技巧作为答案,因为Python在3.7.4中似乎不支持这一点 e、 g 我怀疑类型检查器被代码阻塞的原因是因为它实际上不是有效的语法。基类列表中的注释是语法错误 可能最好的解决方法是只给baseclassmuncify一个伪类型,如下所示: from typ
BaseClassB
和subcasd
的提示存根中给出
我本以为这是有效的python,但事实并非如此。有没有一种方法可以键入基类参数来创建类
我也愿意接受任何让PyCharm正确自动完成self的技巧作为答案,因为Python在3.7.4中似乎不支持这一点
e、 g
我怀疑类型检查器被代码阻塞的原因是因为它实际上不是有效的语法。基类列表中的注释是语法错误 可能最好的解决方法是只给
baseclassmuncify
一个伪类型,如下所示:
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
基本上,对您的类型检查器撒谎,并假装baseclassembible
直接继承了您的两个类。我不确定Pycharm是否特别支持这类事情,但它原则上应该支持这类事情。(例如,可以用Python进行此类恶作剧)
这就是说,如果要使用这种方法,如果可能的话,最好是让baseclassfuzzalize
直接从这两个子类继承
要回答您最初的问题,是的,对
self
方法进行注释是合法的。这种技术通常只适用于希望自变量为泛型变量的情况——请参阅,以及本小教程
但原则上,您可以使用任何类型提示对self
进行注释,实际上,包括联合,只要它与您的类本质上不兼容--self
的注释本质上需要与MyClass
的类型相同或超类型
这就是说,这种技术在这里可能帮不上忙:您需要的是交集类型,而不是联合类型,并且注释self无助于解决基类列表中的语法错误
我认为这里更广泛的问题是PEP 484生态系统不一定能很好地处理不明确或动态的基类。也许这在你的情况下是不可能做到的,但如果我站在你的立场上,我会集中精力使基类更具体
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