Как преобразовать Nonetype в int или string?

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

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

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

  • Как я могу вызвать скрипт python из сценария python
  • Получение индекса возвращаемого значения max или min с помощью max () / min () в списке
  • API GoogleMaps -address для координат (широта, долгота)
  • Python: простой способ игнорировать пустые строки при чтении файла
  • Перезаписать глобальный var в одной строке в Python?
  • Python - TypeError: float object не вызываемая ошибка
  • Как выставить функцию, возвращающую объект C ++, на Python без копирования объекта?
  • Заголовок Access-Control-Allow-Origin в Google App Engine
  • 8 Solutions collect form web for “Как преобразовать Nonetype в int или string?”

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

    Как-то я получил значение 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 – решения, зависящие от «ложности» None предполагают, что вы захотите этого. DEFAULT_VALUE (если он существует) полностью зависит от цели вашего кода.

     int(value or 0) 

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

     int(0 if value is None else value) 

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

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

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

     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) для этого типа ошибки, если в логике None должно равняться 0. Обратите внимание, что это также решится на 0 в других случаях, когда тестирование x возвращает False. например, пустой список, набор, словарь или нулевую длину. Извините, Киндалл уже дал этот ответ.

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

    У меня была такая же проблема с использованием функций электронной почты python. Ниже приведен код, в котором я пытался получить объект электронной почты в переменной. Это отлично подходит для большинства электронных писем, а переменная заполняется. Если вы получили электронное письмо от Yahoo и т. П., И отправитель не заполнил строку темы. Yahoo не создает строку темы в электронном письме и вы получите NoneType, возвращаемый функцией. Мартино дал правильный ответ, а также Совету. Ответ ИМО Совюта более краток с точки зрения программирования; не обязательно из 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, прежде чем пытаться выполнить любые вычисления на нем:

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

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

    Python - лучший язык программирования в мире.