「if x:return x」ステートメントを回避するPythonの方法


218

他の4つのメソッドを順番に呼び出して特定の条件をチェックし、Truthyが何かを返すとすぐに(次のチェックは行わずに)戻るメソッドがあります。

def check_all_conditions():
    x = check_size()
    if x:
        return x

    x = check_color()
    if x:
        return x

    x = check_tone()
    if x:
        return x

    x = check_flavor()
    if x:
        return x
    return None

これは多くの手荷物コードのようです。各2行のifステートメントの代わりに、次のようなことを行います。

x and return x

しかし、それは無効なPythonです。ここにシンプルでエレガントなソリューションがありませんか?ちなみに、この状況では、これらの4つのチェックメソッドは高価になる可能性があるため、複数回呼び出す必要はありません。


7
これらのxは何ですか?それらは真/偽だけですか、それともいくつかの情報を含むデータ構造であり、データがないことを示す特殊なケースとしてNoneなどが使用されていますか?後者の場合は、ほぼ例外なく例外を使用する必要があります。
Nathaniel

13
@gerrit上記のコードは、コードレビューでトピックから外れた架空の/疑似コードです。投稿の作成者が実際の実際に動作するコードをレビューしてもらいたい場合は、はい、コードレビューに投稿できます。
フランシス2016年

4
なぜあなたx and return xはより優れていると思いますif x: return xか?後者の方がはるかに読みやすく、保守が可能です。文字数や行数を気にする必要はありません。読みやすさが重要です。とにかく、空白以外の文字の数はまったく同じです。本当に必要な場合は、if x: return x1行で問題なく機能します。
marcelm 2016年

3
実際の値を気にするか、それとも本当にブール値を返す必要があるかを明確にしてください。これにより、使用可能なオプションと、意図をより明確に伝えるオプションが異なります。ネーミングは、ブール値のみが必要であることを示唆しています。これらの関数への複数の呼び出しを回避することが重要であるかどうかも違います。関数がパラメーターの任意のセットまたは異なるセットを受け取るかどうかも問題になります。これらの説明がなければ、この質問は不明確、広すぎる、または意見ベースのいずれかに分類されると思います。
jpmc26 2016年

7
@ jpmc26 OPは真の戻り値を明示的に話し、その後、彼のコードはx(とは対照的にbool(x))戻ります。そのため、現状では、OPの関数は何でも返すことができると想定して安全であり、真実である最初のものは何でも望んでいます。
timgeb 2016年

回答:


278

あなたはループを使うことができます:

conditions = (check_size, check_color, check_tone, check_flavor)
for condition in conditions:
    result = condition()
    if result:
        return result

これには、条件の数を可変にできるという追加の利点があります。

あなたは使用することができますmap()+ filter()(使用、Pythonの3つのバージョンをfuture_builtinsバージョン最初のそのような一致する値を取得するにはPython 2での):

try:
    # Python 2
    from future_builtins import map, filter
except ImportError:
    # Python 3
    pass

conditions = (check_size, check_color, check_tone, check_flavor)
return next(filter(None, map(lambda f: f(), conditions)), None)

しかし、これがもっと読みやすいかどうかは議論の余地があります。

別のオプションはジェネレータ式を使用することです:

conditions = (check_size, check_color, check_tone, check_flavor)
checks = (condition() for condition in conditions)
return next((check for check in checks if check), None)

27
条件が本当に唯一の条件、つまりブール値の場合、最初の提案anyでは、ループの代わりに組み込み関数を使用することもできます。return any(condition() for condition in conditions)

4
@Leonhard:any内部にほぼ同じ実装があります。しかし、それははるかに良く見えます、答えとして投稿してください)
Nick Volynkin

13
読みやすさは、他のほとんどすべての考慮事項よりも優先されます。あなたは言う、マップ/フィルターは「議論の余地がある」、私は議論の余地なく醜いのために私の投票を入れました。確かにありがとうございます。でも、私のチームの誰かがこのコードにマップ/フィルターを入力した場合は、それらを別のチームに転送するか、それらを便器の担当に割り当てます。
Kevin J. Rice

