Python: предотвращение, если условие?

Который лучше?

if not var:
    var = get_var()
(или)

var = var или get_var ()

Кроме того, Как я знаю лучше двух?
править:
Еще одна опция от steve,

var = var if var else get_var()
5
задан asdfg 11 March 2010 в 06:43
поделиться

9 ответов

Чем лучше тот, который вам больше нравится. Я бы использовал первую версию с , если , но это очень личное.

7
ответ дан 18 December 2019 в 06:02
поделиться

На самом деле, если вы пытаетесь определить, была ли ранее установлена ​​переменная var с помощью вызова get_var, то я бы сказал, что обе формы неверны . Python обрабатывает ряд совершенно обычных значений как вычисляющих логическое значение false: 0, None, [], (,), set () и {}. Итак, допустим, var будет целым числом, а get_var () вернет 0.Теперь, независимо от того, какую форму вы используете, get_var () будет вызываться снова и снова, даже если мы уже знаем, что var равно 0!

Существует несколько методов определения, определена ли переменная или нет:

  • посмотрите в слове, возвращаемом globals () или locals ()

  • заключите оператор var = var в блок try / except, захват NameError

  • использует контрольное значение, например None, и инициализирует var этим значением; тогда вы можете проверить , если var равно None: var = get_var () (используя 'is', а не '=='). Если вам не повезло и None является потенциальным значением, которое может быть возвращено get_var (), вам нужно будет определить свое собственное специальное, еще не определенное значение, используя что-то вроде NOT_DEFINED = object () , инициализируйте var с его помощью, а затем вы можете проверить , если var NOT_DEFINED .

4
ответ дан 18 December 2019 в 06:02
поделиться

Для меня первая идиома, один, использующий явное if, предпочтительнее, потому что он более явный.

Однако я видел, что конструкция or упоминается как предпочтительная / более питоническая.

Итак, с одной стороны, Явное лучше, чем неявное (цитата из Дзэн), с другой стороны, короткое выражение можно рассматривать как питоническое (хотя короче не эквивалентно питоническому во всех case!)

Тесно связанный вопрос SO - это наиболее идиоматический способ преобразования None в пустую строку , и там были перечислены идиомы if и or.

3
ответ дан 18 December 2019 в 06:02
поделиться

Оба в конечном итоге будут компилироваться в один и тот же код, учитывая, что или является оператором короткого замыкания (он не оценивает аргумент правой руки, если левая рука истинный).

Я бы предпочел первый, поскольку он более четко выражает ваши намерения. Второй, наверное, более компактный.

1
ответ дан 18 December 2019 в 06:02
поделиться

Второй более питонический, и я обычно его использую.

1
ответ дан 18 December 2019 в 06:02
поделиться

первая версия мне более интуитивно понятна. Но опять же, все дело в вашем собственном вкусе.

2
ответ дан 18 December 2019 в 06:02
поделиться

Ничего подобного.

Первый вариант более понятен тем, кто читает код.

Спросите себя, когда вы думаете о проблеме, которую пытаетесь решить, идеи, которые приходят на ум, ближе к «если это, то это» или «логическое ИЛИ двух почти, но не совсем, булево. переменные. "

1
ответ дан 18 December 2019 в 06:02
поделиться

Интерпретатор, скорее всего, выполнит их обоими способами. Есть компромиссы относительно читабельности кода. Какое утверждение легче распознать, что оно делает? Конечно, первое гораздо яснее. Мне, читая этот пост, пришлось больше думать о втором. Я бы использовал первое из-за большей читабельности, даже если второе утверждение немного «сексуальнее».

Надеюсь, это поможет.
-tjw

1
ответ дан 18 December 2019 в 06:02
поделиться

Когда два варианта стилей настолько близки стилистически, я использую timeit в качестве решающего момента: чем быстрее, тем ближе к основному течению Python, то есть лучше. Эй, это лучше, чем бесконечные споры, у? -) Итак:

$ python -mtimeit -s'var=0; getvar=lambda:0' 'var = var or getvar()'
1000000 loops, best of 3: 0.359 usec per loop
$ python -mtimeit -s'var=0; getvar=lambda:0' 'if not var: var = getvar()'
1000000 loops, best of 3: 0.361 usec per loop
$ python -mtimeit -s'var=1; getvar=lambda:1' 'var = var or getvar()'
10000000 loops, best of 3: 0.123 usec per loop
$ python -mtimeit -s'var=1; getvar=lambda:1' 'if not var: var = getvar()'
10000000 loops, best of 3: 0.0899 usec per loop

если имеет это - эквивалентно, когда var ложно, быстрее, когда оно истинно .

7
ответ дан 18 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: