Который лучше?
if not var:
var = get_var()
(или)var = var или get_var ()
Кроме того, Как я знаю лучше двух?
править:
Еще одна опция от steve,
var = var if var else get_var()
Чем лучше тот, который вам больше нравится. Я бы использовал первую версию с , если
, но это очень личное.
На самом деле, если вы пытаетесь определить, была ли ранее установлена переменная 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
.
Для меня первая идиома, один, использующий явное if, предпочтительнее, потому что он более явный.
Однако я видел, что конструкция or упоминается как предпочтительная / более питоническая.
Итак, с одной стороны, Явное лучше, чем неявное
(цитата из Дзэн), с другой стороны, короткое выражение можно рассматривать как питоническое (хотя короче не эквивалентно питоническому во всех case!)
Тесно связанный вопрос SO - это наиболее идиоматический способ преобразования None в пустую строку , и там были перечислены идиомы if и or.
Оба в конечном итоге будут компилироваться в один и тот же код, учитывая, что или является оператором короткого замыкания (он не оценивает аргумент правой руки, если левая рука истинный).
Я бы предпочел первый, поскольку он более четко выражает ваши намерения. Второй, наверное, более компактный.
Второй более питонический, и я обычно его использую.
первая версия мне более интуитивно понятна. Но опять же, все дело в вашем собственном вкусе.
Ничего подобного.
Первый вариант более понятен тем, кто читает код.
Спросите себя, когда вы думаете о проблеме, которую пытаетесь решить, идеи, которые приходят на ум, ближе к «если это, то это» или «логическое ИЛИ двух почти, но не совсем, булево. переменные. "
Интерпретатор, скорее всего, выполнит их обоими способами. Есть компромиссы относительно читабельности кода. Какое утверждение легче распознать, что оно делает? Конечно, первое гораздо яснее. Мне, читая этот пост, пришлось больше думать о втором. Я бы использовал первое из-за большей читабельности, даже если второе утверждение немного «сексуальнее».
Надеюсь, это поможет.
-tjw
Когда два варианта стилей настолько близки стилистически, я использую 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
ложно, быстрее, когда оно истинно
.