15
この読み取り不可能なコードブロックは本当に「pythonian」ですか?そして、特に圧縮のアイデアconditionsarguments?これは、私の頭脳解析プログラムによる解析に約10秒かかる元のコードよりもはるかに悪いです。
yo '

34
「Pythonを好む」と彼らは言った。「Perlは読めない」と彼らは言った。そして、これは起こりました:return next((check for check in checks if check), None)
jja 2016年

393

マルティンのすばらしい答えの代わりに、あなたはチェーンすることができますor。これは最初の真の値を返すか、真の値Noneがない場合:

def check_all_conditions():
    return check_size() or check_color() or check_tone() or check_flavor() or None

デモ:

>>> x = [] or 0 or {} or -1 or None
>>> x
-1
>>> x = [] or 0 or {} or '' or None
>>> x is None
True

9
確かに、しかし、これはいくつかのオプション以上がある場合、速く読むのに退屈になります。さらに、私のアプローチでは、さまざまな数の条件を使用できます。
Martijn Pieters

14
@MartijnPietersを使用\して、各チェックを独自の行に配置できます。
Caridorc 2016年

12
@MartijnPieters私の答えがあなたの答えより優れていることを暗示することはありません。私もあなたの答えが好きです:)
timgeb

38
@Caridorc:私\は論理行を拡張するためにを使用することを強く嫌います。代わりに、可能な場合は括弧を使用してください。そうreturn (....)、必要に応じて改行を挿入しました。それでも、それは1つの長い論理行になります。
Martijn Pieters

47
これがより良い解決策だと思います。単一の関数がとにかく膨大な数のチェックを行うべきではないので、「いくつかのオプションよりも多くなると、それは退屈な[..]になる」という議論は議論の余地があります。それが必要な場合は、チェックを複数の機能に分割する必要があります。
BlueRaja-Danny Pflughoeft 2016年

88

変更しないでください

他のさまざまな答えが示すように、これを行う他の方法があります。元のコードほど明確なものはありません。


39
私はそれに反対するでしょうが、あなたの提案は発言される正当なものです。個人的には、たとえば、timgebのソリューションが瞬時にクリックする間、OPを読み込もうとすると目が疲れます。
Reti43 2016年

3
それは本当に意見の問題です。私は個人的に、の後:で改行を削除if x: return xします。これは、かなり問題ないと考えて、関数をよりコンパクトに見せるためです。しかし、それは私だけかもしれません。
ヨー '

2
それはあなただけではありません。ortimgebと同じように使用することは、適切でよく理解された慣用句です。多くの言語にはこれがあります。おそらくそれが呼び出されるorelseとさらに明確になりますが、単純な古いor(または||他の言語での)でさえ、最初のものが「動作しない」場合に試す代替手段として理解されること意図しています。
Ray Toal 2016年

1
@RayToal:他の言語からイディオムをインポートすることは、コードを難読化する優れた方法です。
Jack Aidley

1
確かに時々そうです!また、心を開いて、これまで誰も試したことがなかった新しいより良いパターンとパラダイムを発見するよう導くこともできます。スタイルは、新しいものを借りたり、共有したり、試したりすることで進化します。両方の方法で機能します。いずれにせよ、orPython以外のラベルが付けられたり、難読化されたりすることは聞いたことがありませんが、とにかくそれは意見の問題です。
Ray Toal 2016年

83

timgebと実質的に同じ答えですが、カッコを使用して書式を整えることができます。

def check_all_the_things():
    return (
        one()
        or two()
        or five()
        or three()
        or None
    )

8
皆さん、この答えを1位に上げるのを手伝ってください。あなたの役割をしてください!
Gyom 2016年

74

