2014-01-13 199 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。你必須研究這是爲什麼,這可能是你的一個簡單的邏輯錯誤。