什么是'NoneType'对象?

时间:2014-01-13 15:58:06

标签: python null nonetype

运行python脚本时出现此错误:

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

我很确定'str'意味着字符串,但我不知道'NoneType'对象是什么。我的脚本在第二行开始了,我知道第一行是有效的,因为来自该行的命令在我的asa中,正如我所期望的那样。起初我以为可能是因为我在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)

11 个答案:

答案 0 :(得分:57)

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

您的一个变量是None,而不是字符串。也许您在某个函数中忘记了return,或者用户没有提供命令行选项,而optparse为您提供None该选项的值。当您尝试将None添加到字符串时,会出现该异常:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

其中一个groupSNMPGROUPCMDV3PRIVCMD的值为None

答案 1 :(得分:18)

NoneType只是None单身人士的类型:

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

从上面的链接开始:

  

<强> None

     

NoneType类型的唯一值。 None经常用于表示缺少值,因为默认参数未传递给函数。分配给None是非法的,并提出SyntaxError

在您的情况下,看起来您尝试连接的项目之一是None,因此您的错误。

答案 2 :(得分:15)

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

连接起来

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

此代码会引发同样的错误:

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

答案 3 :(得分:8)

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

if obj is None:

if obj is not None:

答案 4 :(得分:3)

在Python中,为了表示缺少值,您可以使用Nonetypes.NoneType.None

答案 5 :(得分:2)

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

您通常不需要关注NoneType,但在此示例中,有必要了解type(None) == NoneType

答案 6 :(得分:1)

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

Python的对象大致等同于其他语言中的 null nil 等。

答案 7 :(得分:0)

其中一个变量没有给出任何值,因此它是一个NoneType。您必须查看原因,这可能是您的简单逻辑错误。

答案 8 :(得分:0)

非类型是无类型。

请参阅此处的文档: https://docs.python.org/2/library/types.html#types.NoneType

答案 9 :(得分:0)

当你在函数(def)而不是return中使用print时,它基本上是大小写的

def add(a, b):
    print(a+ b)

x = add(5,5)
print(x)
print(type(x))

y = x + 545
print(y)

TypeError: 不支持 + 的操作数类型:'NoneType' 和 'int'

def add(a, b):
    return (a+ b)

x = add(5,5)
print(x)
print(type(x))

10
<class 'int'>
555

答案 10 :(得分:0)

在 Python 中

  • NoneType 是 None 对象的类型。
  • 只有一个这样的对象。 因此,“a None object”和“the None object”和 “无”是表示同一件事的三种等效方式。
  • 由于所有的 None 都是相同的,而且不仅相等, 在您的代码中,您应该更喜欢 x is None 而不是 x == None
  • 在常规 Python 中,您将在许多地方获得 None 接受的答案指出的代码。
  • 您还将在自己的代码中获得 None 使用不以结尾的函数的函数结果 return myvalue 等。

代表:

  • 在某些但不是所有版本的 Python 中有 NoneType 类型, 见下文。
  • 当你执行print(type(None))时,你会得到 <type 'NoneType'>
    这是由 __repr__NoneType 方法产生的。
    请参阅documentation of repr 和那个 magic functions (或“dunder 函数”用于d分数)一般。

在 Python 2.7 中

在 Python 3.0 到 3.9 中

  • NoneType 已被 removedmodule types, 大概是因为这种类型只有一个值。
  • 尽管如此,它确实存在,只是没有内置名称: 您可以通过编写 type(None) 来访问 NoneType。
  • 如果您想要返回 NoneType,只需定义 NoneType = type(None)

在 Python 3.10+ 中