9

ほとんどの機能は名前を付けるのが簡単です。一般に、関数名は、それが何をするか、それが生成する結果のタイプに基づいています。Python Generatorの関数名 - 接頭辞は参考になりますか?

ただし、ジェネレータ関数の場合、結果は他の型よりも繰り返し可能です。関数は、名前付きの型のオブジェクトを返しませんので、

def sometype(iterable): 
    for x in iterable: 
     yield some_transformation(x) 

sometype名は、誤解を招きやすい感じ。実際にはsometype以上の繰り返しです。

iter_sometypeまたはgen_sometypeなどの名前があまりHungarian Notationのようなビットを感じています。しかし、それはまた、機能の意図を明らかにしているようです。

さらに詳しくは、接頭辞が役立つような、もっと特殊なケースがいくつかあります。 これは典型的な例であり、その一部はitertoolsで利用できます。しかし、しばしばアルゴリズムの複雑さを持っているバージョンを書く必要があります。それによって はitertoolsに似ていますが、完全には適合しません。

def reduce_sometype(iterable): 
    summary = sometype() 
    for x in iterable: 
     if some_rule(x): 
      yield summary 
      summary= sometype() 
     summary.update(x) 

def map_sometype(iterable): 
    for x in iterable: 
     yield some_complex_mapping(x) 

def filter_sometype(iterable): 
    for x in iterable: 
     if some_complex_rule(x): 
       yield x 

iter_map_reduce_filter_プレフィックスはジェネレータ関数の名前を明確に役立ちますか?それとも、それはちょうど視覚的な混乱ですか?

プレフィックスが有用な場合は、プレフィックスの候補を教えてください。

また、接尾辞が有用な場合は、どのような接尾辞候補がありますか?

+0

私はあなたが一般化されたもののようなものだと思います。つまり、ほとんどの場合、第2および第3の関数をジェネレータ式ala '(iterableのxのsome_mapping(x))として直接書くだけです。最初のものは実際には何も 'reduce 'しません。マップのように、各' x'に新しい 'sometype'があるためです。 –

+1

@ THC4k:もっと複雑であると想像してください。'itertools'の中に簡単に入れるのは複雑すぎます。あまり複雑ではないので、基本的な関数型プログラミングの原則に違反します。たとえば、最適化として多くの予備セットアップが必要になる場合があります。 –

答えて

6

Python dictsにはiter*のメソッドがあります。また、lxmlツリーにはiterメソッドがあります。 が

for node in doc.iter(): 

を読むことはPythonの

for item in sometypes_iter(): 
、私はanalgously書くことができるようにそう そのパターンに従って、私はsometypes sometypes_iter の発電機を命名検討したい、身近なようだ sorted機能を提供します。 そのパターンに続いて、私は過去形の動詞関数を作る可能性があります、あなたはこれらの機能を十分に持っている場合、それはメソッド名が reduceに短縮することができるように SomeTypesクラスを作成する意味があります

sometypes_reduced 
sometypes_mapped 
sometypes_filtered 

map 、およびfilter

sometype以外の型を受け入れるか、返すように関数を一般化できる場合は、関数名からsometypeを削除して、型ではなく機能を強調する名前を選択するのが理にかなっています。

関連する問題