複数 - Python:関数からforループを継続する方法を教えてください。




python3 for (6)

場合によっては、 forループ内で次のパターンが必要になることがあります。 同じループで複数回回ると:

    try:
        var = 'attempt to do something that may fail on a number of levels'
    except Exception, e:
        log(e)
        continue

今私はそれがreturn continueことができない関数でこれをラップする良い方法は表示されませんreturn continue

def attempt(this):
    try:
        return this
    except Exception, e:
        log(e)
        # 1. continue # <-- syntax error: continue not properly in loop or
        # 2. return continue # <-- invalid syntax
        # 3.
        return False # <-- this sort of works, but makes me feel powerless

もし私が私ができるよりもreturn Falsereturn Falseなら、

    var = attempt('to do something that may fail on a number of levels')
    if not var:
        continue

しかし、私はそれが正義であるとは思わない。 私は、 attempt関数内からcontinue (または偽)forループに伝えたいと思います。

https://code.i-harness.com


ブロックを除いてtryの外側にforループを置く...単純な... ;-)

import sys
if '3.4' in sys.version:
    from termcolor import colored

def list_attributes(module_name): '''Import the module before calling this func on it.s ''' for index, method in enumerate(dir(module_name)): try: method = str(method) module = 'email' expression = module + '.' + method print('*' * len(expression), '\n') print( str(index).upper() + '. ',colored( expression.upper(), 'red'), ' ', eval( expression ).dir() , '...' , '\n'2 ) print('' * len(expression), '\n') print( eval( expression + '.doc' ), '\n'*4, 'END OF DESCRIPTION FOR: ' + expression.upper(), '\n'*4) except (AttributeError, NameError): continue else: pass finally: pass


Pythonはすでにこれを行うための非常に素晴らしい構成を持っていますし、 continue使用していません:

for i in range(10):
    try:
        r = 1.0 / (i % 2)
    except Exception, e:
        print(e)
    else:
        print(r)

私はこれ以上は入れ子にしません、またはあなたのコードはすぐに非常に醜いになるでしょう。

あなたの場合、私はおそらく、このような何かを行うでしょう。個々の関数を単体テストするのがはるかに簡単で、 フラットはネストされたものよりも優れています

#!/usr/bin/env python

def something_that_may_raise(i):
    return 1.0 / (i % 2)

def handle(e):
    print("Exception: " + str(e))

def do_something_with(result):
    print("No exception: " + str(result))

def wrap_process(i):
    try:
        result = something_that_may_raise(i)
    except ZeroDivisionError, e:
        handle(e)
    except OverflowError, e:
        handle(e) # Realistically, this will be a different handler...
    else:
        do_something_with(result)

for i in range(10):
    wrap_process(i)

特定の例外を常に捕まえることを忘れないでください。 特定の例外がスローされることを期待していない場合、処理ループを続行することはおそらく安全ではありません。

次のコメントを編集:

あなたが本当に悪い考えであると考えている例外を処理したくない場合は、(例外except: )すべての例外をキャッチし、 handle(e)代わりにpassます。 この時点で、 wrap_process()は終了し、実際の作業が終了したelse: wrap_process()はスキップされ、 forループの次の繰り返しに進みます。

心に留めておいてくださいエラーは決して黙ってはいけません


あなたはこれを使うことができます:

for l in loop:
  attempt() and foo(bar)

try()がTrueまたはFalseを返すようにする必要があります。

本当に、Johnsywebの答えはおそらく良いでしょう。


コンテキストとは別に、私はちょうど簡単な方法で質問に答えたい。 いいえ、関数は呼び出すことができるループをcontinueことができません。これは、このコンテキストに関する情報がないためです。 また、その関数は、それを処理するために周囲のループなしで呼び出された場合にどうなるかのような全く新しいクラスの質問を提起するでしょうか?

しかし、関数は、呼び出し側が現在実行しているループをcontinueすることをさまざまな方法で通知できます。 1つの手段は戻り値です。 これを通知するには、 FalseまたはNoneを返します。 これを通知する別の方法は、特別なExceptionを発生させることです。

class ContinuePlease(Exception): pass

def f():
    raise ContinuePlease()

for i in range(10):
    try:
        f()
    except ContinuePlease:
        continue

多分あなたは継続をしたいですか? あなたはEric Lippertがどのようにそれらを説明しているかを見てみることができます (あなたの心が吹き飛ばされる準備ができていれば、Pythonではこれはちょっと見えるかもしれません:

def attempt(operation, continuation):
    try:
        operation()
    except:
        log('operation failed!')
    continuation()

あなたのループの中であなたはできる:

attempt(attempt_something, lambda: foo(bar)) # attempt_something is a function

私は通常2番目の答えを投稿しませんが実際に最初の答えが気に入らなければこれは別の方法です。

関数はtupleを返すことができることにtuple

#!/usr/bin/env python

def something_that_mail_fail(i):
    failed = False
    result = None
    try:
        result = 1.0 / (i % 4)
    except:
        failed = True # But we don't care
    return failed, result

for i in range(20):
    failed, result = something_that_mail_fail(i)
    if failed:
        continue
    for rah in ['rah'] * 3:
        print(rah)
    print(result)

私はそれを維持していtry ... except ... elseに行く方法は、あなたは静かにエラーを無視するべきではありません。 注意してくださいemptorとすべてのこと。





continue