Хорошая практика для ветвления в try / кроме - PullRequest
0 голосов
/ 05 февраля 2020

Предположим, мои python ветви кода основаны на результате попытки /, за исключением следующего:

def(x):
    no_errors = False
    try:
        y = f(x)
        no_errors = True
    except ZError:
        no_errors = False
    if no_errors:
        do_stuff(y)
    else:
        do_other_stuff(x)

Мой линтер предупреждает, что y может быть неопределенным. Это плохая практика? Какое исправление рекомендуется?

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Как правило, у вас не было бы такого структурированного кода. В операторе try будут предложения else и / или finally.

def f(x):
    try:
        y = f(x)
    except ZError:
        do_other_stuff(x)
    else:
        do_stuff(y)
0 голосов
/ 05 февраля 2020

y будет неопределенным, если y = f(x) выдает любое исключение, которое не является ZError. Технически, переменная no_errors действительно означает «нет ZError s». Вы можете справиться с этим более элегантно, используя блок else или finally для определения y.

Например:

def(x):
    no_errors = false
    try:
        y = f(x)
        no_errors = True
    except ZError:
        no_errors = False
    finally:
        y = some_default
    if no_errors:
        do_stuff(y)
    else:
        do_other_stuff(x)

Кроме того, bool не нужен, так как вы может просто использовать условный характер блоков try / кроме (см. ответ Чепнера)

...