Относительно этих двух вариантов:

try:
    userid = get_userid()
except:
    userid = ""

Против

userid = ""
try:
    userid = get_userid()
except:
    pass

Есть ли какая-то разница, особенно интересно, как будет работать пространство имен, если userid установлен только внутри блока try? У них обоих одинаковая область имен?

Один предпочтительнее другого?

2
ealeon 29 Авг 2017 в 21:00

3 ответа

Лучший ответ

Блоки типа try и except (но также if, elif, else, with) не имеют «локальной области видимости». Однако вы не можете и не должны ожидать, что какой-либо код в блоке try будет выполнен (поскольку он может завершиться ошибкой и перейти непосредственно в блок except или finally).

Но уверены ли вы, что "" как "неудачный" user_id имеет смысл? Почему не что-то еще, например None?

Также вам следует избегать перехвата всех исключений, поэтому я бы предпочел что-то вроде этого:

try:
    userid = get_userid()
except Exception:  # or a more specific exception
    userid = None
7
MSeifert 29 Авг 2017 в 18:07

Вы можете использовать locals() для просмотра определенных переменных в каждом случае. Нет никакой разницы.

1
LeopoldVonBuschLight 29 Авг 2017 в 18:05

После выполнения двух заданных вами операторов нет разницы в результирующем состоянии.

Если вы опустите userid="" во втором, переменная будет неопределенной, если произойдет ошибка.

Первый оператор должен быть предпочтительным, поскольку он (а) лучше и (б) быстрее (userid получает значение, назначенное дважды, если не возникает ошибка).

1
Leolo 29 Авг 2017 в 19:00