питон ||резервное заявление - PullRequest
4 голосов
/ 24 октября 2011

В Javascript я могу присвоить значение следующим образом:

var i = p || 4

Очевидно, что если p не определено, оно прибегнет к 4. Есть ли более элегантная версияэта операция в Python, чем try: / except: комбо?

try:
    i = p
except:
    i = 4

Ответы [ 5 ]

4 голосов
/ 24 октября 2011

Люди иногда используют Python или -оператор для этой цели:

def f(p=None):
    i = p or 4
    ...

Опирается на «уникальный для Python» аспект оператора или для возврата значения, которое делаетвыражение true (а не просто возвращение True или False).

Другой вариант, обеспечивающий большую гибкость, - это использование условного выражения :

def f(p=None):
    i = p if p is not None else 4
    ...

Если вы простохотите проверить, не определена ли уже переменная, попытка / исключение является самым чистым подходом:

try:
    i = p
except NameError:
    pass

При этом, это было бы нетипично для Python и может быть намеком на то, что что-то не такс дизайном программы.

Лучше просто инициализировать переменную значением заполнителя, таким как Нет .В этом отношении стиль Python несколько отличается от стиля Javascript.

2 голосов
/ 24 октября 2011

Вы можете убедиться, что p инициализировано значением часового (обычно None), а затем проверить его наличие:

p = None
...
i = p if p is not None else 4

Это необходимо, потому что Python не может определять переменные без их предварительного присвоения. В Javascript переменная может быть объявлена, например, с помощью var p; и до тех пор, пока оно не будет присвоено, оно будет принимать специальное значение undefined.

Таким образом, в Javascript значение часового может быть создано неявно, в то время как в Python оно всегда должно быть явно создано.

2 голосов
/ 24 октября 2011

Вы можете использовать i = locals().get('p', 4), но я настоятельно рекомендую против этого.Структурируйте свой код так, чтобы вам не нужно было ссылаться на переменные, которые могут или не могут быть там.

Единственный случай, когда я использую этот шаблон в Javascript, - это имитация пространств имен с глобальными объектами, когда я не хочузависеть от моих файлов сценариев, включенных в правильном порядке.Поскольку в Python есть правильная система модулей, я не могу представить, где это будет необходимо.

1 голос
/ 24 октября 2011

Вопрос и первоначальные утверждения вводят в заблуждение.

Если предположить, что нет свойства window.p и p не является переменной (и не действует with), то это приведет кReferenceError в JavaScript во время выполнения:

var i = p || 4

Python для этого примера работает аналогичным образом и использование try / исключением является излишним,JavaScript немного отличается тем, что var поднят на вершину функции, что также означает, что var i = i || 2 будет работать в JavaScript (так как это эквивалентно var i; ..; i = i || 2).Однако, как правило, переменная должна существовать до ее использования .

Таким образом, or (Python), как указано, является "эквивалентом" ||(JavaScript), отличия var (или их отсутствие) в стороне.Обратите внимание, что Python имеет немного другое представление о значениях false-y , чем JavaScript ..

Счастливое кодирование.

1 голос
/ 24 октября 2011

Как указали Инердиа и Игнасио Васкес-Абрамс, ваши переменные всегда должны инициализироваться при обращении к ним.Если переменная не всегда получает значение, вы можете инициализировать его как None, а затем использовать следующий код, который похож на ваш Javascript:

i = p or 4

Обратите внимание, что вы должны использовать это, только если допустимые значениядля p всегда оценивается как True в логическом контексте, в соответствии с логическими правилами Python .

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