当我运行python脚本时,我得到了这个错误:
TypeError: cannot concatenate 'str' and 'NoneType' objects
我很确定"str"是指字符串,但我不知道"nonetype"对象是什么。我的脚本停在第二行,我知道第一行有效,因为来自该行的命令如我所期望的那样在我的ASA中。起初我认为这可能是因为我在send_命令中使用变量和用户输入。
"caps"中的所有内容都是变量,"小写"中的所有内容都是来自"parser.add"选项的输入。
我用的是pexpect和optparse
send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + group + V3AUTHCMD + snmphmac + snmpauth + PRIVCMD + snmpencrypt + snmppriv)
号
我们需要看到更多的代码,而input-noneteoe意味着其中一个变量尚未设置。
NoneType是单个值None的类型。其中一个值不是字符串。
快速&脏:将每个术语连接到str()str(snmpsrvuscrmd)+str(snmpuser)+
@彼得曼,这是一个可怕的想法——问题将进一步显现出来(也许更糟)。最好弄清楚为什么其中一个变量一开始就没有了。
考虑到关于NoneType的问题被提出、投票和保存的频率有多高,我认为python核心开发人员应该从错误消息中删除所有对NoneType的引用。它除了迷惑人们之外,没有其他目的。None不可重新分配(None=1不可能),是单例(NoneType的唯一实例),是关键字(因此在任何地方都可用,NoneType不是)。所以我不知道为什么这些错误不能仅仅把它称为None。这并不是说任何人可能会被"str"和"none"之间的连接和"wonder wait"混淆,这又是什么"none"?
NoneType是None对象的类型,该对象表示没有值。None是"不返回任何内容"函数的返回值。它也是搜索某些内容的函数的一个常见的默认返回值,可能会或可能不会找到它;例如,当regex不匹配时,它由re.search返回;当dict中没有条目时,它由dict.get返回。不能将None添加到字符串或其他对象。
其中一个变量是None,而不是字符串。也许你在某个函数中忘记了return,或者用户没有提供命令行选项,optparse给了你该选项的值None。当您试图将None添加到字符串中时,会得到以下异常:
send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
group或SNMPGROUPCMD或V3PRIVCMD中的一个值为None。
谢谢!!如果正确,出于某种原因,我的一个用户输入选项未被采用。我把它作为一个"名字"和一个选项加起来,很有效。现在我只需要找出为什么这不是一个正确的选择,所有其他的选择都工作得很好。
"not set"有点模糊……如果一个变量没有定义,并且您试图用它执行一些操作,那么您应该得到一个NameError。它也可以设置,但等于None(设置为Nothing"="Not Set"?)然后你可能会得到一些TypeError。
基本上(这里的C/Java用户)没有空
NoneType只是None单体的类型:
>>> type(None)
号
从上面的后一个链接:
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.
号
在您的例子中,您试图连接的项目之一是None,因此出现了错误。
这意味着您试图将字符串与None连接起来。
none是python的"null",NoneType是它的类型。
此代码将引发相同类型的错误:
>>> bar ="something"
>>> foo = None
>>> print foo + bar
TypeError: cannot concatenate 'str' and 'NoneType' objects
为了防御性编程,在使用前应该检查对象是否为空。
if obj is None:
。
或
if obj is not None:
注意,相等运算符==在这里不起作用。
"is"只能在需要时使用。最好的防御编程是测试,很多测试。
防御编程是最邪恶的事情之一。如果你发现这样的错误,这意味着你做了一个错误的编程。像"使用前检查空值"这样的东西只隐藏了一些严重的错误。您应该让异常被抛出。而且不要让程序员抛出一些定制的异常,这真的很麻烦。让自然错误被抛出。实际上,防御性编程是您应该使用另一种语言的症状。
在python中,为了表示没有值,可以使用None值types.NoneType.None。
对于python 3,请参见:stackoverflow.com/questions/21706609/…
在错误消息中,python解释器通过显示两个对象的值(在本例中是一个字符串和None)而不是告诉您不能连接两个对象,而是通过显示试图连接的对象的类型来告诉您这一点。每个字符串的类型是str,而单个None实例的类型称为NoneType。
您通常不需要关心NoneType,但在本例中,必须知道type(None) == NoneType。
我有一个非常类似的问题,试图检测对象是否是非类型的,你的肯定对我不起作用:>>> type(key) >>> type(key) == NoneType Traceback (most recent call last): File"", line 1, in NameError: name 'NoneType' is not defined。
@rubick NoneType在任何地方都没有定义(我知道)。如果要检查值是否为None,只需使用key is None(请参阅stackoverflow.com/questions/23086383/…)。否则,您可以使用type(key) == type(None)达到同样的效果。
发生错误的原因如下:>>> None +"hello world"
Traceback (most recent call last):
File"", line 1, in TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'>>
在其他语言中,python的none对象大致相当于null、nil等。
none type是none的类型。
请参阅以下文档:https://docs.python.org/2/library/types.html types.nonetype
其中一个变量没有给定任何值,因此它是非类型的。你得研究一下为什么会这样,这可能是你的一个简单的逻辑错误。