65

プロジェクトが特定のサイズを超えたときに型パラメーターを指定するために、Python で docstring を使用するのが本当に好きです。

パラメータが特定のオブジェクトのリストであることを指定するために使用する標準を見つけるのに苦労しています。たとえば、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 に答える
4

パイソンで

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

文字列を int のリストに追加することもできます。

したがって、達成しようとしているものについては、PyCharm は、リストに追加するものを引数として渡す前に、コード全体を魔法のようにチェックする必要があります。

この質問を見ることができますPython : define a list of object 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

Google スタイルで docstring を記述する場合、次のことができます。

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 に答える