web-dev-qa-db-ja.com

パラメーターがPython docstringsの特定のオブジェクトのリストであることを指定する方法

プロジェクトが特定のサイズを超えたときに型パラメーターを指定するために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に伝えるにはどうすればよいですか? 私が探していることに注意してください上記よりも具体的な答え。

42
Alex

PyCharmのマニュアル のコメントセクションには、開発者からの素敵なヒントがあります。

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

それは私にはかなりうまくいきます。ここで、パラメータ化されたクラスをPython :)で文書化する最良の方法は何だろうと思います。

49

pythonで

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

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

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

この質問を見ることができます Python:特定の種類のオブジェクトのリストを定義する

ただし、配列モジュールでは「基本値」のみが許可されます。

ここで考えることができる唯一の解決策は、要素を追加する前にタイプをチェックできるpython list "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)
3
fsw

Googleスタイルでdocstringを作成するとき、次のことができます。

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

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

    """
    ...

これは、スフィンクスでも、ナポレオン拡張と組み合わせると、かなりうまく機能します。ドキュメントのその他の例については、 拡張機能のドキュメント を参照してください。

1
Kim

PyCharm docsa(legacy、pre - 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 typing のドキュメントで見つけることができます。

0
hendrik