Каков питонический способ проверить, что оба значения равны None или not None вместе

У меня есть функция с двумя переменными, установленными по умолчанию на None

def foo(x, y=None, z=None):
    ...

Я хочу убедиться, что если они переданы, они оба не должны быть None.

Я сделал следующее:

if y is not None:
    assert z is not None

Но мне интересно, есть ли более элегантный способ сделать эту проверку.

Если только 1 из них - None, я хочу утверждать, а если оба - все в порядке.

Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
0
0
88
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

if (y is None) == (z is None):
   # both are None or both are not None
else:
  # one of them is None

Вы можете использовать оператор XOR, чтобы убедиться, что оба значения соответствуют вашим ожиданиям, но я не уверен, что это более читабельно или элегантно.

Assert not ((y is not None) ^ (z is not None))

Вам следует избегать использования инструкции assert, поскольку она предназначена для целей тестирования и отладки, а не для управления ходом программы.

def foo(x, y=None, z=None):
    if (y is None) == (z is None):
        # rest of your code here
    else:
        raise ValueError("Both y and z must be either None or not None")

С функциями any - all:

def foo(x, y=None, z=None):
    y_z = (y, z)
    if any(y_z): assert all(y_z)

Я думаю, что питоническим способом было бы просить прощения, а не разрешения, то есть не проверять оба значения и иметь дело с исключениями.

Если это невозможно в вашем случае, то я думаю, что это зависит от логики вашей функции.

Важно ли немедленно потерпеть неудачу, если y и z несовместимы? Вы на самом деле просто хотите убедиться, что z не является none, если y нет (что делает ваш код в настоящее время)? Важно ли сообщать вызывающей стороне, что аргументы противоречивы? Или вы просто хотите избежать ошибки? (пример: z имеет значение, но не y, может быть, это не вызывает ошибку, но выглядит как неправильный вызов. Если ваша функция является «общедоступной», в этом случае кажется хорошей практикой сбой. Если нет, вы можете не надо с этим разбираться)

Другие вопросы по теме