:rtype:指定这是返回对象的类型
因此,当我在以下代码段中创建对象obj
时,我收到来自IDE的警告,cls is not callable
,因为IDE期望cls
object
类型为SomeAbstractClass
1}},我想要SomeAbstractClass
本身
IDE是对的,因为这是默认行为。但是我怎么能指明,我正在返回课堂,而不是班级的实例?
指定type
而不是SomeAbstractClass
会有所帮助,但不是解决方案,因为没有进一步的内省可用。
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"""
来解决此问题,但这并不会取消警告及其肮脏的解决方案。
答案 0 :(得分:1)
至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
答案 1 :(得分:0)
说到Python 3.6.9,可能并不舒服,但是正如您自己说的那样,这是正确的表示法:
"""
:return: subclass of SomeAbstractClass
:rtype: type
"""
rtype定义要返回的事物的类型。我在这里看不到任何讨论空间。
答案 2 :(得分:-3)
如果数据是SomeAbstractClass的实例,则可以使用以下代码段:
示例1:
def class_selector(data):
"""
return: Return the class of data
"""
return type(data)
示例2:
def class_selector(data):
"""
return: Return the class of data.
"""
return data.__class__
如果你想使用data.name来指定一个类,你可以使用它:
def class_selector(data):
"""
return: Return a class specified by data.name
"""
return type(globals()[data.name]) #or use globals()[data.name].__class__
你应该在使用这个
时捕获KeyError异常