วัตถุ 'NoneType' คืออะไร?


89

ฉันได้รับข้อผิดพลาดนี้เมื่อฉันเรียกใช้สคริปต์ 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)

2
เราต้องการดูโค้ดเพิ่มเติมและอินพุต - NoneTyoe หมายความว่ายังไม่ได้ตั้งค่าตัวแปรตัวใดตัวหนึ่ง
mmmmmm

3
NoneTypeNoneเป็นชนิดของค่าเดี่ยวที่ ค่าหนึ่งของคุณไม่ใช่สตริง
Martijn Pieters

Quick & Dirty: นำแต่ละคำมาต่อกันในstr()str (SNMPSRVUSRCMD) + str (snmpuser) + ...
PeterMmm

2
@PeterMmm นั่นเป็นความคิดที่แย่มาก - ปัญหาจะแสดงออกมา (อาจแย่กว่านั้น) ลงไปอีก มันจะดีกว่าถ้าจะหาสาเหตุว่าทำไมตัวแปรตัวใดตัวหนึ่งถึงไม่มีขึ้นต้นด้วย
arshajii

คำตอบ:


83

NoneTypeเป็นชนิดสำหรับที่Noneวัตถุซึ่งเป็นวัตถุที่บ่งชี้ว่าไม่มีค่า Noneคือค่าส่งคืนของฟังก์ชันที่ "ไม่ส่งคืนอะไรเลย" นอกจากนี้ยังเป็นค่าส่งคืนเริ่มต้นทั่วไปสำหรับฟังก์ชันที่ค้นหาบางสิ่งและอาจพบหรือไม่พบ ตัวอย่างเช่นจะส่งคืนre.searchเมื่อ regex ไม่ตรงกันหรือdict.getเมื่อคีย์ไม่มีรายการใน dict คุณไม่สามารถเพิ่มลงNoneในสตริงหรือวัตถุอื่น ๆ

ตัวแปรอย่างหนึ่งของคุณคือNoneไม่ใช่สตริง บางทีคุณอาจลืมreturnในฟังก์ชันใดฟังก์ชันหนึ่งของคุณหรือบางทีผู้ใช้อาจไม่ได้ระบุตัวเลือกบรรทัดคำสั่งและoptparseให้Noneค่าตัวเลือกนั้นแก่คุณ เมื่อคุณพยายามเพิ่มลงNoneในสตริงคุณจะได้รับข้อยกเว้นนั้น:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

หนึ่งgroupหรือSNMPGROUPCMDหรือV3PRIVCMDมีNoneค่าเป็น


ขอบคุณ !! คุณถูกต้องหนึ่งในตัวเลือกการป้อนข้อมูลผู้ใช้ของฉันไม่ได้ใช้เหตุผลบางประการ ฉันเพิ่มสิ่งนี้เป็น "ชื่อ" เทียบกับตัวเลือกและความเจริญมันได้ผล ตอนนี้ฉันต้องค้นหาว่าเหตุใดจึงใช้เป็นตัวเลือกไม่ถูกต้องตัวเลือกอื่น ๆ ทั้งหมดทำงานได้ดี
ไม่ปลอดภัย - ไอที

1
"ไม่ได้ตั้งค่า" ค่อนข้างคลุมเครือ ... หากไม่ได้กำหนดตัวแปรไว้และคุณพยายามดำเนินการกับตัวแปรนั้นคุณควรได้รับไฟล์NameError. นอกจากนี้ยังอาจเป็นชุด แต่เท่ากับNone( "ชุดเพื่ออะไร" = "ไม่ได้ตั้งค่า"?) TypeErrorแล้วคุณอาจจะได้รับบางส่วน
Nick T

โดยทั่วไป (สำหรับชาว C / Java ที่นี่) ไม่มี = null
Zoe

24

NoneTypeเป็นเพียงประเภทของNoneซิงเกิลตัน:

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

จากลิงค์ด้านบน:

None

NoneTypeมูลค่าเพียงอย่างเดียวของชนิด Noneมักใช้เพื่อแสดงถึงการไม่มีค่าเนื่องจากอาร์กิวเมนต์เริ่มต้นไม่ได้ถูกส่งผ่านไปยังฟังก์ชัน การมอบหมายงานให้Noneผิดกฎหมายและเพิ่มไฟล์SyntaxError.

ในกรณีของคุณดูเหมือนว่ารายการใดรายการหนึ่งที่คุณพยายามเชื่อมต่อกันคือNoneข้อผิดพลาดของคุณ


21

