python - python类的类型提示
问题描述
是否可以键入一个班级的自我?
原因是基于模棱两可的动态类的类,该类具有在称为BaseClassB
and的提示存根中给出的定义SubClassD
。
我原以为这是有效的python,但事实并非如此。有没有办法输入基类参数来创建一个类?
我也接受任何让 PyCharm 正确地自动完成自我的技巧作为答案,因为这似乎在 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
解决方案
我怀疑您的类型检查器阻塞您的代码的原因是因为它实际上不是有效的语法。基类列表中的注释是语法错误。
可能最好的解决方法是只提供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 生态系统不一定能很好地处理模棱两可或动态的基类。也许这在你的情况下是不可能的,但如果我站在你的立场上,我会集中精力使基类更加具体。
推荐阅读
- python - f.write(response.content, f) TypeError: TextIOWrapper.write() 只接受一个参数(给定 2 个)
- r - 调查数据的收敛问题
- laravel - 我正在处理网站页面加载缓慢的问题,N+1 问题会发生在服务提供商身上吗?
- c# - 颜色矩阵不适用
- flutter - 如何解决 FATAL EXCEPTION: AsyncTask #2 in flutter
- android - 如何在android中渲染.max文件
- php - 如何分离 Web 服务的输出?
- asp.net-core - “JSON 值无法在 Refit 中转换为 Enum
- python - 如何在 Tkinter 中跨窗口访问图像列表?
- python - 如何创建循环(问题)?