2013-07-24 4 views
32

プロジェクトが特定のサイズを超えたときに、Pythonでdocstringを使用して型パラメータを指定するのは本当に好きです。パラメータがPython docstringの特定のオブジェクトのリストであることを指定する方法

パラメータが特定のオブジェクトのリストであることを指定するための標準を見つけることができません。 Haskell型では[String]または[A]を使用します。

(PyCharmエディタにより認識)現在の標準:私が好む何

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

OPTION 1

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

OPTION 2

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

私はそれが素晴らしい例ではないと考えています。より関連するユースケースは、リスト内のオブジェクトが特定のタイプでなければならないケースです。私は空腹取得していたという事実以外の

BETTER例だから、

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 

、この例では、オブジェクトの間違った種類のリストとともに呼び出された場合、コードが壊れることを示しています。したがって、それがリストを必要とするだけでなく、それは食品のリストを必要とすることを文書化することの重要性。

関連する質問 How can I tell PyCharm what type a parameter is expected to be? 私は上記の1以上の具体的な答えを探していますのでご注意ください。

あなたもintのリストに文字列を追加することができるのpython

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

+0

pythonのWebサイトでPEPをチェックしましたか? – Jiminion

+0

私はこれについて見つけませんでしたが、私はそれを逃したかもしれません – Alex

+0

可能な複製http://stackoverflow.com/questions/24853923/python-3-annotations-type-hinting-a-list-of-a-指定されたタイプのpycharm(ここで私はPython 3.5の 'typing'モジュールについて学びました)。 – Noumenon

答えて

39

PyCharm's manualのコメント欄では、開発者からの素敵なヒントがあります。これで、Pythonでパラメータ化されたクラスを文書化するための最良の方法は何ですか?あなたが行うことができますGoogleのスタイルでドキュメンテーション文字列を書い

+0

この回答は現在廃止されており、2014年後半には[PEP 484](https://www.python.org/dev/peps/pep-0484/)が作成されています。しかし、それは当時の良い答えでした! :-) – Jason

+3

注:答えはPython 3.5以降では時代遅れです。 –

3

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

あなたはPython : define a list of a specific type of object

アレイモジュールは、しかし、唯一の「基本的な価値観」を可能にこの質問を見てみることができます。

ここで私が考えることができるのは、要素を追加する前にタイプをチェックできるPythonリスト "FoodsList"を拡張する独自のクラスを作成することだけです。それはかなりよく私の作品

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

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) 
+0

+1:それは私が期待していたよりもはるかに良い方法で問題を解決します:)良い洞察 – Alex

+0

PyCharmは私のコードをすべてチェックしてリストに追加するこれは何をするように設計されているのですか? – Alex

1

時:

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

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

    """ 
    ... 

これはまた、ナポレオン・拡張と組み合わせると、スフィンクスにはかなり正常に動作します。詳細については、extension's docを参照してください。

関連する問題