65

当项目超过一定大小时,我真的很喜欢在 Python 中使用文档字符串来指定类型参数。

我很难找到一个标准来指定参数是特定对象的列表,例如在 Haskell 类型中我会使用 [String] 或 [A]。

当前标准(可被 PyCharm 编辑器识别):

def stringify(listOfObjects):
    """
    :type listOfObjects: list
    """
    return ", ".join(map(str, listOfObjects))

我更喜欢什么:

选项1

def stringify(listOfObjects):
    """
    :type listOfObjects: list<Object>  
    """
    return ", ".join(map(str, listOfObjects))

选项 2

def stringify(listOfObjects):
    """
    :type listOfObjects: [Object]
    """
    return ", ".join(map(str, listOfObjects))

我想这不是一个很好的例子——更相关的用例是列表中的对象必须是特定类型的用例。

更好的例子

class Food(Object):
    def __init__(self, calories):
        self.calories = calories

class Apple(Food):
    def __init__(self):
        super(self, 200)

class Person(Object):
    energy = 0
    def eat(foods):
        """
        :type foods: [Food]  # is NOT recognised by editor
        """
        for food in foods:
            energy += food.calories

所以,除了我饿了之外,这个例子说明了如果用错误类型的对象列表调用,代码会中断。因此,记录不仅需要一份清单,而且需要一份食物清单的重要性。

相关问题 我如何告诉 PyCharm 一个参数应该是什么类型? 请注意,我正在寻找比上述答案更具体的答案。

4

4 回答 4

61

PyCharm 手册的评论部分,开发人员给出了一个很好的提示:

#: :type: dict of (str, C)
#: :type: list of str

它对我很有效。现在它让我想知道在 Python 中记录参数化类的最佳方法是什么:)。

于 2013-10-22T17:09:05.580 回答
13

正如PyCharm 文档中所指出的,一种(旧的,PEP-484之前的)方法是使用方括号:

list[Foo]: Foo 元素列表

dict[Foo, Bar]:从 Foo 到 Bar 的字典

list of str,正如接受的答案中所建议的那样 ,在 PyCharm中没有按预期工作。

从 Python 3.5 和PEP-484的实现开始,您还可以使用类型提示,您的 IDE/编辑器可能会很好地支持它。此处解释了如何在 PyCharm 中轻松完成此操作。

本质上,要使用类型提示 (Python >=3.5) 声明列表返回类型,您可以执行以下操作:

from typing import List

"""
Great foo function.

:rtype: list[str]
"""
def foo() -> List[str]:
    return ['some string', 'some other string']

在这里,我们声明(有点多余)该函数foo在类型提示-> List[str]和 docstring 中都返回一个字符串列表:rtype: list[str]

其他预先声明的类型和更多信息可以在 Python 文档中找到。

于 2019-05-15T07:11:51.137 回答
4

在蟒蛇

type([1,2,3]) == type(['a', 'b', 'c'])

您还可以将字符串添加到整数列表中。

因此,对于您要实现的目标,PyCharm 必须在将其作为参数传递之前神奇地检查您的整个代码是否添加到列表中。

你可以看看这个问题Python : define a list of a specific type of object

然而,数组模块只允许“基本值”。

我在这里能想到的唯一解决方案是创建自己的类来扩展 python 列表“FoodsList”,该类可以在添加元素之前检查类型。

class Food():
    def __init__(self, calories):
        self.calories = calories

class FoodsList(list):
    #you can optionally extend append method here to validate type
    pass

def eat(foods):
    """
    :type foods: FoodsList
    """
    energy = 0
    for food in foods:
        energy += food.calories
    return energy


list = FoodsList()
list.append(Food(3))
list.append(Food(4))
print eat(list)
于 2013-07-24T07:43:15.230 回答
2

以谷歌风格编写文档字符串时,您可以执行以下操作:

class ToDocument(object):
    """This is my Documentation.

    Args:
        typed_list (:obj:`list` of :obj:`str`): Description of typed list

    """
    ...

当与拿破仑扩展结合使用时,这在狮身人面像中也很有效。有关文档的更多示例,请参阅扩展的文档。

于 2017-01-27T12:49:36.510 回答