カーリーの法則によれば、次の2つの点を分けることで、このコードを読みやすくすることができます。

  • 何をチェックしますか?
  • 1つのことが真実に戻りましたか?

2つの関数に:

def all_conditions():
    yield check_size()
    yield check_color()
    yield check_tone()
    yield check_flavor()

def check_all_conditions():
    for condition in all_conditions():
        if condition:
            return condition
    return None

これにより、以下が回避されます。

  • 複雑な論理構造
  • 本当に長い列
  • 繰り返し

...直線的で読みやすいフローを維持しながら。

また、特定の状況に応じて、さらに読みやすい関数名を考え出すこともできます。


私はこれが好きですが、質問に一致するようにTrue / Falseをcondition / Noneに変更する必要があります。
マルコム

2
これは私のお気に入りです!さまざまなチェックと引数にも対応します。この特定の例ではかなり過剰に設計されている可能性がありますが、将来の問題に本当に役立つツールです!
rjh 2016年

4
return None関数が返すので、必要はありませんNoneデフォルトで。ただし、None明示的に戻ることには何の問題もありません。あなたがそうすることを選択したのは気に入っています。
timgeb

1
このアプローチは、ローカル関数定義で実装するほうがよいと思います。
Jack Aidley

1
@timgeb「Zen of Python」は、「明示的は暗黙的よりも優れています」。
jpmc26 2016年

42

これは、Martijnsの最初の例の変形です。また、ショートサーキットを可能にするために、「呼び出し可能オブジェクトのコレクション」スタイルを使用します。

ループの代わりに、組み込みを使用できますany

conditions = (check_size, check_color, check_tone, check_flavor)
return any(condition() for condition in conditions) 

anyはブール値を返すため、チェックの正確な戻り値が必要な場合、このソリューションは機能しません。any区別はありません14'red''sharp''spicy'戻り値として、それらはすべてとして返されますTrue


next(itertools.ifilter(None, (c() for c in conditions)))ブール値にキャストせずに実際の値を取得できます。
kojiro 2016年

1
any短絡実際に?
zwol 2016年

1
@zwolはい、いくつかのサンプル関数で試すか、

1
これは、4つの関数を「or」でチェーンするよりも読みにくく、条件の数が多い場合や動的な場合にのみ効果があります。
rjh 2016年

1
@rjh完全に読み取り可能です。これは単なるリストリテラルであり、内包です。私の目は、約3分後にオーバーglazethので、私はそれを好むx = bar(); if x: return x;
ブラックライトシャイニング・

27

if x: return xすべてを1行で記述することを検討しましたか?

def check_all_conditions():
    x = check_size()
    if x: return x

    x = check_color()
    if x: return x

    x = check_tone()
    if x: return x

    x = check_flavor()
    if x: return x

    return None

これはあなたが持っていたものよりも繰り返しが少ないわけではありませんが、IMNSHOはかなりスムーズに読みます。


24

anyこの目的のために作られたビルトインについて誰も言及しなかったことに私はかなり驚いています:

def check_all_conditions():
    return any([
        check_size(),
        check_color(),
        check_tone(),
        check_flavor()
    ])

この実装はおそらく最も明確ですが、最初のチェックがであっても、すべてのチェックを評価することに注意してくださいTrue


最初に失敗したチェックで停止する必要がある場合は、reduceどれを使用してリストを単純な値に変換するかを検討してください。

def check_all_conditions():
    checks = [check_size, check_color, check_tone, check_flavor]
    return reduce(lambda a, f: a or f(), checks, False)

reduce(function, iterable[, initializer]):2つの引数の関数を反復可能の項目に左から右に累積的に適用し、反復可能を単一の値に減らします。左の引数xは累積値であり、右の引数yは反復可能オブジェクトからの更新値です。オプションの初期化子が存在する場合は、計算でイテラブルの項目の前に配置されます

