2017-11-08 5 views
1

シーケンス(リストなど)のメソッド__getitem__()は、単一のアイテムまたは一連のアイテムを返すことができます。例えば、以下の機能の装飾与えられた:__getitemの正しい型ヒント

def __getitem__(self, index) -> Union[Product, Generator[Product, None, None]]: 
    return super(Products, self).__getitem__(index) 

使用例:

i1 = 34 
for product in products[i1:]: 
    print(product.name) 

私はUnion[Product, Generator[Product, None, None]]は不適切として、この正しいが、PyCharmフラグであると信じます。入力ライブラリを誤って使用していますか?これはPyCharmの問題ですか?

ありがとうございます!

+4

ジェネレータのためのものであり、シーケンスのものではありません。 – user2357112

+0

それは動作しますが、別の質問 - リストまたはシーケンスが発生しますか? 標準ドキュメントから: 1. [データモデル](https://docs.python.org/3.5/reference/datamodel.html#the-standard-type-hierarchy)では、「式として使用すると、スライスは同じタイプのシーケンスです " 2. [typing](https://docs.python.org/3/library/typing.html#typing.List)は次のように述べています:" List(list、MutableSequence [T] ) リストの一般的なバージョン。戻り値の型に注釈を付けるのに便利です。引数に注釈を付けるには、マッピング、シーケンス、またはAbstractSetなどの抽象的なコレクション型を使用することをお勧めします。 – hansonap

答えて

1

__getitem__()の正しいタイプのヒントはUnion[Product, Sequence[Product, None, None]]です。

これは文書内に文書化されていると思われる場所は、data model pageです。「式として使用すると、スライスは同じタイプのシーケンスです」と記載されています。 注:シーケンスのようなタイプ(Listなど)は、typingを参照)でも動作します。

さらなる議論:私は、より効率的なメモリであるため、シーケンスが繰り返されているスライスを使用しているときにジェネレータを期待していました。しかし今は、これが常にやらなければならないという結果になることは明らかです:l_2 = list(l_1[2:])、これは迷惑でしょう。

関連する問題