类工厂/选择器的python rtype docstring / restructured text

时间:2014-03-23 16:24:14

标签: python pycharm restructuredtext docstring

: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"""来解决此问题,但这并不会取消警告及其肮脏的解决方案。

是的,谈论python 2.x

3 个答案:

答案 0 :(得分:1)

至2020年,唯一有效的解决方案-使用python3注释:

到2020年总体上完全可以接受

附加屏幕截图以演示正确的行为。 基本上,def factory(name) -> type[SomeAbstractClass]:def factory(name) -> "type[SomeAbstractClass]":(对于无法导入名称的情况)完全可以正常工作。

仍然无法为较旧的Python版本提供解决方案(即避免使用注释)。但这不是2020年的破坏交易

correct_behaviour

与文本相同的代码,如果有人想复制粘贴以测试替代方法

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异常