1

多くの機能を次々に実行したいと思います。各関数は True または False を返します。したがって、ある関数が True を返したら、次の関数を実行したいと思います。等...

すべての関数が同じ引数を持つ必要はありません。

今、私は次のようなものを持っています:

res=function1()
if res:
   res=function2()
   if res:
      res=function2()

そして、それは 20 ほどの機能に対して延々と続きます。これを行うより良い方法はありますか?

前もって感謝します...

4

4 に答える 4

8

さて、あなたはこれを行うためのあなた自身の方法を定義することができます、しかし私はそれをそのようにします:

my_functions = (
    (my_func1, [2, 5], {'kwarg1': 'val1'}),
    # ...
)

for function, args, kwargs in my_functions:
    if not function(*args, **kwargs):
        break

コメントに従って編集。素晴らしい洞察!

于 2013-02-26T19:52:41.470 に答える
4

私はおそらくpartial、(関数とその引数を持つある種の構造体の代わりに) ループできる引数のない関数を作成するために使用します。

functions = [
    functools.partial(func1, arg1a, arg1b),
    functools.partial(func2),
    functools.partial(func3, keyword_a=kwarg3a, keyword_b=kwarg3b)
]

次に、それを a に入れてlist反復する代わりに、次のように呼び出すことができますall

retval = all(func() for func in (
    functools.partial(func1, arg1a, arg1b),
    functools.partial(func2),
    functools.partial(func3, keyword_a=kwarg3a, keyword_b=kwarg3b)
))

これはFalse、関数の 1 つが返されるとすぐに返されるFalseか (または false-y の場合)、すべての関数を実行して、すべてが返されたTrue場合True(または true-y の場合) に返されます。ドキュメントが言うように、それは次と同等です:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

partials を他の回答の sと比較する価値がtupleあります。これらは、定義方法と呼び出し方法の両方で疑似パーシャルとして機能します。

f1 = functools.partial(func, arg1, arg2, kw1=kwarg1, kw2=kwarg2)
f2 = (func1, (arg1a, arg1b), {'kw1': kwarg1, 'kw2': kwarg2 })

f1()
f2[0](*f2[1], **f2[2])

明らかに、タプルアンパッキングを使用して呼び出しを読みやすくすることができます (また、aemdy の回答がそうであるように、そうすべきです) が、実際のパーシャルを使用するほど単純になることはありません。

于 2013-02-26T20:08:51.203 に答える
2

andオペレーターの短絡動作を利用できます。

function1() and function2() and function3() and ...

function2返される場合にのみ呼び出され、返さfunction1れる場合にのみ呼び出されます。Truefunction3function1function2True

ただし、必ずしもPythonicである必要はありません。

常にに割り当てているので、 sをフラットresに保つこともできます。if

res = function1()

if res:
    res = function2()

if res:
    res = function3()

それはより読みやすいと考えることができますが、それは多くの垂直方向のスペースを浪費します。ただし、少なくともif2ダースの深さをネストしているわけではありません。

于 2013-02-26T19:52:22.880 に答える
1

複雑になりすぎる必要はありません。

res = function1()
res = res and function2()
res = res and function3()
...

これは少し奇妙に見えますが、関数呼び出し自体を辞書のリストなどにひねる必要なく、やりたいことを実行できます。それは、Cairnarvonの答えを書くためのより長い方法です:

res = (
   function1() and
   function2() and
   function3() and
   ...
   )
于 2013-02-26T22:23:20.210 に答える