6

Python 関数を文書化する際に、次のように言う方がより Pythonic だと思います。

def Foo(i):
    """i: An interable containing…"""

…ではなく…</p>

def Foo(i):
    """i: A list of …"""

i本当に である必要がない場合list。( 、などで問題Fooなく動作します。) 問題はジェネレータです。ジェネレーターは通常、1 回の反復のみを許可します。ほとんどの関数は、単一パスのみを許可するジェネレーターまたはイテラブルで問題ありませんが、そうでないものもあります。settuple

ジェネレーター/一度しか反復できないものを受け入れることができない関数について、「複数回しか反復できないもの」と言う明確で一貫した Python 用語はありますか?

Python のiterableiteratorの用語集には、「1 回だけですが、運が良ければもっと多く」という定義があるようです。

4

2 に答える 2

2

これを表す標準的な用語はわかりませんが、少なくとも無造作ではありませんが、短いフレーズが必要な場合は、「再利用可能で反復可能」がポイントになると思います。

i実際には、複数回反復する必要がないように関数を構造化することは一般的に可能です。または、 iterable からリストを作成し、リストを必要な回数だけ反復することもできます。またはitertools.tee、反復子の複数の独立した「コピー」を取得するために使用できます。これにより、ジェネレーターを複数回使用する必要がある場合でも、ジェネレーターを受け入れることができます。

于 2011-11-29T06:07:48.350 に答える
1

これはおそらく何よりもスタイルと好みの問題ですが... 私は自分のドキュメントについて別の見方をしています.

例: 辞書のキーを調べ、その値を無視することを期待する関数を書いた場合、次のように書きます。

arg : a dictionary of...

for e in arg:他のイテラブルで動作する場合でも。私のコードのコンテキスト内で、関数がまだ機能するかどうかは気にしないので、そうすることにしました...ドキュメントを読んだ人がその関数がどのように使用されることを意図しているかを理解することをもっと気にします。

一方、設計によって幅広いイテラブルに対応できるユーティリティ関数を作成している場合は、次の 2 つの方法のいずれかを使用します。

  1. 特定の条件下で発生する例外の種類を文書化[例: 「イテラブルを複数回反復できない場合は TypeError を発生させる」 ]
  2. 関数を「一度だけ」の iterable と互換性を持つようにする、いくつかのプリエンプティブな引数処理を実行します。

言い換えれば、私は自分の機能を特殊なケースを処理するのに十分なほどしっかりしたものにするか、その制限について非常に率直に話すようにしています.

繰り返しますが、あなたが取りたいアプローチには何も問題はありませんが、これは「暗黙的よりも明示的である」場合の 1 つだと考えています。見落とされる。

チッ!

于 2011-11-29T06:48:27.823 に答える