Зачем нужно «или по умолчанию» в этом python коде? - PullRequest
1 голос
/ 13 января 2020

Вот код all_jokes - это словарь, в котором некоторые категории сопоставлены с шутками.

def select_joke(category):
    jokes = all_jokes[category or 'default']
    shuffle(jokes)
    return jokes[0]

Ответы [ 4 ]

3 голосов
/ 13 января 2020

Возвращает значение клавиши default в поле all_jokes, если значение category не truey :

from random import shuffle

all_jokes = {
    'joke1': ['This is joke1'],
    'joke2': ['This is joke2'],
    'default': ['This is default joke']
}

def select_joke(category):
    jokes = all_jokes[category or 'default']
    shuffle(jokes)
    return jokes[0]

print("----------------------------------------")
print(f"input:{0} output:{select_joke(0)}")
print(f"input:{None} output:{select_joke(None)}")
print(f"input:{''} output:{select_joke('')}")
print("----------------------------------------")

Вывод:

----------------------------------------
input:0 output:This is default joke
input:None output:This is default joke
input: output:This is default joke
----------------------------------------
0 голосов
/ 13 января 2020

Python and и or операторы эквивалентны следующим выражениям if:

# NB: These work as intended for boolean values.
(a or b) is (a if a else b)
(a and b) is (b if a else a)
def select_joke(category):
    """Equivalent to your code."""
    jokes = all_jokes[category if category else 'default']
    shuffle(jokes)
    return jokes[0]

Это позволяет сайтам вызовов, которые прекрасно принимают 'default' шутки, проходить в '' или None. Код Python имеет тенденцию выглядеть более красиво при использовании or вместо выражений if, которые соответствуют этому шаблону (замена ложного значения другим), особенно если вы используете аргументы функции, которые по умолчанию равны ложному значению.


В качестве примечания вы можете упростить свою функцию с помощью random.choice:

def select_joke(category=None):
    return random.choice(all_jokes[category or 'default'])


select_joke()          # category will be 'default'.
select_joke('default') # category will be 'default'.
select_joke(None)      # category will be 'default'.
select_joke('')        # category will be 'default'.
select_joke('puns')    # category will be 'puns'.
0 голосов
/ 13 января 2020

Это означает,

, если category имеет значение false (или пусто или отсутствует), используйте «default» в качестве ключа .

Возможно, не зная остальной код, all_jokes - это словарь, который содержит параметр default.

0 голосов
/ 13 января 2020

Как и во многих других языках, or возвращает первый элемент, если он «правдив», второй - в противном случае.

В этом случае, если category равно 0, или нет, или пустой строка, et c., мы получаем all_jokes['default']. В противном случае мы получаем all_jokes[category].

...