あなたの場合:

  • lambda a, f: a or f()アキュムレータaまたは現在のチェックf()がであることをチェックする関数ですTrue。場合がありますaされTruef()評価されることはありません。
  • checksチェック関数が含まれています(fラムダからのアイテム)
  • False は初期値です。それ以外の場合、チェックは行われず、結果は常に True

anyそして、reduce関数型プログラミングのための基本的なツールです。これらをトレーニングすることを強くお勧めしますmap


9
anyチェックが実際に文字通り、ブール値を返す場合にのみ動作しますTrueFalse、しかし問題はそれを指定していません。reduceチェックによって返される実際の値を返すために使用する必要があります。また、anyジェネレータなどを使用してすべてのチェックを評価することを回避するのは簡単any(c() for c in (check_size, check_color, check_tone, check_flavor))です。同様にレオンハルトの答え
デヴィッド・Z

の説明と使い方が好きですreduce。同様@DavidZ私はあなたのソリューションは信じてany発電機を使用する必要がありますし、それが戻っに限定されていることを指摘する必要がありますTrueFalse
timgeb 2016年

1
@DavidZは実際にanyは真理値を処理します。any([1, "abc", False]) == Trueそしてany(["", 0]) == False
ngasull '22年

3
@blintすみません、はっきりしませんでした。質問の目的は、チェックの結果返すことです(チェックが成功したか失敗したかを示すだけではありません)。実際のブール値がチェック関数から返された場合にanyのみ、その目的のために機能することを指摘していました。
David Z

19

同じコード構造が必要な場合は、3項ステートメントを使用できます。

def check_all_conditions():
    x = check_size()
    x = x if x else check_color()
    x = x if x else check_tone()
    x = x if x else check_flavor()

    return x if x else None

これを見るとこれは見た目が良くてはっきりしていると思います。

デモ:

実行中のスクリーンショット


7
端末の上にある小さなASCII魚とは?

36
@LegoStormtroopr魚の殻を使っているので、アスキー水槽で飾って幸せにしています。:)
Phinet 2016年

3
細かい魚に感謝(ちなみに色は何ですか?)
mathreadler

4
あなたはで魚を取得することができfishshell.com、ここでASCIIのための設定ファイルpastebin.com/yYVYvVeKは、また、エディタは崇高なテキストです。
Phinet 2016年

9
x if x else <something>次のように減らすことができますx or <something>

5

私にとって、最良の答えは@ phil-frostからのもので、その後に@ wayne-wernerが続きます。

私が興味深いと思うのは、関数が多くの異なるデータ型を返すという事実について誰も何も言っていないということです。

したがって、@ PhilFrostの応答と単一の型を維持するという考えを混ぜ合わせます。

def all_conditions(x):
    yield check_size(x)
    yield check_color(x)
    yield check_tone(x)
    yield check_flavor(x)

def assessed_x(x,func=all_conditions):
    for condition in func(x):
        if condition:
            return x
    return None

xは引数として渡されることに注意してください。またall_conditions、すべてのチェック対象のを取得するチェック関数のパスジェネレーターとしても使用され、またはxを返します。をデフォルト値として使用することにより、を使用したり、を使用してさらにパーソナライズされたジェネレータを渡すことができます。TrueFalsefuncall_conditionsassessed_x(x)func

そうすればx、1つのチェックに合格するとすぐに取得できますが、常に同じタイプになります。


4

理想的には、私は再び書くとcheck_ 機能が戻りますTrueFalseではなく、値。あなたの小切手は

if check_size(x):
    return x
#etc

あなたxが不変ではないと仮定すると、あなたの関数はそれを修正することができます(彼らはそれを再割り当てすることはできませんが)- checkとにかく呼び出された関数は実際にそれを修正するべきではありません。


3

上記のMartijnsの最初の例のわずかなバリエーションで、ループ内のifを回避します。

Status = None
for c in [check_size, check_color, check_tone, check_flavor]:
  Status = Status or c();
return Status

