Что такое объект «NoneType»?


87

Я получаю эту ошибку, когда запускаю свой скрипт python:

TypeError: cannot concatenate 'str' and 'NoneType' objects

Я почти уверен, что «str» означает строку, но я не знаю, что такое объект «NoneType». Мой скрипт не справляется со второй строкой, я знаю, что первая работает, потому что команды из этой строки находятся в моем asa, как я и ожидал. Сначала я подумал, что это может быть потому, что я использую переменные и пользовательский ввод внутри send_command.

Все в CAPS - это переменные, все в нижнем регистре вводится из параметров parser.add_option.

Я использую pexpect и optparse

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + group + V3AUTHCMD + snmphmac + snmpauth + PRIVCMD + snmpencrypt + snmppriv)

2
Нам нужно увидеть больше кода и вводимых данных - NoneTyoe означает, что одна из переменных не была установлена
мммммм

3
NoneType- это тип одноэлементного значения None. Одно из ваших значений не является строкой.
Martijn Pieters

Quick & Dirty: поместите каждый термин для объединения в str()str (SNMPSRVUSRCMD) + str (snmpuser) + ...
PeterMmm

2
@PeterMmm Это ужасная идея - проблема просто проявит себя (возможно, даже хуже) в дальнейшем. Лучше сначала выяснить, почему одна из переменных - None.
arshajii

Ответы:


82

NoneType- это тип Noneобъекта, который не указывает значения . None- это возвращаемое значение функций, которые «ничего не возвращают». Это также обычное возвращаемое значение по умолчанию для функций, которые что-то ищут и могут это найти, а могут и не найти; например, он возвращается, re.searchкогда регулярное выражение не совпадает или dict.getкогда ключ не имеет записи в dict. Вы не можете добавлять Noneстроки или другие объекты.

Одна из ваших переменных - это Noneне строка. Возможно, вы забыли сделать это returnв одной из своих функций, или, может быть, пользователь не предоставил параметр командной строки и optparseдал вам значение Noneэтого параметра. Когда вы пытаетесь добавить Noneк строке, вы получаете исключение:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

Одно из groupили SNMPGROUPCMDили V3PRIVCMDимеет Noneсвоим значением.


Благодарность!! Вы правы, один из моих вариантов ввода пользователя по какой-то причине не использовался. Я добавил это как «имя», а не вариант и бум, это сработало. Теперь мне просто нужно выяснить, почему этот вариант не используется должным образом, все остальные варианты работают нормально.
insecure-IT

1
«Not set» - это немного расплывчато ... если переменная не определена, и вы пытаетесь выполнить с ней какую-то операцию, вы должны получить NameError. Его также можно было установить, но равным None(«установить в ничто» = «не задано»?), Тогда вы могли бы получить их TypeError.
Nick T

В основном (здесь для разработчиков C / Java) none = null
Зои

23

NoneTypeэто просто тип Noneсинглтона:

>>> type(None)
<type 'NoneType'>

Из последней ссылки выше:

None

Единственное значение типа NoneType. Noneчасто используется для обозначения отсутствия значения, когда аргументы по умолчанию не передаются функции. Назначения Noneявляются незаконными и повышают квалификацию SyntaxError.

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


21

В целях защитного программирования перед использованием объекты должны быть проверены на недействительность.

if obj is None:

или

if obj is not None:

2
«is» следует использовать только в случае необходимости. Лучшее защитное программирование - это тесты, множество тестов.
Юрген А. Эрхард

2
Защитное программирование - одна из самых злых вещей. Если вы обнаружите такую ​​ошибку, это означает, что вы допустили ошибку при программировании. Такие вещи, как «проверка нуля перед использованием» только скрывают некоторые серьезные ошибки. Вы должны позволить исключить исключение. И не заставляйте программистов выдавать какие-то особые исключения, это действительно громоздко. Пусть будет выброшена естественная ошибка. Фактически, защитное программирование - это признак того, что вам следует использовать другой язык.
bzim

Я запрашиваю базу данных через sqlAlchemy. Нет результата. Возвращенный объект - Нет. Что означает отсутствие результата. Ошибки нет. Вы проверяете, нет ли результата, если нет, вы используете объект результата. Ничего плохого в этом нет. Самое плохое в программировании - это догматизм.
unity100

17

Это означает, что вы пытаетесь связать строку с чем-то, что есть None.

None не является нулевым значением Python, а NoneTypeявляется его типом.

Этот код вызовет такую ​​же ошибку:

>>> bar = "something"
>>> foo = None
>>> print foo + bar
TypeError: cannot concatenate 'str' and 'NoneType' objects


2

В сообщении об ошибке, вместо того, чтобы сообщить вам, что вы не можете объединить два объекта, показывая их значения (строку и Noneв этом примере), интерпретатор Python сообщает вам об этом, показывая типы объектов, которые вы пытались объединить. Тип каждой строки - это strпока вызывается тип единственного Noneэкземпляра NoneType.

Обычно вам не нужно беспокоиться об этом NoneType, но в этом примере это необходимо знать type(None) == NoneType.


У меня очень похожая проблема, и я пытаюсь определить, является ли объект NoneType, ваше утверждение не работает для меня: >>> type(key) <type 'NoneType'> >>> type(key) == NoneType Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined
RuBiCK

2
@RuBiCK NoneTypeнигде не определен ( насколько мне известно). Если вы хотите проверить, есть ли значение None, просто используйте key is None(см. Stackoverflow.com/questions/23086383/… ). В противном случае вы могли бы использовать type(key) == type(None)тот же эффект.
Feuermurmel 03

1

Ваша ошибка возникает примерно из-за этого: >>>
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

Объект Python None примерно эквивалентен null , nil и т. Д. На других языках.


0

Одна из переменных не имеет значения, поэтому это NoneType. Вам придется разобраться, почему это так, вероятно, это простая логическая ошибка с вашей стороны.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.