Що таке об'єкт 'NoneType'?


87

Я отримую цю помилку під час запуску мого сценарію python:

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

Я майже впевнений, що 'str' означає рядок, але я не знаю, що таке об'єкт 'NoneType'. Мій сценарій виривається з другого рядка, я знаю, що перший працює, тому що команди з цього рядка знаходяться в моєму азі, як я і очікував. Спочатку я думав, що це може бути тому, що я використовую змінні та користувацькі введення всередині 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. Одне з ваших значень - це не рядок.
Мартін Пітерс

Швидке і брудне: кожен термін об'єднати в str()str (SNMPSRVUSRCMD) + str (snmpuser) + ...
PeterMmm

2
@PeterMmm Це жахлива ідея - проблема просто проявиться (можливо, гірше) далі. Для початку було б краще з’ясувати, чому однією зі змінних є None.
arshajii

Відповіді:


82

NoneType- це тип Noneоб’єкта, який є об’єктом, що не вказує значення . None- це значення функції, яке "нічого не повертає". Це також загальне значення повернення за замовчуванням для функцій, які щось шукають, а можуть і не знайти; наприклад, він повертається до, re.searchколи регулярний вираз не збігається, або dict.getколи ключ не має запису в дикті. Ви не можете додавати Noneдо рядків або інших об'єктів.

Однією з ваших змінних є None, а не рядок. Можливо, ви забули returnв одній зі своїх функцій, або, можливо, користувач не optparseвказав параметр командного рядка і вказав вам значення Noneцього параметра. При спробі додати Noneдо рядка ви отримуєте такий виняток:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

Один з groupабо SNMPGROUPCMDабо V3PRIVCMDмає в Noneякості свого значення.


Дякую!! Ви, де правильно, один із моїх варіантів введення з якихось причин не брав. Я додав це як "ім'я" проти опціону та буму, це спрацювало. Тепер мені просто потрібно з'ясувати, чому це не сприймається належним чином як варіант, всі інші варіанти працюють нормально.
unsure-IT

1
"Не встановлено" трохи розмито ... якщо змінна не визначена, і ви намагаєтесь виконати з нею якусь операцію, ви повинні отримати файл NameError. Його також можна встановити, але дорівнювати None("встановити на ніщо" = "не встановити"?), Тоді ви можете отримати TypeError.
Nick T

В основному (для людей з C / Java тут) none = null
Зої

23

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

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

З останнього посилання вище:

None

Єдине значення типу NoneType. Noneчасто використовується для представлення відсутності значення, як-от коли аргументи за замовчуванням не передаються функції. Призначення Noneє незаконними та піднімають aSyntaxError .

У вашому випадку це схоже на те, що одним із елементів, який ви намагаєтесь об’єднати, є Noneваша помилка.


21

Для захисного програмування перед використанням об'єкти слід перевіряти на відсутність.

if obj is None:

або

if obj is not None:

2
"є" слід використовувати лише тоді, коли це вам потрібно. Найкраще захисне програмування - це тести, багато тестів.
Юрген А. Ерхард

2
Оборонне програмування - одна з найзлобніших речей. Якщо ви виявили таку помилку, це означає, що ви помилилися при програмуванні. Такі речі, як "перевірка на нуль перед використанням", приховує лише серйозні помилки. Ви повинні дозволити виключенню. І не змушуйте програмістів кидати якийсь спеціальний виняток, це дійсно громіздко. Нехай буде викинута природна помилка. Насправді оборонне програмування є симптомом того, що вам слід використовувати іншу мову.
bzim

Я запитую базу даних за допомогою sqlAlchemy. Результату немає. Повернений об'єкт - None. Що означає відсутність результату. Помилки немає. Ви перевіряєте, чи немає результату жодного, якщо ні, використовуєте об'єкт результату. Нічого лихого в цьому немає. Найбільше зла в програмуванні - це догматизм.
union100

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

1

Ваша помилка виникає через щось подібне: >>>
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

Об'єкт None Python None приблизно є еквівалентом null , nil тощо в інших мовах.


0

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.