【问题标题】:What is a 'NoneType' object?什么是“NoneType”对象?
【发布时间】:2014-02-01 10:57:23
【问题描述】:

我在运行 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)

【问题讨论】:

  • 我们需要查看更多代码和输入 - NoneTyoe 表示其中一个变量尚未设置
  • NoneType 是单例值None 的类型。您的值之一不是字符串。
  • Quick&Dirty:将每个术语连接在str() str(SNMPSRVUSRCMD) + str(snmpuser) + ...
  • @PeterMmm 这是一个糟糕的想法——问题只会在更远的地方表现出来(也许更糟)。最好弄清楚为什么其中一个变量是None。

标签: python null nonetype


【解决方案1】:

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

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

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

groupSNMPGROUPCMDV3PRIVCMD 之一的值为 None

【讨论】:

  • 谢谢!!您在正确的地方,我的一个用户输入选项由于某种原因没有被采用。我将其添加为“名称”而不是选项和繁荣,它起作用了。现在我只需要找出为什么不能正确地作为一个选项,所有其他选项都工作正常。
  • “未设置”有点模糊...如果未定义变量并且您尝试使用它执行一些操作,您应该得到一个NameError。它也可以设置,但等于None(“设置为空”=“未设置”?),那么你可能会得到一些TypeError
  • 基本上(这里的 C/Java 人员)none = null
【解决方案2】:

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

if obj is None:

if obj is not None:

【讨论】:

  • "is" 只有在需要时才应使用。最好的防御性编程是测试,大量的测试。
  • 防御性编程是最邪恶的事情之一。如果你发现这样的错误,这意味着你犯了一个错误的编程。诸如“使用前检查 null”之类的东西只会隐藏一些严重的错误。你应该让异常被抛出。并且不要让程序员抛出一些自定义异常,真的很麻烦。让自然错误被抛出。事实上,防御性编程是您应该使用另一种语言的症状。
  • 我通过 sqlAlchemy 查询数据库。没有结果。返回的对象是无。这意味着没有结果。没有错误。您检查结果是否为无,如果不是,则使用结果对象。没什么不好的。编程最邪恶的地方就是教条主义。
【解决方案3】:

NoneType 只是 None 单例的类型:

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

从上面的后一个链接:

None

NoneType 类型的唯一值。 None 经常用于表示没有值,例如没有将默认参数传递给函数。分配给None 是非法的,并引发SyntaxError

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

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      【解决方案6】:

      在 Python 中

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

      表示:

      • 在某些但不是所有版本的 Python 中有一个类型 NoneType, 见下文。
      • 当你执行print(type(None)),你会得到 &lt;type 'NoneType'&gt;.
        这是由NoneType__repr__ 方法产生的。
        documentation of repr 和那个 magic functions (或“dunder 函数”,它们名称中的 d 两个 under 分数)。

      在 Python 2.7 中

      在 Python 3.0 到 3.9 中

      • NoneType 已被 removedmodule types, 大概是因为这种类型只有一个值。
      • 它仍然有效地存在,只是没有内置名称: 你可以写type(None)来访问NoneType。
      • 如果您想返回NoneType,只需定义 NoneType = type(None).

      在 Python 3.10+ 中

      【讨论】:

      【解决方案7】:

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

      您通常不需要关心NoneType,但在本例中,有必要知道type(None) == NoneType

      【讨论】:

      • 我有一个非常相似的问题,并试图检测对象是否为 NoneType,您的确认对我不起作用:&gt;&gt;&gt; type(key) &lt;type 'NoneType'&gt; &gt;&gt;&gt; type(key) == NoneType Traceback (most recent call last): File "&lt;stdin&gt;", line 1, in &lt;module&gt; NameError: name 'NoneType' is not defined
      • @RuBiCK NoneType 没有在任何地方定义(我知道)。如果要检查一个值是否为None,只需使用key is None(参见stackoverflow.com/questions/23086383/…)。否则你可以使用type(key) == type(None) 来达到同样的效果。
      【解决方案8】:

      您的错误是由于以下原因发生的:
      >>> 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等。

      【讨论】:

        【解决方案9】:

        其中一个变量没有被赋予任何值,因此它是一个 NoneType。你必须看看为什么会这样,这可能是你的一个简单的逻辑错误。

        【讨论】:

          【解决方案10】:

          当您将 print 作为函数中的最后一条语句而不是 return 时返回:

          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
          

          【讨论】:

            【解决方案11】:

            NoneTypeNone 的类型。

            在此处查看 Python 2 文档: https://docs.python.org/2/library/types.html#types.NoneType

            【讨论】:

              猜你喜欢
              • 2021-07-11
              • 1970-01-01
              • 2018-05-18
              • 1970-01-01
              • 2018-05-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多