Тернарный оператор возвращает `True` вместо заданного значения - PullRequest
4 голосов
/ 07 ноября 2011

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

>>> digits = '123456'

>>> conv_d = digits != None if int(digits) else None

>>> conv_d
>>> True

>>> int(digits)
>>> 123456

Объясните мне, пожалуйста, как это происходит?В чем логическая разница между троичным оператором и регулярным условным выражением в Python?

Ответы [ 4 ]

7 голосов
/ 07 ноября 2011

int(digits) == 123456, что является истинным значением.Так что conv_d = digits != None.Поскольку digits не равно None, conv_d установлено в true.

Возможно, вы хотели это:

conv_d = int(digits) if digits is not None else None

Помните, что строка, содержащая что-то, не являющееся числом, вызоветисключение, хотя!Если вы предпочитаете 0 или Нет для этих значений, напишите небольшую функцию:

def toint(s):
    try:
        return int(s)
    except (ValueError, TypeError):
        return None # or 0
5 голосов
/ 07 ноября 2011

Условный оператор Python находится не в том же порядке, что и в других языках. И вам никогда не следует сравнивать равенство с None, если вы не уверены, что вам нужно.

conv_d = int(digits) if digits is not None else None
0 голосов
/ 07 ноября 2011

Обратите внимание, как размещаются ключевые слова. «X, если Y еще Z». «Y» - это часть, которая следует за «если», то есть это условие. «X, если Y» - совершенно правильная (хотя и менее распространенная) английская конструкция, означающая то же самое, что и «если Y, X», поэтому X - это выражение, вычисляемое, когда Y удовлетворяется. Z - выражение, вычисленное, когда Y не удовлетворяется, аналогично.

0 голосов
/ 07 ноября 2011

Альтернативы троичным операторам:

conv_d = цифры! = Нет и int (цифры) или Нет # короткое замыкание; просто неправильно в этом контексте, поскольку он не работает для цифр = "0" - см. комментарии ниже

или

conv_d = int (цифры), если цифры не None, иначе None

Второе выражение более четкое, поэтому предпочтительнее.

...