什么是“ 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表示尚未设置变量之一
mmmmmm

3
NoneType是单例值的类型None。您的值之一不是字符串。
马丁·彼得斯

快速与肮脏:将每个术语连接成str()str(SNMPSRVUSRCMD)+ str(snmpuser)+ ...
PeterMmm 2014年

2
@PeterMmm这是一个糟糕的主意-问题只会进一步显现(也许更糟)。最好弄清楚为什么变量之一为无。
arshajii 2014年

Answers:


82

NoneTypeNone对象的类型,即没有任何值的对象。None是“什么都不返回”的函数的返回值。它也是搜索某些内容或可能找不到的函数的常见默认返回值。例如,re.search当正则表达式不匹配,或者dict.get字典中的键没有条目时,返回该值。您不能添加None到字符串或其他对象。

您的变量之一是None,而不是字符串。也许你忘了return在你的功能之一,也可能用户没有提供命令行选项,optparse给你None该选项的值。当您尝试添加None到字符串时,会出现该异常:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

其中一个groupSNMPGROUPCMDV3PRIVCMDNone其价值。


谢谢!!没错,我的用户输入选项之一由于某种原因没有被采用。我将其添加为“名称”与选项和繁荣的比较,它确实有效。现在,我只需要找出为什么这不能作为一个选项,所有其他选项都可以正常工作。
insecure-IT

1
“未设置”有点含糊...如果未定义变量,而您尝试对其执行某些操作,则应该得到一个NameError。也可以设置它,但等于None(“ set to none” =“ not set”?),那么您可能会得到一些TypeError
尼克T

基本上(对于这里的C / Java人员而言)none = null
Zoe

23

NoneType只是None单例的类型:

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

从上面的后一个链接:

None

类型的唯一值NoneTypeNone通常用于表示不存在值,因为默认参数未传递给函数时。对的转让None是非法的,并提出了要求SyntaxError

在您的情况下,您似乎要连接的项之一是None,因此出现了错误。


21

为了进行防御性编程,应在使用之前检查对象是否为空。

if obj is None:

要么

if obj is not None:

2
仅在需要时才使用“ is”。最好的防御性编程是测试,很多测试。
于尔根A.艾哈德

2
防御性编程是最邪恶的事情之一。如果发现这样的错误,则表示您在编程时出错。诸如“使用前检查是否为空”之类的东西只会隐藏一些严重的错误。您应该让异常被抛出。而且不要让程序员抛出一些自定义异常,这确实很麻烦。让自然错误抛出。实际上,防御性编程是您应该使用另一种语言的症状。
bzim

我通过sqlAlchemy查询数据库。没有结果 返回的对象为None。这意味着没有结果。没有错误。您检查结果是否为空,否则使用结果对象。没什么可恶的。编程最邪恶的是教条主义。
unity100

17

这意味着您正在尝试将字符串与相连None

没有一个是Python的“ null”,NoneType它是它的类型。

此代码将引发相同类型的错误:

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


2

在错误消息中,NonePython解释器没有通过显示两个对象的值(在此示例中为字符串)来告诉您不能将其连接,而是通过显示您尝试连接的对象的类型来告诉您。每个字符串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 2015年

2
@RuBiCKNoneType没有在任何地方定义(我知道)。如果要检查值是否为Nonekey 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'

Python的None对象在其他语言中大致等效于nullnil等。


0

变量之一没有任何值,因此它是NoneType。您必须研究为什么会这样,这对您来说可能是一个简单的逻辑错误。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.