ทำไมฉันถึงได้รับ AttributeError: วัตถุ 'NoneType' ไม่มีแอตทริบิวต์ 'บางอย่าง'?


292

ฉันได้รับข้อผิดพลาดที่แจ้งว่า

AttributeError: 'NoneType' object has no attribute 'something'

รหัสที่ฉันมียาวเกินกว่าจะโพสต์ได้ที่นี่ สถานการณ์ทั่วไปใดที่จะทำให้เกิดAttributeErrorสิ่งนี้สิ่งที่NoneTypeควรจะมีความหมายและฉันจะ จำกัด ว่าจะเกิดอะไรขึ้น


8
ดึงรหัสที่เล็กที่สุดที่แสดงให้เห็นถึงปัญหา โพสต์ว่า เพิ่มprintฟังก์ชั่น (หรือคำสั่งขึ้นอยู่กับรุ่น) เพื่อเปิดเผยค่าจริงที่ตัวแปรมีในรหัสที่มีปัญหานี้
S.Lott

1
'NoneType' mean type = None คุณอาจพยายามเข้าถึงตัวแปรที่ไม่ได้ประกาศ คุณควรโพสต์กระทู้เพื่อให้เราสามารถช่วยคุณ
Lo G.c G.

2
@ LoïcGRENON: "ตัวแปรที่ไม่ได้ประกาศ" ในงูหลาม? นั่นไม่สมเหตุสมผลเลย หนึ่งจะประกาศตัวแปรอย่างไร
S.Lott

2
@ LoïcGRENON - ไม่ใช่ Python ไม่ใช่ คุณได้รับข้อยกเว้น "อ้างอิงก่อนกำหนด" Noneตัวแปรที่ไม่ได้เริ่มต้นกับ
gddc

1
@ LoïcGRENON: คุณมีรหัสที่แสดงถึงความคิดที่คุณกำลังพูดถึงอยู่หรือเปล่า?
S.Lott

คำตอบ:


287

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


111

คุณมีตัวแปรที่เท่ากับ None และคุณพยายามเข้าถึงแอตทริบิวต์ที่เรียกว่า 'something'

foo = None
foo.something = 1

หรือ

foo = None
print foo.something

ทั้งสองจะให้ผล AttributeError: 'NoneType'


9
สิ่งนี้อาจไม่มีประโยชน์จนกว่าคุณจะชี้ให้เห็นว่าผู้คนอาจได้รับNoneบางสิ่งบางอย่างออกมา ชัดเจนfoo = Noneไม่น่าจะเป็นปัญหา มันจะเป็นไปได้foo = something()และคุณไม่รู้ตัวsomething()อาจกลับมาNoneเมื่อมันไม่สำเร็จหรือชุดผลลัพธ์ว่างเปล่าหรืออะไรก็ตาม
tripleee

54

คนอื่น ๆ ได้อธิบายว่า NoneTypeคือและเป็นวิธีที่ใช้กันทั่วไป (เช่นความล้มเหลวในการส่งคืนค่าจากฟังก์ชัน)

อีกสาเหตุทั่วไปที่คุณมีในNoneที่ที่คุณไม่คาดว่ามันคือการมอบหมายการดำเนินการในสถานที่บนวัตถุที่ไม่แน่นอน ตัวอย่างเช่น:

mylist = mylist.sort()

sort()วิธีการของรายการเรียงลำดับรายการในสถานที่ที่เป็นmylistที่มีการแก้ไข แต่ค่าส่งคืนจริงของวิธีการNoneไม่ใช่รายการที่เรียงลำดับ เพื่อให้คุณได้รับมอบหมายเพียงเพื่อNone mylistหากคุณลองทำดูในครั้งต่อไปmylist.append(1)Python จะให้ข้อผิดพลาดนี้แก่คุณ


นี่เป็นคำอธิบายที่ดีมากเช่นการได้รับข้อยกเว้นการอ้างอิงว่างใน c # ตัวแปรไม่มีค่าที่กำหนดและเป็นไม่มี .. ขอบคุณ
เคน

17

เป็นประเภทของค่าNoneType Noneในกรณีนี้ตัวแปรมีค่าlifetimeNone

วิธีทั่วไปในการเกิดเหตุการณ์นี้คือการเรียกใช้ฟังก์ชันที่หายไป returnวิธีการทั่วไปที่จะมีเรื่องนี้เกิดขึ้นคือการเรียกฟังก์ชั่นที่ขาดหายไป

อย่างไรก็ตามมีวิธีอื่น ๆ จำนวนอนันต์ในการตั้งค่าตัวแปรเป็น None


1
ฉันไม่คิดว่าlifetimeมีค่าNone(แก้ไขล่วงหน้า) เขาพยายามที่จะเข้าถึงชีวิตแอตทริบิวต์Noneของอย่างอื่นที่เป็น
gddc

13

พิจารณารหัสด้านล่าง

def return_something(someint):
 if  someint > 5:
    return someint

y = return_something(2)
y.real()

สิ่งนี้จะทำให้คุณมีข้อผิดพลาด

AttributeError: วัตถุ 'NoneType' ไม่มีแอตทริบิวต์ 'ของจริง'

ดังนั้นคะแนนมีดังนี้

  1. ในโค้ดฟังก์ชันหรือเมธอดคลาสจะไม่ส่งคืนอะไรหรือส่งคืนไม่มี
  2. จากนั้นคุณลองเข้าถึงแอตทริบิวต์ของวัตถุที่ส่งคืน (ซึ่งก็คือไม่มี) ทำให้เกิดข้อความแสดงข้อผิดพลาด

4

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

x1 = None
print(x1.something)

#or

x1 = None
x1.someother = "Hellow world"

#or
x1 = None
x1.some_func()

# you can avoid some of these error by adding this kind of check
if(x1 is not None):
    ... Do something here
else:
    print("X1 variable is Null or None")

1

gddc นั้นถูกต้อง แต่การเพิ่มตัวอย่างบ่อยมาก:

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


ใช่แล้ว แต่คุณจะตรวจสอบได้อย่างไร
not2qubit

ถ้า foo == ไม่มี:
barribow

if foo is not None:
Gringo Suave

1

เมื่อสร้างตัวประมาณ (sklearn) ถ้าคุณลืมคืนตัวเองในฟังก์ชั่นพอดีคุณจะได้รับข้อผิดพลาดเดียวกัน

class ImputeLags(BaseEstimator, TransformerMixin):
    def __init__(self, columns):
        self.columns = columns

    def fit(self, x, y=None):
        """ do something """

    def transfrom(self, x):
        return x

AttributeError: วัตถุ 'NoneType' ไม่มีแอตทริบิวต์ 'แปลง'?

การเพิ่มreturn selfฟังก์ชั่นพอดีช่วยแก้ไขข้อผิดพลาด


0

คุณสามารถรับข้อผิดพลาดนี้เมื่อคุณได้แสดงความคิดเห็น HTML ในแอปพลิเคชัน Flask ค่าของ qual.date_expiry คือ:

   <!-- <td>{{ qual.date_expiry.date() }}</td> -->

ลบบรรทัดหรือแก้ไข:

<td>{% if qual.date_attained != None %} {{ qual.date_attained.date() }} {% endif %} </td>

-1

หากเรากำหนดบางอย่างเช่นด้านล่างมันจะโยนข้อผิดพลาดเป็น "AttributeError: วัตถุ 'NoneType' ไม่มีแอตทริบิวต์ 'show'"

df1=df.withColumn('newAge',df['Age']).show() 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.