เพื่อประโยชน์ในการเขียนโปรแกรมป้องกันควรตรวจสอบวัตถุกับค่าว่างก่อนใช้

if obj is None:

หรือ

if obj is not None:

2
"is" ควรใช้เมื่อคุณต้องการเท่านั้น การเขียนโปรแกรมป้องกันที่ดีที่สุดคือการทดสอบการทดสอบมากมาย
Jürgen A. Erhard

2
การเขียนโปรแกรมเชิงป้องกันเป็นหนึ่งในสิ่งที่ชั่วร้ายที่สุด หากคุณพบข้อผิดพลาดเช่นนั้นแสดงว่าคุณเขียนโปรแกรมผิดพลาด สิ่งต่างๆเช่น "การตรวจสอบค่าว่างก่อนใช้" จะซ่อนเฉพาะข้อผิดพลาดร้ายแรงบางประการเท่านั้น คุณควรปล่อยให้ข้อยกเว้นถูกโยนทิ้งไป และอย่าทำให้โปรแกรมเมอร์โยนข้อยกเว้นที่กำหนดเองบางอย่างมันเป็นเรื่องยุ่งยากจริงๆ ปล่อยให้ข้อผิดพลาดตามธรรมชาติถูกโยนทิ้งไป ในความเป็นจริงการเขียนโปรแกรมเชิงป้องกันเป็นอาการที่คุณควรใช้ภาษาอื่น
bzim

1
ฉันสอบถามฐานข้อมูลผ่าน sqlAlchemy ไม่มีผลลัพธ์ วัตถุที่ส่งคืนคือไม่มี ซึ่งหมายความว่าไม่มีผลลัพธ์ ไม่มีข้อผิดพลาด คุณตรวจสอบว่าผลลัพธ์เป็นไม่มีหรือไม่ถ้าไม่คุณใช้ออบเจ็กต์ผลลัพธ์ ไม่มีอะไรชั่วร้ายเกี่ยวกับมัน สิ่งที่ชั่วร้ายที่สุดเกี่ยวกับการเขียนโปรแกรมคือความเชื่อ
สามัคคี 100

17

Noneมันหมายความว่าคุณกำลังพยายามที่จะเชื่อมสตริงกับสิ่งที่เป็น

ไม่มี "ว่าง" ของ Python และNoneTypeเป็นประเภทของมัน

รหัสนี้จะเพิ่มข้อผิดพลาดประเภทเดียวกัน:

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


2

ในข้อความแสดงข้อผิดพลาดแทนที่จะบอกคุณว่าคุณไม่สามารถเชื่อมต่อวัตถุสองชิ้นโดยการแสดงค่าของพวกมัน (สตริงและNoneในตัวอย่างนี้) ตัวแปล Python จะบอกคุณสิ่งนี้โดยการแสดงประเภทของวัตถุที่คุณพยายามเชื่อมต่อกัน ประเภทของทุกสตริงคือstrในขณะที่ประเภทของเดียวเช่นที่เรียกว่าNoneNoneType

ปกติคุณไม่จำเป็นต้องกังวลกับตัวเองแต่ในตัวอย่างนี้มันเป็นสิ่งจำเป็นที่จะรู้ว่าNoneTypetype(None) == NoneType


ฉันมีปัญหาที่คล้ายกันมากและพยายามตรวจสอบว่าวัตถุนั้นเป็น NoneType หรือไม่การยืนยันของคุณไม่ได้ผลสำหรับฉัน: >>> type(key) <type 'NoneType'> >>> type(key) == NoneType Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined
RuBiCK

2
@RuBiCK NoneTypeไม่ได้กำหนดไว้ที่ใดก็ได้ (ที่ฉันรู้) หากคุณต้องการตรวจสอบว่าเป็นค่าNoneหรือไม่ให้ใช้key is None(ดูstackoverflow.com/questions/23086383/… ) มิฉะนั้นคุณสามารถใช้เอtype(key) == type(None)ฟเฟกต์เดียวกันได้
Feuermurmel

1

ข้อผิดพลาดของคุณเกิดขึ้นเนื่องจากสิ่งนี้: >>>
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

วัตถุNoneของ Python นั้นเทียบเท่ากับnull , nilและอื่น ๆ ในภาษาอื่น ๆ


0

ตัวแปรตัวใดตัวหนึ่งไม่ได้รับค่าใด ๆ ดังนั้นจึงเป็น NoneType คุณจะต้องพิจารณาว่าเหตุใดจึงเป็นเช่นนั้นอาจเป็นข้อผิดพลาดทางตรรกะง่ายๆในส่วนของคุณ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.