Перехват значения None с помощью «или» в выражении

1

Я просмотрел это в обзоре кода:

def some_method(self, path):
   path = os.path.abspath(os.path.expanduser(path or ""))

Моя первая реакция была "ahhhh bad!" но на второй мысли... это?

Теги:
boolean
short-circuiting

2 ответа

2
Лучший ответ

Это общий шаблон для реализации какого-либо значения по умолчанию или возвращаемого значения, если первая часть выражения оценивается как False. Рассматривайте это как лучшую практику - нравится это или нет. Он также может использоваться для превращения None в пустую строку.

  • 0
    Я вижу, if x is None: x = defaultValue чаще. Использование того, что логические операторы возвращают один из своих операндов, чаще используется для реализации условного оператора ( ?: , Но это, возможно, устарело с нескольких версий.
  • 0
    Вы всегда используете если ... то на любом языке. Но и в других языках предусмотрены такие ярлыки, как тенарный оператор в C ... и в более поздних версиях Python есть сопоставимая конструкция "foo if a else b", насколько я могу вспомнить (некрасиво или некрасиво ... это другая тема).
Показать ещё 2 комментария
1

В этом примере это немного бессмысленно, потому что вызывается так:

instance.some_method() 

Выдает ошибку.

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

instance.some_method(None)

Было бы лучше:

def some_method(self, path=None):
   path = os.path.abspath(os.path.expanduser(path or ""))

Или возможно:

def some_method(self, path=""):
   path = os.path.abspath(os.path.expanduser(path))

... который не будет защищать от значения None. Можно обсуждать, лучше ли в этом случае скулить или "по умолчанию".

В любом случае путь можно вообще не указывать:

instance.some_method()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню