什么是'NoneType'对象?

我在运行我的python脚本时遇到这个错误:

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

我很确定'str'是string,但是我不知道'NoneType'对象是什么。 我的脚本出现在第二行,我知道第一个工作,因为该行的命令是我所期望的。 起初我以为这可能是因为我在send_command中使用variables和用户input。

“CAPS”中的所有内容都是variables,“小写”中的所有内容都是从“parser.add_option”选项input的。

我正在使用pexpect,并optparse

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

NoneTypeNone对象的types,它是指示没有值的对象。 None是“不返回任何东西”的函数的返回值。 对于search某些内容的函数来说,这也是一个常见的默认返回值,可能会或可能找不到; 例如regex在regex不匹配时返回,或者dict.get在dict中没有input。 您不能将“ None添加到string或其他对象。

其中一个variables是None ,而不是string。 也许你忘了return你的一个函数,或者用户没有提供一个命令行选项, optparse给了你这个选项的值为None 。 当您尝试将None添加到string时,会出现该exception:

 send_command(child, SNMPGROUPCMD + group + V3PRIVCMD) 

groupSNMPGROUPCMDV3PRIVCMD具有None作为其值。

NoneType只是None单一types:

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

从上面的后面的链接:

None

types的唯一值NoneTypeNone经常用来表示没有值,因为当默认参数不传递给一个函数。 分配给None是非法的,并引发一个SyntaxError

在你的情况下,它看起来像你试图连接的项目之一是None ,因此你的错误。

这意味着你正试图连接一个string与None东西。

None是Python的“null”, NoneType是它的types。

这段代码会引发同样的错误:

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

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

 if obj is None: 

要么

 if obj is not None: 

在错误消息中,Python解释器通过显示您尝试连接的对象的types来告诉您这一点,而不是告诉您不能通过显示它们的值来连接两个对象(在本例中为string和None )。 每个string的types都是str而单个None实例的types被称为NoneType

您通常不需要关心NoneType ,但在此示例中,需要知道该type(None) == NoneType

在Python中,为了表示没有值,可以使用Nonetypes.NoneType.None None

你的错误是由于这样的事情发生的:
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
>>> 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等。

其中一个variables没有赋予任何价值,因此它是一个NoneType。 你将不得不考虑这是为什么,这可能是你的一个简单的逻辑错误。