วิธีการ "ทดสอบ" ไม่มีประเภทในหลาม?


398

ฉันมีวิธีที่บางครั้งส่งกลับค่า NoneType ดังนั้นฉันจะถามตัวแปรที่เป็น NoneType ได้อย่างไร ฉันจำเป็นต้องใช้ถ้าวิธีเช่น

if not new:
    new = '#'

ฉันรู้ว่านั่นเป็นวิธีที่ผิดและฉันหวังว่าคุณจะเข้าใจในสิ่งที่ฉันหมายถึง


ฉันคิดว่านี่เป็นคำตอบที่นี่และเห็นได้ชัดที่ไหนสักแห่งก่อนหน้านี้
yorodm

หากNoneเป็นเพียงค่าตอบแทนที่วิธีการของคุณซึ่งbool(returnValue)เท่ากับFalseแล้วif not new:ควรจะปรับการทำงาน สิ่งนี้เกิดขึ้นบางครั้งใน libs ในตัว - ตัวอย่างเช่นre.matchคืนค่า None หรือวัตถุที่ตรงกับความจริง
เควิน

ยังเห็นคำตอบของฉันเกี่ยวกับnullและNoneในหลามที่นี่
Michael Ekoka

คำตอบ:


631

ดังนั้นฉันจะถามตัวแปรที่เป็น NoneType ได้อย่างไร

ใช้isตัวดำเนินการเช่นนี้

if variable is None:

ทำไมจึงใช้งานได้

เนื่องจากNoneเป็นวัตถุซิงเกิลตันเดียวNoneTypeใน Python เราสามารถใช้isโอเปอเรเตอร์เพื่อตรวจสอบว่าตัวแปรมีNoneอยู่หรือไม่

ข้อความจากisเอกสาร ,

โอเปอเรเตอร์isและis notทดสอบการระบุตัวตนของวัตถุ: x is yเป็นจริงหากและถ้าxและyเป็นวัตถุเดียวกันเท่านั้น x is not yให้ค่าความจริงผกผัน

เนื่องจากอาจจะมีเพียงหนึ่งตัวอย่างของNone, จะเป็นวิธีที่แนะนำในการตรวจสอบisNone


ได้ยินจากปากม้า

การอ้างอิงแนวทางการเขียนโค้ดของ Python - PEP-008 (กำหนดโดย Guido เอง)

เปรียบเทียบกับ singletons ชอบNoneควรจะทำด้วยisหรือis not , ไม่เคยประกอบความเสมอภาค


ดังนั้นความแตกต่างระหว่าง== Noneและis Noneคืออะไร?
NoName

@NoName ด้วยความเคารพNoneพวกเขาทั้งสองจะให้ผลลัพธ์ที่คล้ายกัน
thefourtheye

1
สิ่งนี้ใช้ไม่ได้หากเปรียบเทียบว่ามีpandasDataFrame อยู่หรือไม่ฉันใช้type(df) is type(None)เพื่อหลีกเลี่ยง:The truth value of a DataFrame is ambiguous
Marc Maxmeister


27

นอกจากนี้ยังสามารถทำได้ด้วยisinstanceตามคำตอบอเล็กซ์ฮอลล์ :

>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True

isinstance ยังใช้งานง่าย แต่มีความซับซ้อนที่ต้องใช้สาย

NoneType = type(None)

ซึ่งไม่จำเป็นสำหรับประเภทชอบและintfloat


เนื่องจากคุณไม่สามารถ subclass NoneTypeและตั้งแต่Noneเป็นเดี่ยว, isinstanceไม่ควรนำมาใช้ในการตรวจสอบNone- แทนคุณควรทำเป็นคำตอบที่ได้รับการยอมรับกล่าวและการใช้งานหรือis None is not None
Aaron Hall

18

ตามที่ระบุไว้โดยความคิดเห็นของ Aaron Hall:

เนื่องจากคุณไม่สามารถ subclass NoneTypeและตั้งแต่Noneเป็นเดี่ยว, isinstanceไม่ควรนำมาใช้ในการตรวจสอบNone- แทนคุณควรทำเป็นคำตอบที่ได้รับการยอมรับกล่าวและการใช้งานหรือis Noneis not None


คำตอบเดิม:

วิธีที่ง่ายที่สุดอย่างไรก็ตามหากไม่มีบรรทัดเพิ่มเติมนอกเหนือจากคำตอบของกระวานก็อาจจะ:
isinstance(x, type(None))

