Python: несколько возможных значений для аргументов функции - PullRequest
5 голосов
/ 08 ноября 2010

Я унаследовал некоторый код Python, который выглядит следующим образом:

name = 'London'
code = '0.1'
notes = 'Capital of England'
ev = model.City(key=key, code=code, name=name or code, notes=notes)

В духе обучения я хотел бы знать, что происходит с аргументом name or code. Это говорит: «Используйте name, если оно не равно нулю, в противном случае используйте code»?

И каков технический термин для обозначения нескольких возможных аргументов, подобных этому, чтобы я мог прочитать об этом в документации по Python?

Спасибо!

Ответы [ 6 ]

13 голосов
/ 08 ноября 2010

Почти. Он говорит использовать имя, если оно не оценивается как ложное . Вещи, которые оцениваются как ложные включают, но не ограничиваются:

  • False
  • пустых последовательностей ((), [], "")
  • пустых отображений ({})
  • 0
  • None

Редактировать Добавлена ​​ссылка, предоставленная SilentGhost в его комментарии к ответу.

7 голосов
/ 08 ноября 2010

В python оператор or возвращает первый операнд, если только он не оценивается как false, в этом случае он возвращает второй операнд. В действительности это будет использовать name, с запасным значением по умолчанию code, если name не указано.

1 голос
/ 08 ноября 2010

Исправьте, что идиома принимает первое значение, которое оценивается как True (обычно не None).Используйте с осторожностью, поскольку действительные значения (например, ноль) могут быть непреднамеренно оставлены.Более безопасный подход - это что-то вроде:

if name is not None:
  # use name

или

name if name is not None else code
1 голос
/ 08 ноября 2010

Запустите консоль Python:

>>> name = None
>>> code = 0.1
>>> name or code
0.10000000000000001

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

0 голосов
/ 08 ноября 2010

В духе обучения я хотел бы знать, что происходит с аргументом имени или кода.Является ли это высказыванием «Использовать имя, если оно не равно нулю, в противном случае используйте код»?

Да, в принципе, но ноль в python может означать более чем одну вещь (пустая строка, нет ..)

как в вашем случае:

>>> name = 'London'
>>> code = 0.1
>>> name or code
'London'
>>> name = ''
>>> code = 0.1
>>> name or code
0.1000....

но странно, что параметр функции может быть целочисленным, а иногда - строкой.

Надеюсь, это поможет: =)

0 голосов
/ 08 ноября 2010

Это у вас примерно правильно, но «ноль» не совсем то, что решает. По сути, все, что будет иметь значение false (0, false, пустая строка ''), будет отображать вторую строку вместо первой. «x или y» в этом смысле эквивалентно:

если х: х
еще: у

Некоторые приставки:

x = ''
у = 'рев'
х или у
-'roar '
x = 'arf'
х или у
-'arf '
x = Ложь
х или у
-'рор

...