Один лайнер, чтобы «назначить, если не None» - PullRequest
0 голосов
/ 17 января 2020

Есть ли способ выполнить назначение, только если назначенное значение не равно None, а в противном случае ничего не делать?

Конечно, мы можем сделать:

x = get_value() if get_value() is not None

, но это будет читать значение в два раза. Мы можем кэшировать его в локальную переменную:

v = get_value()
x = v if v is not None

, но теперь мы сделали две инструкции для простой вещи.

Мы могли бы написать функцию:

def return_if_not_none(v, default):
    if v is not None:
        return v
    else:
        return default

А потом сделай x = return_if_not_none(get_value(), x). Но, безусловно, уже существует идиома Python для выполнения sh, без двойного доступа к x или get_value() и без создания переменных?

Другими словами, скажем, =?? - это Оператор Python аналогичен оператору C# null coalesce . В отличие от C# ??=, наш вымышленный оператор проверяет, является ли правая сторона None:

x = 1
y = 2
z = None

x =?? y
print(x)   # Prints "2"

x =?? z
print(x)   # Still prints "2"

Такой оператор =?? будет делать именно то, что задает мой вопрос.

1 Ответ

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

В python 3.8 вы можете сделать что-то вроде этого

if (v := get_value()) is not None:
    x = v

Обновлено на основе решения Райана Хейнинга, см. В комментариях

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