Какой самый элегантный способ использовать операнды> и <, когда переменные могут иметь значение Nonetype в python3? - PullRequest
0 голосов
/ 10 июля 2020

В python3 использование операнда > или < в NoneType приведет к ошибке TypeError.

Например, при сравнении двух дат я могу использовать:

a = datetime(...)
b = datetime(...)

if a < b:
   // do something

Но если a = None по какой-то причине (например, это результат функции), то это приводит к:

'<' not supported between instances of 'NoneType' and 'DateTime'

В python2 это будет оцениваться как True.

Если a и b являются переменными и могут быть datetime или None, , и я хочу пропустить сравнение, если любое из значений None, какое самое элегантное способ решить эту проблему?

Например, следующее работает, но кажется, что есть лучший однострочный подход?

if a and b:
   if a < b:
       // do something

Ответы [ 4 ]

2 голосов
/ 10 июля 2020

Поскольку здесь вы используете объекты, а не числа, я бы использовал go с коротким и явным выражением:

if (a and b) and (a < b):
    # Do something

Если a или b равны None, он будет короткое замыкание, и сравнение никогда не выполняется.

2 голосов
/ 10 июля 2020

Вы можете использовать оператор or:

a = None
b = 1    
int(a or 0) < b 

Вывод:

True

int(a or 0) возвращает 0, если a равно None, в противном случае он вернет a (если a - число) .

ОБНОВЛЕНИЕ: для ответа на обновленный вопрос:

if None not in [a,b]: # if neither values are None
    # Do something
1 голос
/ 10 июля 2020

Вы можете использовать расширенный оператор if, но я обычно предпочитаю использовать блок try. Это в конечном итоге становится очень читабельным и явно обрабатывает TypeErrors, а также обеспечивает относительно удобный способ обработки других ошибок, которые могут возникнуть по конвейеру.

try:
  if a < b:
    do_the_thing()
except TypeError:
  handle_bad_types()
0 голосов
/ 10 июля 2020
import datetime

# a, b can be datetime objects, or None
a = datetime.datetime.now()
b = None

if a is not None and b is not None:
    print("Neither values are None, do your operation here.")
else:
    print("One or both the values are None, operation was not performed.")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...