:rtype:
指定这是返回对象的类型。
因此,当我在以下代码段中创建对象obj
时,我从IDE收到一条警告:cls is not callable
,因为IDE期望cls
是object
类型的SomeAbstractClass
,并且我想要SomeAbstractClass
本身。
IDE是正确的,因为这是默认行为。但是,如何指定我要返回一个类,而不是一个类的实例?
指定type
而不是SomeAbstractClass
会有所帮助,但这不是解决方案,因为没有进一步的自省(introspection)。
def class_selector(data):
"""
:rtype: SomeAbstractClass
:return: Return some class based on given parameters
"""
return get_from.get(data.name)
cls = class_selector(data)
obj = cls(data.more_data)
同时,我通过在对象创建后添加""":type: SomeAbstractClass"""
来解决此问题,但这并不能消除警告,这是一个肮脏的解决方案。顺便说一句,我在谈论Python2.x。
最佳答案
至于2020年,唯一可以正常工作的解决方案-使用python3注释:
总的来说这在2020年是完全可以接受的
附加屏幕截图以演示正确的行为。
基本上,def factory(name) -> type[SomeAbstractClass]:
或def factory(name) -> "type[SomeAbstractClass]":
(对于无法导入名称的情况)完全可以正常工作。
仍然无法为较旧的Python版本提供解决方案(即避免使用注释)。但这不是2020年的重大交易
和文本相同的代码,如果有人想复制粘贴来测试替代方法
class SomeAbstractClass:
property_by_class = 1
def __init__(self):
self.property_by_object = 1
def factory(name) -> type[SomeAbstractClass]:
hide_it = dict()
class ActualClassImpl(SomeAbstractClass):
pass
hide_it.__setitem__(name, ActualClassImpl)
return hide_it.__getitem__(name)
if __name__ == '__main__':
a = factory('testclass')
by_class_should_be_ok = a.property_by_class
by_object_should_hint_error = a.property_by_object
just_like_none_existing_property_hints = a.property_by_object_bad