そうですか?あなたはまだ比較をします。あなたのバージョンでは、関係なくすべての条件をチェックし、真の値の最初のインスタンスで返らないようにします。これらの関数のコストに依存するため、望ましくない場合があります。
Reti43 2016年

4
@ Reti43:ifのStatus or c()呼び出しが真実c()かどうかをスキップ/短絡評価しますStatus。そのため、この回答のコードはOPのコード以外の関数を呼び出していないようです。stackoverflow.com/questions/2580136/...
ニール・スレーター

2
@NeilSlater真。私が目にする唯一の欠点は、最初の関数がO(1)で真実を返す場合、以前はO(1)だったのに、listiteratorがn回生成する必要があるため、最良のケースはO(n)にあるということです。
timgeb 2016年

1
はい良い点。ほぼ空のループをループするよりも、c()の評価に少し時間がかかることを期待しなければなりません。フレーバーをチェックすることは、それが良いものであれば、少なくとも一晩かかるかもしれません。
mathreadler 2016年

3

@timgebさんが好きです。それまでの間Nonereturnステートメントで表現する必要がないことを付け加えておきます。or分離文が評価され、最初のいずれもゼロには、どれも空では、なし、なしが返されないし、任意の存在しない場合にNone返されますあるかないかNone

だから私のcheck_all_conditions()関数は次のようになります:

def check_all_conditions():
    return check_size() or check_color() or check_tone() or check_flavor()

使用timeitしてnumber=10**7Iは、提案の数のランニングタイムを見ました。比較のために、random.random()関数を使用して文字列を返すかNone、乱数に基づいています。コード全体は次のとおりです。

import random
import timeit

def check_size():
    if random.random() < 0.25: return "BIG"

def check_color():
    if random.random() < 0.25: return "RED"

def check_tone():
    if random.random() < 0.25: return "SOFT"

def check_flavor():
    if random.random() < 0.25: return "SWEET"

def check_all_conditions_Bernard():
    x = check_size()
    if x:
        return x

    x = check_color()
    if x:
        return x

    x = check_tone()
    if x:
        return x

    x = check_flavor()
    if x:
        return x
    return None

def check_all_Martijn_Pieters():
    conditions = (check_size, check_color, check_tone, check_flavor)
    for condition in conditions:
        result = condition()
        if result:
            return result

def check_all_conditions_timgeb():
    return check_size() or check_color() or check_tone() or check_flavor() or None

def check_all_conditions_Reza():
    return check_size() or check_color() or check_tone() or check_flavor()

def check_all_conditions_Phinet():
    x = check_size()
    x = x if x else check_color()
    x = x if x else check_tone()
    x = x if x else check_flavor()

    return x if x else None

def all_conditions():
    yield check_size()
    yield check_color()
    yield check_tone()
    yield check_flavor()

def check_all_conditions_Phil_Frost():
    for condition in all_conditions():
        if condition:
            return condition

def main():
    num = 10000000
    random.seed(20)
    print("Bernard:", timeit.timeit('check_all_conditions_Bernard()', 'from __main__ import check_all_conditions_Bernard', number=num))
    random.seed(20)
    print("Martijn Pieters:", timeit.timeit('check_all_Martijn_Pieters()', 'from __main__ import check_all_Martijn_Pieters', number=num))
    random.seed(20)
    print("timgeb:", timeit.timeit('check_all_conditions_timgeb()', 'from __main__ import check_all_conditions_timgeb', number=num))
    random.seed(20)
    print("Reza:", timeit.timeit('check_all_conditions_Reza()', 'from __main__ import check_all_conditions_Reza', number=num))
    random.seed(20)
    print("Phinet:", timeit.timeit('check_all_conditions_Phinet()', 'from __main__ import check_all_conditions_Phinet', number=num))
    random.seed(20)
    print("Phil Frost:", timeit.timeit('check_all_conditions_Phil_Frost()', 'from __main__ import check_all_conditions_Phil_Frost', number=num))

