什么是'NoneType'对象?

133

运行我的Python脚本时,我遇到了这个错误:

TypeError: cannot concatenate 'str' and 'NoneType' objects
我很确定'str'代表字符串,但我不知道'NoneType'对象是什么。我的脚本在第二行失败了,我知道第一行有效,因为我预计的命令都在我的 asa 中。起初我认为这可能是因为我正在使用变量和用户输入来发送命令。
所有大写字母都是变量,所有小写字母都是由 'parser.add_option' 选项输入的内容。
我正在使用pexpect和optparse。
send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + group + V3AUTHCMD + snmphmac + snmpauth + PRIVCMD + snmpencrypt + snmppriv)

2
我们需要看更多的代码和输入 - NoneType 表示其中一个变量尚未设置。 - mmmmmm
5
NoneType 是表示单例值 None 的类型。你的其中一个值不是字符串。 - Martijn Pieters
快速而不精确的方法:将要连接的每个术语放入 str() 中 str(SNMPSRVUSRCMD) + str(snmpuser) + ... - PeterMmm
4
@PeterMmm 那是个糟糕的想法——问题只会在以后更严重地显现出来。最好先弄清楚为什么其中一个变量一开始就是None。 - arshajii
13个回答

118

NoneTypeNone对象的类型,它表示没有值。当函数“不返回任何内容”时,None是函数的返回值。它也是用于搜索某些东西但可能找到或未找到的函数的常见默认返回值。例如,当正则表达式不匹配时,re.search返回None,当字典中没有对应键值对时,dict.get返回None。您无法将None添加到字符串或其他对象中。

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

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

其中一个groupSNMPGROUPCMDV3PRIVCMD的值为None


1
谢谢!你是正确的,我的一个用户输入选项由于某种原因没有被接受。我将其添加为“名称”而不是选项,然后它就起作用了。现在我只需要找出为什么这个选项不能正常接受,所有其他选项都正常工作。 - insecure-IT
1
“Not set”有点含糊不清...如果一个变量未定义并且尝试使用它执行某些操作,则应该获得NameError。它也可以被设置为等于None(“设置为无”=“未设置”?),然后您可能会获得一些TypeError - Nick T
1
基本上(对于这里的C/Java人员),none = null。 - Zoe stands with Ukraine

37

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

if obj is None:
或者
if obj is not None:

4
如果需要,只有在必要时才应该使用 "is"。最佳的防御性编程是测试,大量的测试。 - Jürgen A. Erhard
5
防御式编程是最邪恶的事情之一。如果您发现这样的错误,这意味着您在编程时犯了一个错误。例如“在使用之前检查是否为空”的东西只是隐藏了一些严重的错误。应该让异常抛出。不要让程序员抛出自定义异常,这真的很麻烦。让自然错误被抛出。实际上,防御性编程是您应该使用另一种语言的症状。 - bzim
7
我使用sqlAlchemy查询数据库,但没有结果。返回的对象是None,这意味着没有结果。没有错误发生。你可以检查结果是否为none,如果不是,则使用结果对象。这并没有什么不好的。编程中最坏的事情是教条主义。 - unity100

29

NoneType 简单来说就是 None 的类型。

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

从上面的链接中:

 

None

    

NoneType类型的唯一值。 None 经常用于表示缺少值,例如当未将默认参数传递给函数时。对 None 的赋值是非法的并会引发 SyntaxError

在你的情况下,看起来你正在尝试连接其中一个项目 None,因此出现了错误。


除了在某些版本的Python中存在名为NoneType的类型之外。 - Lutz Prechelt
@LutzPrechelt,不包含NoneType的Python版本会出现错误:TypeError: cannot concatenate 'str' and 'NoneType' objects吗? - N8tron
@N8tron:是的。在那里,字符串“NoneType”只是一些错误消息的措辞,不是解释器需要识别的对象的内置名称。 - Lutz Prechelt

18

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

None是Python中的“null”,而NoneType是其类型。

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

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

11
  • NoneTypeNone对象的类型。
  • 只有一个这样的对象。 因此,"a None object"、"the None object"和"None"是说同一件事的三种等效方式。
  • 由于所有的Nones都是相同的且仅仅相等,你应该在代码中使用x is None而不是x == None
  • 如所接受的答案所指出的那样,在正常的Python代码中,您将在许多地方得到None
  • 当你使用不以return myvalue结尾的函数的结果时,你也会在自己的代码中得到None
  • 表现形式:

    • 在某些但不是所有版本的Python中存在一个类型NoneType,请参阅下文。
    • 当您执行print(type(None))时,您将得到<type 'NoneType'>
      这是由NoneType__repr__方法产生的。
      请参阅repr文档以及魔法函数的文档(或者对于它们名称中的双下划线,称之为“dunder函数”)。

    In Python 2.7

    • NoneType是一种在标准库模块types中定义的类型。

    Python 3.0-3.9中

    • NoneType已经从types模块中移除,因为它只有一个值。
    • 尽管如此,它仍然存在,只是没有内置名称:您可以通过写type(None)来访问NoneType
    • 如果您想要NoneType,只需定义NoneType = type(None)

    Python 3.10及更高版本


    请参见 https://dev59.com/I2Ei5IYBdhLWcg3wDoeV - Lutz Prechelt

    4

    在Python中,为了表示值的缺失,你可以使用Nonetypes.NoneType.None


    2
    关于 Python 3,请参见:https://dev59.com/I2Ei5IYBdhLWcg3wDoeV - kkurian

    2
    在错误信息中,Python解释器并不会通过显示两个对象的值(在这个例子中是一个字符串和None)告诉你不能将它们连接起来,而是通过显示你尝试连接的对象类型来告诉你。每个字符串的类型都是str,而单个None实例的类型称为NoneType
    通常情况下,你不需要关注NoneType,但在这个例子中,有必要知道type(None) == NoneType

    我有一个非常类似的问题,正在尝试检测对象是否为NoneType,但你的断言对我不起作用:>>> type(key) >>> type(key) == NoneType Traceback (most recent call last): File "", line 1, in NameError: name 'NoneType' is not defined - RuBiCK
    2
    @RuBiCK,NoneType在我所知道的任何地方都没有定义。如果您想检查一个值是否为None,只需使用key is None(请参见https://dev59.com/WWAg5IYBdhLWcg3w3eJi)。否则,您可以使用`type(key) == type(None)`来达到相同的效果。 - Feuermurmel

    1
    如果您在对象上得到了类型为None,请确保您在方法中返回。例如:
    class Node:
        # node definition
    

    那么,
    def some_funct():
        # some code
        node = Node(self, self.head)
        self.head = node
    

    如果从some_func()中不返回任何内容,则返回类型将为NoneType,因为它没有返回任何内容。

    相反,如果返回节点本身,即Node对象,则会返回Node-object类型。

    def some_func(self):
        node = Node(self, self.head)
        self.head = node
        return node
    

    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

    当您在函数中最后一个语句使用print而不是return时,会返回它:

    def add(a, b):
        print(a+ b)
    
    x = add(5,5)
    print(x)
    print(type(x))
    
    y = x + 545
    print(y)
    

    类型错误:不支持的操作数类型+:'NoneType'和'int' <class'NoneType'>

    def add(a, b):
        return (a+ b)
    
    x = add(5,5)
    print(x)
    print(type(x))
    
    10
    <class 'int'>
    555
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接