У меня есть Nonetypeзначение x, обычно это число, но может быть None. Я хочу разделить его на число, но Python поднимает:
TypeError: int() argument must be a string or a number, not 'NoneType'
Как я могу это решить?
У меня есть Nonetypeзначение x, обычно это число, но может быть None. Я хочу разделить его на число, но Python поднимает:
TypeError: int() argument must be a string or a number, not 'NoneType'
Как я могу это решить?
int(None)выдает исключение, потому что None не может быть преобразовано в int. Ответ на ваш вопрос - это невозможно. Вы можете заменить что-нибудь, например 0, или 2771, или розового слона, но что бы вы ни заменили, вы все равно не сможете преобразовать None в int.
Noneв розового слона тоже бесполезно, если только вы не работаете с какой-либо системой счисления, которая формально определяет деление числа розовым слоном (и вы написали код для его поддержки)
Ответы:
В одном из комментариев вы говорите:
Каким-то образом я получил значение 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специально, вы можете использовать другое значение в качестве замены.
(value or 0)- без преобразования типа int - если мы уверены, что значение может быть только None или int
Распространенный «питонический» способ справиться с подобной ситуацией известен как 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 = int(my_value) / divisor
except TypeError:
answer = 0
Обратный и более традиционный подход известен как LBYL, что означает « Посмотрите, прежде чем прыгать » - это то, что предложили @Soviut и некоторые другие. Для дополнительного освещения этой темы см. Мой ответ и связанные с ним комментарии к вопросу. Определите, присутствует ли ключ в словаре где-либо еще на этом сайте.
Одна потенциальная проблема с EAFP заключается в том, что он может скрыть тот факт, что что-то не так с какой-то другой частью вашего кода или стороннего модуля, который вы используете, особенно когда исключения часто возникают (и поэтому на самом деле не являются «исключительными» случаями. совсем).
Это TypeErrorпоявляется только тогда, когда вы пытаетесь пройти int() None( NoneTypeнасколько я знаю, это единственное значение). Я бы сказал, что ваша настоящая цель должна заключаться не в преобразовании NoneTypeв intили str, а в том, чтобы выяснить, где и почему вы получаете Noneвместо ожидаемого числа, и либо исправить это, либо обработать Noneдолжным образом.
int()комплексного числа, например int(1+2j), также приведет TypeErrorк подъему a , хотя, по общему признанию, это, вероятно, очень маловероятно. Тем не менее, я думаю, вы скажете, что в целом это хороший совет, которому нужно следовать.
Я успешно использовал int (x или 0) для этого типа ошибки, пока None не должно равняться 0 в логике. Обратите внимание, что это также будет преобразовано в 0 в других случаях, когда проверка x возвращает False. например, пустой список, набор, словарь или строка нулевой длины. Извините, Киндалл уже дал этот ответ.
Это может произойти, если вы забудете вернуть значение из функции: тогда она вернет None. Посмотрите на все места, где вы назначаете эту переменную, и посмотрите, не является ли одно из них вызовом функции, в которой функция не имеет оператора возврата.
returnвместо return some_expression.
return Noneоператоров
Вы должны убедиться, что значение не равно None, прежде чем пытаться выполнить какие-либо вычисления с ним:
my_value = None
if my_value is not None:
print int(my_value) / 2
Примечание: my_value было намеренно установлено значение «Нет», чтобы доказать, что код работает и выполняется проверка.
is [not] None)
my_valueбезоговорочно устанавливаете значение None; Зачем? Вы не спрашиваете, почему ОП считает, что ему нужно что-то делать, int(my_value)когда my_value(если не Нет) «обычно число».
У меня была такая же проблема с использованием функций электронной почты 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