Замена null в Python: эквивалент оператора C# в Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для эмуляции оператора объединения с null из C# (??) в Python используется оператор or. Он возвращает первый операнд, если он истинен (то есть интерпретируется как True), и второй — в противном случае:

Python
Скопировать код
ничего_здесь = None
запасной_вариант = "второстепенный"
результат = ничего_здесь or запасной_вариант  # "второстепенный"

Однако учтите, что оператор or реагирует не только на None, но и на другие значения, воспринимаемые как ложные (например, 0, False, пустые коллекции). Чтобы проверить именно на None, можно применить оператор присваивания (:=):

Python
Скопировать код
результат = запасной_вариант if (ничего_здесь := запасной_вариант) is not None else ничего_здесь
Кинга Идем в IT: пошаговый план для смены профессии

Альтернативные способы реализации объединения с null

Метод .get() в Python — это замечательный инструмент при работе со словарями. Он пытается извлечь значение по ключу, а если его нет, возвращает заданное значение по умолчанию:

Python
Скопировать код
предпочтения = {'цветовой_узор': 'камуфляж'}
цветовой_узор = предпочтения.get('цветовой_узор', 'умолчание')  # 'камуфляж'
отсутствующий_ключ = предпочтения.get('отсутствующий_ключ', 'умолчание')  # 'умолчание'

Применение объединения с null для вложенных словарей

Работая с вложенными структурами, можно использовать метод .get() по цепочке, избегая тем самым ошибок, связанных с неприсутствием ключей:

Python
Скопировать код
суперпредпочтения = {'предпочтения': {'цветовой_узор': 'камуфляж'}}
цветовой_узор = суперпредпочтения.get('предпочтения', {}).get('цветовой_узор', 'умолчание')  # 'камуфляж'

Ещё один вариант — функция getattr(). Она позволяет безопасно получать атрибуты объектов:

Python
Скопировать код
class Предпочтения:
    цветовой_узор = 'камуфляж'

префс = Предпочтения()
цветовой_узор = getattr(префс, 'цветовой_узор', 'неон')  # 'камуфляж'

Следите за обновлениями PEP 505 — он может принести улучшения в работе с None в Python.

Остерегайтесь подводных камней

Будьте внимательны: оператор or всегда оценивает оба операнда, даже если первый уже истинен:

Python
Скопировать код
# Найдем первое истинное значение
первое_найденное = 0 or дорогая_операция()  # дорогая_операция() будет выполнена в любом случае

При использовании reduce и lambda следует помнить, что они не поддерживают краткую схему вычисления:

Python
Скопировать код
from functools import reduce

# Может вызвать все функции, даже если одна из них возвращает истинное значение
значение = reduce(lambda x, y: x or y, [дорогая_функция(), еще_одна_дорогая_функция()], 'умолчание')

При применении .get() использование фолбека в виде пустого словаря {} помогает при работе с вложенными словарями и предотвращает исключения.

Продвинутые приемы реализации объединения с null

Для доступа к атрибутам с несколькими уровнями вложенности можно использовать функцию с рекурсивным спуском:

Python
Скопировать код
def безопасный_getattr(объект, путь_к_атрибуту, запасное=None):
    атрибуты = путь_к_атрибуту.split('.')
    for attr in атрибуты:
        объект = getattr(объект, attr, None)
        if объект is None:
            return запасное
    return объект

конфиг = Config()
значение = безопасный_getattr(конфиг, 'предпочтения.цветовой_узор', 'неон')  # 'неон'

defaultdict обеспечивает автоматическое создание значений по умолчанию для отсутствующих ключей:

Python
Скопировать код
from collections import defaultdict

предпочтения = defaultdict(lambda: defaultdict(str))
предпочтения['цветовой_узор'] = 'камуфляж'
цветовой_узор = предпочтения['цветовой_узор']  # 'камуфляж'
также_отсутствующий_ключ = предпочтения['также_отсутствующий_ключ']  # Возвращает '' (пустую строку) по умолчанию

Визуализация

Представьте, что вы держите в руках таинственный подарок, который может быть пустым. Если внутри ничего нет (то есть None), оператор объединения с null подарит вам утешительный приз.

В C# это выглядит так: таинственная_шкатулка ?? "🧸" // Если шкатулка пуста, вы получите игрушечного медвежонка.

В Python подарок преобразуется в следующую инструкцию: таинственнаяшкатулка = таинственнаяшкатулка or "🧸" // Если шкатулка пуста, вам достанется игрушечный медвежонок.

Можно провести аналогию с резервным подарком, который гарантированно достанется вам, если основной подарок оказался разочаровывающим.

Полезные материалы

  1. PEP 505 – Операторы, учитывающие None — предложение по внедрению в Python поддержки объединения с null.
  2. Что нового в Python 3.8 — обзор возможностей оператора присваивания (:=).
  3. Обсуждение на Stack Overflow — отличное место для дискуссий о работе с None.
  4. Использование оператора or в Python — подробный обзор оператора or.
  5. Типы контейнеров данных в collectionsdefaultdict как решение для реализации объединения с null.
  6. ChainMap в collections — подходит для решения сложных задач.
  7. Обработка ошибок и исключений в Python — всё, что вам нужно знать о работе с исключениями.