系统: - Windows 10 x64 - Python 3.6 x64 - PyCharm 2017.3.4
我试图更好地理解Python类型注释与指定类对象而不是类的实例有关。假设我有一个超类和一个子类,我想循环遍历一个类对象列表并实例化其中一个。
在下面的代码中,我可以直接从类中直接实例化(例如,使用Ctrl-P
),在PyCharm中获得正确的代码完成和工具提示。但是,如果我循环遍历列表并为迭代变量typing.Type[Super1]
提供类型注释(使用cls
),它似乎将其注释为实例,而不是类对象。所以我得到了方法和属性的正确代码完成,但是我没有得到初始化函数参数的工具提示。
如何将其注释为一组类,而不是一组类的实例(即此变量是Super1
类或Super1
的子类)。这是正确的方法,但PyCharm只是没有正确识别它或实际上有不同的方法来做到这一点。
import typing
class Super1:
def __init__(self, name: str):
self.name = name
self.meta = "super class"
def print_name(self):
print(self.name)
class Sub1(Super1):
def __init__(self, name: str):
super(Sub1, self).__init__(name)
self.meta = "sub class"
super_instance = Super1("name") # <-- get proper type hints in PyCharm
sub1_alias = Sub1
sub1_alias("name") # <-- get proper type hints for the __init__ function in PyCharm
cls: typing.Type[Super1]
for cls in (Super1, Sub1):
inst = cls("name") # <-- Ctrl-P does not give proper type hints for the __init__ function in PyCharm