-3
if a == arg:
    if arg not in a_list:
        do_something(arg)
elif b == arg:
    if arg not in b_list:
        do_something(arg)
else:
    do_something_else(arg)

関数を分離するためにその一部を抽出することなく、上記のステートメントを短縮し、具体的にはDRYする慣用的な方法を提案します。

編集:おかしい;-)これは宿題ではなく、コードを確認するためのリクエストでもありません。おそらく、上記のようにリフレームすると、私の意図がより明確になります。

DRYであり、言語に慣用的であるように、上記のif文を書くためのpythonianの方法は何ですか?私は何かが足りないと感じています、おそらくPythonの演算子や演算子を利用できますか?関数を分離するためにその一部を抽出しない理由は、この質問が慣用的なpythonianif-logicよりもリファクタリングに関するものであるためです。

4

2 に答える 2

2

簡単な答えは次のとおりです。

for i, i_list  in [(a, a_list), (b, b_list)]:
    if i == arg:
        if arg not in i_list:
            do_something(arg)
        break
else:
    do_something_else(arg)

a、、および、を組み合わせてタプルにするa_listと、それらを簡単に反復できます。次に、反復自体の単純な問題であり、条件を一致させ、目的の関数を実行します。bb_list

Pythonはfor....elseステートメントをサポートしています。

forループに戻り値またはブレークがない場合、elseステートメントが実行されます。

ここで、目的の一致が得られると、ループが中断され、完了です。決して壊れない場合は、elseループに到達します。私の意見では、これはこれを行うための最もPython的な方法です。

編集

これをさらに良くするには、a, b, a_list, b_listある種の辞書の中にある必要があります。d[a] = a_list

次に、次のようにdictを繰り返すことができます。

for k, v  in d.items():
    if k == arg:
        if arg not in v:
            do_something(arg)
        break
else:
    do_something_else(arg)

ほぼ同じですが、見た目が良く、すべてのa「」とb「」およびリストをすべて事前に整理することができます。

于 2012-11-28T15:08:41.710 に答える
1
def run_for_match(candidate, patterns, search_lists, handlers, default_handler):
    for pattern, search_list, handler in zip(patterns, search_lists, handlers):
        if match(pattern, candidate):
            if candidate not in search_list:
                handler(candidate)
            break
    else:
        default_handler(candidate)

run_for_match(string, [a, b], [a_list, b_list], [do_something, do_something], do_something_else)

patternsこれを、、、、をカプセル化するオブジェクトに入れてもsearch_lists、非常に理handlersdefault_handlerかなっています。何かのようなもの:

class StringHandlerManager(object):

    def __init__(self, default_handler):
        self.handler_registry = []
        self.default_handler = default_handler

    def add_handler(self, pattern, search_list, handler):
        self.handler_registry.append((pattern, search_list, handler))

    def __call__(self, candidate):
        for pattern, search_list, handler in self.handler_registry:
            if match(pattern, candidate):
                if candidate not in search_list:
                    handler(candidate)
                break
        else:
            default_handler(candidate)

handle_string = StringHandlerManager(do_something_else)
handle_string.add_handler(a, a_list, do_something)
handle_string.add_handler(b, b_list, do_something)
handle_string(string)
于 2012-11-28T14:33:33.740 に答える