ดังนั้นฉันจะถามตัวแปรที่เป็น NoneType ได้อย่างไร ฉันต้องการใช้ถ้าวิธี

การใช้isinstance()ไม่จำเป็นต้องมีisภายใน - สถานะif:

if isinstance(x, type(None)): 
    #do stuff

ข้อมูลเพิ่มเติม
นอกจากนี้คุณยังสามารถตรวจสอบหลายประเภทในหนึ่งisinstance()คำสั่งตามที่กล่าวไว้ในเอกสาร เพียงเขียนประเภทเป็น tuple

isinstance(x, (type(None), bytes))

1
เนื่องจากคุณไม่สามารถ subclass NoneTypeและตั้งแต่Noneเป็นเดี่ยว, isinstanceไม่ควรนำมาใช้ในการตรวจสอบNone- แทนคุณควรทำเป็นคำตอบที่ได้รับการยอมรับกล่าวและการใช้งานหรือis None is not None
Aaron Hall

1
คำตอบนี้มีประโยชน์สำหรับpython 3.6.7
Santhosh Dhaipule Chandrakanth

@AaronHall ทำไมisinstance ไม่ควรใช้? ฉันเข้าใจว่าisควรเป็นที่ต้องการ แต่มีบางกรณีที่รูปแบบ isinstance รู้สึกเป็นธรรมชาติมากขึ้น (เช่นการตรวจสอบหลายประเภทพร้อมกันisinstance(x, (str, bool, int, type(None)))) มันเป็นเพียงการตั้งค่าส่วนตัวหรือมีข้อแม้ที่ฉันไม่รู้?
Conchylicultor

@Conchylicultor ลดข้อเสนอแนะของคุณ: 1. ค้นหาทั่วโลกสำหรับtype2. แล้วเรียกมัน 3. จากนั้นค้นหาประเภทของNone- เมื่อNoneเป็นทั้งซิงเกิลและคำหลัก ข้อเสียอีกประการหนึ่ง: 4. สิ่งนี้ไม่ได้มาตรฐานมากและจะยกคิ้วเมื่อมีคนดูรหัสของคุณ x is Noneเป็นการตรวจสอบที่เหมาะสมที่สุด ฉันอยากจะแนะนำx is None or isinstance(x, (str, bool, int))- แต่ฉันขอแนะนำให้คุณคิดถึงสิ่งที่คุณกำลังทำมากขึ้นเมื่อคุณกำลังตรวจสอบประเภทนั้นสำหรับประเภทที่ไม่มีอะไรเหมือนกัน ...
Aaron Hall

4

ไม่แน่ใจว่าสิ่งนี้ตอบคำถามหรือไม่ แต่ฉันรู้ว่านี่ใช้เวลาสักครู่กว่าจะคิดออก ฉันวนลูปผ่านเว็บไซต์และทันใดนั้นชื่อของผู้แต่งก็ไม่ได้อยู่ที่นั่นอีกต่อไป จำเป็นต้องมีคำสั่งตรวจสอบ

if type(author) == type(None):
     my if body
else:
    my else body

ผู้เขียนสามารถเป็นตัวแปรใด ๆ ในกรณีนี้และNoneสามารถเป็นประเภทใดก็ได้ที่คุณกำลังตรวจสอบ


ตั้งแต่Noneเป็นเดี่ยว, typeไม่ควรนำมาใช้ในการตรวจสอบNone- แทนคุณควรทำเป็นคำตอบที่ได้รับการยอมรับกล่าวและการใช้งานหรือis None is not None
Aaron Hall

2

Python 2.7:

x = None
isinstance(x, type(None))

หรือ

isinstance(None, type(None))

==> จริง


1
เนื่องจากคุณไม่สามารถ subclass NoneTypeและตั้งแต่Noneเป็นเดี่ยว, isinstanceไม่ควรนำมาใช้ในการตรวจสอบNone- แทนคุณควรทำเป็นคำตอบที่ได้รับการยอมรับกล่าวและการใช้งานหรือis None is not None
Aaron Hall

โอวตกลง! ขอบคุณมาก!
Pesko

0

ฉันหวังว่าตัวอย่างนี้จะเป็นประโยชน์สำหรับคุณ)

print(type(None) # NoneType

ดังนั้นคุณสามารถตรวจสอบประเภทของชื่อตัวแปรได้

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.