if __name__ == '__main__':
    main()

そしてここに結果があります:

Bernard: 7.398444877040768
Martijn Pieters: 8.506569201346597
timgeb: 7.244275416364456
Reza: 6.982133448743038
Phinet: 7.925932800076634
Phil Frost: 11.924794811353031

2

この方法は、箱の外では少しですが、最終結果はシンプルで読みやすく、見栄えが良いと思います。

基本的な考え方はraise、関数の1つが真と評価され、結果を返す場合の例外です。以下はその外観です。

def check_conditions():
    try:
        assertFalsey(
            check_size,
            check_color,
            check_tone,
            check_flavor)
    except TruthyException as e:
        return e.trigger
    else:
        return None

assertFalsey呼び出された関数の引数の1つが真と評価されたときに例外を発生させる関数が必要です。

def assertFalsey(*funcs):
    for f in funcs:
        o = f()
        if o:
            raise TruthyException(o)

上記は、評価される関数の引数も提供するように変更できます。

そしてもちろん、あなたTruthyException自身が必要になります。この例外は、例外objectをトリガーしたを提供します。

class TruthyException(Exception):
    def __init__(self, obj, *args):
        super().__init__(*args)
        self.trigger = obj

もちろん、元の関数をより一般的なものに変えることができます:

def get_truthy_condition(*conditions):
    try:
        assertFalsey(*conditions)
    except TruthyException as e:
        return e.trigger
    else:
        return None

result = get_truthy_condition(check_size, check_color, check_tone, check_flavor)

ifステートメントと例外処理の両方を使用しているため、これは少し遅くなる可能性があります。ただし、例外は最大で1 True回しか処理されないため、チェックを実行して何千回も値を取得することを期待しない限り、パフォーマンスへの影響はわずかです。


// 、 可愛い!この種の例外処理を使用することは「Pythonic」と見なされますか?
Nathan Basanese

@NathanBasanese Sure-例外は常に制御フローに使用されます。StopIterationかなり良い例です:イテラブルを使い果たすたびに例外が発生します。避けたいことは、例外を何度も繰り返し発生させることです。しかし、それを一度行うことはそうではありません。
Rickは

//、ああ、私はあなたがprogrammers.stackexchange.com/questions/112463/…のようなものを参照していると思います。私はその質問とこの回答に投票しました。このためのPython 3のドキュメントは次のとおりです:docs.python.org/3/library/stdtypes.html#iterator-typesと思います。
Nathan Basanese

1
どこか他の関数でいくつかのチェックを行うために、汎用関数と例外を定義したいですか?少し多いと思います。
ブラックライトシャイニング2016

@BacklightShining同意する。実際にこれを自分で行うことはありません。OPは繰り返しコードを回避する方法を求めましたが、彼が最初に始めたことはまったく問題ないと思います。
Rickはモニカの

2

Pythonの方法は、reduce(すでに述べたように)またはitertools(以下に示すように)のいずれかを使用していますが、orオペレーターの短絡を使用するだけで、より明確なコードが生成されるようです

from itertools import imap, dropwhile

def check_all_conditions():
    conditions = (check_size,\
        check_color,\
        check_tone,\
        check_flavor)
    results_gen = dropwhile(lambda x:not x, imap(lambda check:check(), conditions))
    try:
        return results_gen.next()
    except StopIteration:
        return None

0

ここにジャンプしてPythonを1行も書いたことがありませんが、if x = check_something(): return x有効だと思いますか?

もしそうなら:

def check_all_conditions():

    if (x := check_size()): return x
    if (x := check_color()): return x
    if (x := check_tone()): return x
    if (x := check_flavor()): return x

    return None

1
いいえ、それは有効なPythonではありません。Pythonでは、このような代入演算子を使用できません。ただし、ごく最近、新しい特別な割り当て式が追加されたif ( x := check_size() ) :ため、同じ効果を記述できます。
Jack Aidley、2018年

