Python - Определите переменные перед тем, как попробовать / поймать или просто позволить им всплыть? - PullRequest
0 голосов
/ 14 ноября 2018

Исходя из языков Java и C, это выглядит странно в Python.Переменная x определена в блоке try, но используется вне его.

Я понимаю, что python не охватывает блок try.

try:
    x = 5
except Exception as e:
    print(str(e))

print(f"x = {x}")

Считается ли это хорошимформа в Python, или предпочтительно установить, скажем, x = None заранее?или какой-то третий вариант?Почему?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Есть очень немного ситуаций, когда try: / except: действительно подходит. Очевидно, что приведенный вами пример был абстрагированным, но, на мой взгляд, ответом будет жесткое «нет», неправильно указывать потенциально необъявленную переменную - если по какой-то причине в try: до x = 5 произошла ошибка, тогда вы получите сообщение об ошибке при попытке print(f"x = {x}").

А точнее, с какой стати переменная будет назначена в блоке try? Я бы сказал, что хорошее эмпирическое правило состоит в том, чтобы включать в try только ту часть кода, которую вы фактически проверяете на исключения .

Побочные примечания:

  • Ранее я был предупрежден о SO, что использовать except Exception неправильно, потому что вы действительно должны обрабатывать определенную type ошибку или, что еще лучше, particular ошибку (например, except IndexError, что приведет к необработанным ошибкам всех других типов) ... try / except - это то, что может легко привести к трудностям в диагностике ошибок, если оно используется не специально.
  • Я почти уверен, except: и except Exception эквивалентны.
0 голосов
/ 18 ноября 2018

В подобных ситуациях , если после исключения есть общий путь выполнения, я обычно делаю что-то подобное (что имеет определенный if/else -тишный штрих к нему до назначения напеременная):

try:
    price = get_min_price(product)
except Exception as ex:
    print("could not get price for product {}: {}".format(product, ex))
    price = 1000000.0
print(f"price = {price}")
if price <= min_price:
    send_price_alert(user, product, price)

Однако, чаще всего я структурирую свой код так, что любые переменные, заполненные в блоке try, я не буду использовать после except block:

try:
    price = get_min_price(product)
    print(f"price = {price}")
    if price <= min_price:
        send_price_alert(user, product, price)
except Exception as ex:
    print("could not get price for product {}: {}".format(product, ex))

Здесь price не используется после ключевого слова except, что устраняет необходимость инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...