Самый чистый способ выбора между двумя значениями в Python - PullRequest
3 голосов
/ 28 июля 2010

Dicts в Python имеют очень хороший метод get:

# m is some dict
m.get(k,v) # if m[k] exists, returns that, otherwise returns v 

Есть ли способ сделать это для любого значения? Например, в Perl я мог бы сделать это:

return $some_var or "some_var doesn't exist."

Ответы [ 4 ]

2 голосов
/ 28 июля 2010

И если вам нужно более конкретно обрабатывать значения "ложного выхода" (например, 0 или '' - это хорошие значения, а None и False - нет), есть более подробный "условное выражение "(он же тернарный оператор), введенный в Python 2.5:

return x if <cond> else y

, где <cond> может быть любым условием:

return x if isinstance(x, basestring) else y
2 голосов
/ 28 июля 2010

Оператор or в Python гарантированно возвращает один из своих операндов, в случае, если левое выражение оценивается как False, правое вычисляется и возвращается.

Редактировать

Перечитав ваш вопрос, я заметил, что неправильно понял его в первый раз. Используя встроенную функцию locals(), вы можете использовать метод get() для переменных, точно так же, как вы используете его для диктовок (хотя это не очень красиво и не питонно), чтобы проверить, существует ли значение:

>>> locals().get('some_var', "some_var doesn't exist.")
"some_var doesn't exist."
>>> some_var = 0
>>> locals().get('some_var', "some_var doesn't exist.")
0
1 голос
/ 28 июля 2010

На самом деле в Python есть разница: Если переменная с именем some_var не определена, вы не можете получить к ней доступ, чтобы узнать, что она не существует - вы получите исключение NameError.

Это так по замыслу: неопределенные имена переменных не имеют значения "undefined" или "null", они вызывают исключение, и это одно из больших отличий от Python до большинства динамически типизированных языков.

Таким образом, Pythonic не может получить утверждение, где some_var может быть или не быть определено. В хорошей программе это было бы определено, даже если бы оно содержало «None» или «False» - В этом случае идиома "или" будет работать, но рекомендуемый способ ее обработки - использовать выражение if как в:

return some_var if some_var else "some_var contains a False Value"

Если у вас есть код, в котором some_var может не быть определен и не может для этого изменить его, вы можете проверить, существует ли строка "some_var" в качестве ключа в словаре локальных переменных, возвращаемых locals() знать, было ли это определено или нет:

return some_var if "some_var" in locals() else "some_var was not defined"

Это тоже не самый питонический способ - иметь дело с переменной, которая не может быть определена, является исключительной в коде Python. Поэтому наилучшей практикой будет попытка использовать содержимое переменной vars внутри причины try и перехватить исключение «NameError», если var не существует:

try:
  return some_var
except NameError:
  return "some_var not defined"
1 голос
/ 28 июля 2010

Короткие замыкания работают и в Python.

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