Как конвертировать Nonetype в int или string?



у меня есть Nonetype стоимостью x, это вообще число, но может быть None. Я хочу разделить его на число, но Python поднимает:



TypeError: int() argument must be a string or a number, not 'NoneType'


как я могу решить это?

600   10  

10 ответов:

в одном из комментариев, вы говорите:

каким-то образом я получил значение Nonetype, оно должно быть int, но теперь это объект Nonetype

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

если это чужой код, выясните условия, при которых он дает None и определить разумное значение для использования для этого, с обычным условным код:

result = could_return_none(x)

if result is None:
    result = DEFAULT_VALUE

...или вообще...

if x == THING_THAT_RESULTS_IN_NONE:
    result = DEFAULT_VALUE
else:
    result = could_return_none(x) # But it won't return None, because we've restricted the domain.

нет причин автоматически использовать 0 здесь-решения, которые зависят от "ложности" - ness None предположим, вы хотите этого. Элемент DEFAULT_VALUE (если он вообще существует) полностью зависит от назначения кода.

int(value or 0)

это будет использовать 0 в случае, когда вы предоставляете любое значение, которое Python считает False, например None, 0, [], "" и др. Поскольку 0 False, вы должны использовать только 0 в качестве альтернативного значения (в противном случае вы обнаружите, что ваши 0 превращаются в это значение).

int(0 if value is None else value)

это заменяет только None С 0. Так как мы тестируем для None в частности, вы можете использовать некоторые другие значения в качестве замены.

общий "Питонический" способ справиться с такой ситуацией известен как EAFP для "легче просить прощения, чем разрешения". Что обычно означает написание кода, который предполагает, что все в порядке, но затем обертывает его с помощью try..except блок на всякий случай, чтобы справиться с вещами, когда это не так.

вот, что стиль кодирования применяется к вашей проблемы:

try:
    my_value = int(my_value)
except TypeError:
    my_value = 0  # or whatever you want to do

answer = my_value / divisor

или, возможно, еще проще и немного быстрее:

try:
    answer = my_value / divisor
except TypeError:
    answer = 0

В обратный и более традиционный подход известен как LBYL что означает "семь раз отмерь " это то, что @Soviut и некоторые другие предложили. Для дополнительного освещения этой темы см. Мой ответ и связанные с этим комментарии к вопросу определить, присутствует ли ключ в словаре в другом месте на этом сайте.

одна потенциальная проблема с EAFP это то, что он может скрыть этот факт что-то не так с какой-то другой частью вашего кода или стороннего модуля, который вы используете, особенно когда исключения часто происходят (и поэтому на самом деле не являются "исключительными" случаями вообще).

это TypeError появляется только при попытке пройти int()None (который является единственным NoneType значение, насколько я знаю). Я бы сказал, что ваша настоящая цель не должна быть конвертировать NoneType до int или str, но чтобы выяснить, где / почему вы получаете None вместо числа, как ожидалось, и либо исправить его, либо обрабатывать None правильно.

Я успешно использовал int (x или 0) для этого типа ошибки, пока никто не должен равняться 0 в логике. Обратите внимание, что это также приведет к 0 в других случаях, когда тестирование x возвращает False. например, пустой список, набор, словарь или строка нулевой длины. Извините, Киндалл уже дал этот ответ.

Это может произойти, если вы забыли вернуть значение из функции: то он возвращает none. Посмотрите на все места, где вы назначаете эту переменную, и посмотрите, является ли один из них вызовом функции, где функция не имеет оператора return.

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

my_value = None
if my_value is not None:
    print int(my_value) / 2

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

У меня была такая же проблема с использованием функций электронной почты python. Ниже приведен код, который я пытался получить тему электронной почты в переменную. Это прекрасно работает для большинства электронных писем и переменной заполняется. Если вы получаете электронное письмо от Yahoo или тому подобное, и отправитель не заполнял строку темы Yahoo не создает строку темы в электронном письме, и вы получаете NoneType, возвращенный из функции. Мартино дал правильный ответ, а также Совет. Ответ IMO Soviut более лаконичен с точки зрения программирования; не обязательно с точки зрения Python. Вот некоторый код, чтобы показать технику:

import sys, email, email.Utils 

afile = open(sys.argv[1], 'r')    
m = email.message_from_file(afile)    
subject = m["subject"]

# Soviut's Concise test for unset variable.

if subject is None:    
     subject = "[NO SUBJECT]"

# Alternative way to test for No Subject created in email (Thanks for NoneThing Yahoo!)

try:    
    if len(subject) == 0:    
        subject = "[NO SUBJECT]"

except TypeError:    
    subject = "[NO SUBJECT]"

print subject

afile.close()

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

def nz(value):

    '''
    Convert None to int zero else return value.
    '''

    if value == None:
        return 0
    return value

в Python 3 вы также можете использовать ключевое слово "или". Вот так:

foo = bar or 0
foo2 = bar or ""

Comments

    Ничего не найдено.