【问题标题】:python rtype docstring/restructured text for class factories/selectors用于类工厂/选择器的python rtype docstring/重组文本
【发布时间】:2014-04-30 20:59:24
【问题描述】:

:rtype: 指定这是返回对象的类型。

因此,当我在以下 sn-p 中创建对象 obj 时,我收到来自 IDE 的警告 cls is not callable,因为 IDE 预计 clsobject 类型为 SomeAbstractClass,并且我想要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。

【问题讨论】:

  • 既然:rtype:注解是用来表示返回值的type(),又因为type(SomeAbstractClass)type,你或许应该使用:rtype: type
  • 感谢您的输入,但我已经在问题中指定了为什么这种方法不起作用,type = 默认对象类的创建者。没有特定于类的属性,因此不允许进一步的自省和验证,这仅向 IDE 提供知识,即它是某个类,而不是特定的类
  • 你有没有想过或找到更多关于为 Pycharm 编写 Python 文档字符串的建议?最近真的很喜欢 Pycharm,希望看到更多编写好的文档字符串来帮助 Pycharm 检查代码的示例。
  • 我知道这个问题已经存在两年了,但这里是受支持的文档字符串类型提示列表jetbrains.com/help/pycharm/2016.1/… 你可以使用的是type[SomeAbstractClass] 这是你的类参数化的类型
  • 请看一下这个 python 问题,Guido 解释道:github.com/python/typing/issues/58

标签: python pycharm restructuredtext docstring


【解决方案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


【讨论】:

    【解决方案2】:

    说到 Python 3.6.9,可能不太舒服,但正如您自己所说,这是正确的表示法:

    """
    :return: subclass of SomeAbstractClass
    :rtype: type
    """
    

    rtype 定义要返回的事物的类型。我在这里没有看到任何讨论空间。

    【讨论】:

    • 不行,应该不是通用类型,具体应该是SomeAbstractClass类。如果你把它放入 rtype - Pycharm 会认为它是这种类型的对象,而不是类型本身
    • Well type 是 SomeAbstractClass 的元类,也就是说 SomAbstractClass 是一个对象(stackoverflow.com/questions/100003/…)。因此我认为这是正确的。顺便说一下 Python 3.6.9
    【解决方案3】:

    如果数据是SomeAbstractClass的实例,可以使用如下sn-ps:

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

    【讨论】:

    • 对不起,但这并不能回答问题。问题是如何在文档字符串中指定返回值是类,而不是实际返回类,因为这不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2019-05-27
    • 2019-10-21
    • 2023-03-15
    • 2017-11-05
    • 1970-01-01
    相关资源
    最近更新 更多