他の誰かが私の古い「割り当てと設定」クックブックレシピをすでに指摘しているのがわかります。これは、最も単純なバージョンでは次のように要約されます。
class Holder(object):
def set(self, value):
self.value = value
return value
def get(self):
return self.value
h = Holder()
...
if h.set(isBig(y)): return h.get()
if
ただし、これは主に、Pythonと、またはで割り当てが直接サポートされている言語との間の音訳を容易にすることを目的としていますwhile
。このようなチェックアンドリターンをカスケードで「数百」行う場合は、まったく異なることを行う方がはるかに優れています。
hundreds = isBig, isSmall, isJuicy, isBlah, ...
for predicate in hundreds:
result = predicate(y)
if result: return result
またはのようなもの
return next(x for x in (f(y) for f in hundreds) if x)
述語が満たされない場合にStopIteration例外を取得しても問題がない場合、または
return next((x for x in (f(y) for f in hundreds) if x)), None)
ifNone
は、述語が満たされない場合の適切な戻り値などです。
ほとんどの場合、トリック/非イディオムを使用する(または希望する)Holder
ことは、別のよりPythonicなアプローチを探すことを示唆する「デザインの匂い」です-Holder
正当化される1つのケースは、まさに私がそれを設計しました。つまり、PythonコードとPython以外のコードとの密接な対応を維持したい場合(Pythonで参照アルゴリズムを変換し、よりPythonの形式にリファクタリングする前に最初に機能させたい場合、またはPythonをプロトタイプとして書き直し、効果的に機能すると、C ++、C#、Javaなどに変換されます)。