2014-01-13 164 views
38

运行我的Python脚本,我得到这个错误:什么是'NoneType'对象?

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

我敢肯定的“海峡”的意思的字符串,但我不知道“NoneType”的对象是什么。我的脚本出现在第二行,我知道第一行是可行的,因为来自该行的命令与我所期望的一样。起初我以为这可能是因为我在send_command中使用变量和用户输入。在“加帽”

一切都是变量,“小写”一切都是从“parser.add_option”的选项输入。

我使用Pexpect的,和optparse

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

我们需要看到更多的代码和输入 - NoneTyoe意味着一个变量尚未设置 – Mark

+3

'NoneType'是单值'None'的类型。你的一个值不是一个字符串。 –

+0

Quick&Dirty:将每个项连接在'str()'str(SNMPSRVUSRCMD)+ str(snmpuser)+ ... – PeterMmm

回答

38
NoneType

对于None对象,它是一个对象,它表示没有类型。 None是“不返回任何东西”的函数的返回值。它也是搜索某些内容的函数的常见默认返回值,可能会或可能找不到;例如,在正则表达式不匹配时返回re.search,或者当密钥在字典中没有条目时返回dict.get。您不能将None添加到字符串或其他对象。

你的一个变量是None,而不是一个字符串。也许你在其中一个功能中忘记了return,或者用户可能没有提供命令行选项,并且optparse为该选项的值提供了None。当您尝试添加None为一个字符串,你会得到异常:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD) 

一个groupSNMPGROUPCMDV3PRIVCMDNone作为其值。

+0

谢谢!你在哪里正确,我的一个用户输入选项没有出于某种原因。我将这添加为一个“名称”与一个选项和繁荣,它的工作。现在我只需要找出为什么这个选项没有正确使用,所有其他选项都可以正常工作。 –

+1

“未设置”有点含糊......如果一个变量没有被定义,并且你试图用它来执行一些操作,你应该得到一个'NameError'。它也可以被设置,但是等于'None'(“set to nothing”=“not set”?),那么你可能会得到一些'TypeError'。 –

+0

基本上(对于C/Java的人在这里)none = null – Zoe

12

这意味着你正在试图将字符串的东西,是None

无是Python的“空”,并NoneType是其类型。

此代码将提高同样的错误:

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

NoneType仅仅是None单的类型:

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

从上面后者链接:

None

The sole value of the type NoneType . None is frequently used to represent the absence of a value, as when default arguments are not passed to a function. Assignments to None are illegal and raise a SyntaxError .

就你而言,它看起来就像你尝试的项目之一g连接是None,因此你的错误。

2

在Python,以表示不存在的值,则可以使用Nonetypes.NoneType.None

+0

对于Python 3,请参阅:https://stackoverflow.com/questions/21706609/where-the-nonetype-located-in-python-3-x – kkurian

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的对象大致相当于等其他语言。

2

在错误消息中,Python解释器不是通过显示它们的值来连接两个对象(而在本例中为字符串和None),而不是告诉您,而是通过显示您的对象的类型试图连接。每个字符串的类型是str,而单个None实例的类型被称为NoneType

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

+0

我有一个非常类似的问题,并试图检测对象是否为NoneType,您的肯定不适合我:>>> type(key) <类型 'NoneType'> >>>类型(键)== NoneType 回溯(最近通话最后一个): 文件 “”,1号线,在 NameError:名字 'NoneType' 不是defined' – RuBiCK

+2

@ RuBiCK'NoneType'没有在任何地方定义(我知道)。如果你想检查一个值是否为'None',只需使用'key is None'(参见http://stackoverflow.com/questions/23086383/how-to-test-nonetype-in​​-python)。否则,你可以使用'type(key)== type(None)'来达到同样的效果。 – Feuermurmel

7

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

if obj is None: 

if obj is not None: 
+2

注意,等号运算符'=='在这里不起作用。 – Danijel

+2

“是”只能在需要时使用。最好的防守编程是测试,很多测试。 –

0

一个变量还没有被赋予任意值,因此它是一个NoneType。你必须研究这是为什么,这可能是你的一个简单的逻辑错误。