0

または使用max

def check_all_conditions():
    return max(check_size(), check_color(), check_tone(), check_flavor()) or None

-2

これまでに、dictsを使用したswitch / caseステートメントの興味深い実装をいくつか見てきました。提供した例を使用すると、次の結果が得られます。(それは狂気なusing_complete_sentences_for_function_namesのでcheck_all_conditions、に名前が変更されstatusます。(1)を参照してください)

def status(k = 'a', s = {'a':'b','b':'c','c':'d','d':None}) :
  select = lambda next, test : test if test else next
  d = {'a': lambda : select(s['a'], check_size()  ),
       'b': lambda : select(s['b'], check_color() ),
       'c': lambda : select(s['c'], check_tone()  ),
       'd': lambda : select(s['d'], check_flavor())}
  while k in d : k = d[k]()
  return k

select関数を使用すると、それぞれをcheck_FUNCTION2回呼び出す必要がなくなりますcheck_FUNCTION() if check_FUNCTION() else next。つまり、別の関数レイヤーを追加することで回避できます。これは、長時間実行される関数に役立ちます。dictのラムダは、whileループまでその値の実行を遅らせます。

ボーナスとして、あなたは、実行順序を変更することも変更することにより、テストの一部を省略kし、s例えばk='c',s={'c':'b','b':None}テストの数を減らし、元の処理の順序を逆にします。

timeitfellowsがスタックに追加の層または2を追加するコストや辞書ルックアップのためのコストを超える値切るかもしれませんが、あなたはより多くのコードのかわいらしさに関係しているようです。

または、より簡単な実装は次のようになります。

def status(k=check_size) :
  select = lambda next, test : test if test else next
  d = {check_size  : lambda : select(check_color,  check_size()  ),
       check_color : lambda : select(check_tone,   check_color() ),
       check_tone  : lambda : select(check_flavor, check_tone()  ),
       check_flavor: lambda : select(None,         check_flavor())}
  while k in d : k = d[k]()
  return k
  1. これは、pep8の観点からではなく、文の代わりに1つの簡潔な説明語を使用する観点からです。OPがいくつかのコーディング規則に従っている可能性があることを認め、既存のコードベースの1つを機能させるか、コードベースの簡潔な用語を気にしません。

1
時々人々は一言でいいのに自分のネーミングに夢中になることがあります。彼が呼ばれる機能を持っているとは考えにくい例として、OPのコードを使用したcheck_no/some/even/prime/every_third/fancy_conditionsが、この1つのだけの機能がなぜそれを呼び出すことはありませstatusまたは1つが主張する場合check_status。使用_all_は不必要です、彼は宇宙の完全性を保証していません。ネーミングでは、可能な限り名前の間隔を利用して一貫したキーワードのセットを使用する必要があります。長い文はドキュメント文字列として最適です。簡潔に何かを説明するために、8-10文字を超える文字が必要になることはめったにありません。
Carel、2016年

1
より高いレベルの関数を自己文書化したいので、私は長い関数名のファンです。ただしcheck_all_conditions、条件が真の場合にすべての条件をチェックするわけではないため、これは悪い名前です。のようなものを使用しますmatches_any_condition
John Hazen

それは、取るに足る興味深い方法です。後でタイプミスをする文字の数を最小限に抑えるようにしています:)実際に役立つヒントを提供しようとしていたときに、私のソリューションに意見の山を押し込んだようです。これは編集する必要がありますか?
カレル2016年

2
これは、特にこの質問の他の解決策を考えると、あまりにもハックしすぎるようです。OPがやろうとしていることはまったく複雑ではありません。ソリューションは、半眠状態を理解するのに十分なほど単純でなければなりません。そして、私はここで何が起こっているのか分かりません。
ブラックライトシャイニング2016

柔軟性を目指していました。あまり「ハッキングされていない」バリエーションを含むように回答を修正
Carel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.