Перехват значения None с помощью «или» в выражении - PullRequest
1 голос
/ 28 апреля 2011

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

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

Моя первая реакция была "ааааа, плохо!" но если подумать ... так ли это?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

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

1 голос
/ 28 апреля 2011

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

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()
...