Neden AttributeError: 'NoneType' nesnesinin 'bir şey' niteliği yok?


292

Sürekli bir hata alıyorum

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

Sahip olduğum kod burada göndermek için çok uzun. Hangi genel senaryolar buna neden olur AttributeError, ne NoneTypeanlama gelir ve olan biteni nasıl daraltabilirim?


8
Sorunu gösteren en küçük kod parçasını dışarı çekin. Gönderin. printDeğişkenlerin bu soruna sahip olan kodda gerçekte sahip oldukları gerçek değerleri ortaya çıkarmak için işlevler (veya sürüme bağlı ifadeler) ekleyin .
S.Lott

1
'NoneType' ortalama türü = Yok. Büyük olasılıkla bildirilmemiş bir değişkene erişmeye çalışıyorsunuzdur. Size yardımcı olabilmemiz için bir öz yayın göndermelisiniz.
Loïc G.Jan

2
@ LoïcGRENON: "bildirilmemiş değişken"? Python'da mı? Bu pek mantıklı değil. Bir değişken nasıl bildirilir?
S.Lott

2
@ LoïcGRENON - Python'da değil, değil. Bir "atamadan önce başvurulan" istisna alırsınız. Değişkenler varsayılan olarak değildir None.
gddc

1
@ LoïcGRENON: Bahsettiğiniz bu fikri gösteren bir kodunuz var mı?
S.Lott

Yanıtlar:


287

NoneType, çalıştığınızı düşündüğünüz herhangi bir Sınıf veya Nesne örneği yerine, aslında sahip olduğunuz anlamına gelir None. Bu genellikle yukarıdaki atama veya işlev çağrısının başarısız olduğu veya beklenmedik bir sonuç döndürdüğü anlamına gelir.


111

Hiçbirine eşit olmayan bir değişkeniniz var ve değişkenin 'bir şey' adı verilen bir özelliğine erişmeye çalışıyorsunuz.

foo = None
foo.something = 1

veya

foo = None
print foo.something

Her ikisi de bir AttributeError: 'NoneType'


9
İnsanların bir Noneşeyden nasıl çıkabileceğini gösterene kadar bu muhtemelen yararsızdır . foo = NoneSorunun açık olması pek olası değildir; olacak foo = something()ve başarılı olmadığında ya da sonuç kümesi boşken ya da her neyse something()geri dönebileceğini fark Noneetmiyorsunuz.
tripleee

54

Diğerleri, bunun ne NoneTypeolduğunu ve bununla sonuçlanmanın ortak bir yolunu açıkladı (yani, bir işlevden bir değer döndürülemedi).

Beklemediğiniz bir diğer yaygın neden None, değiştirilebilir bir nesneye yerinde işlem atamasıdır. Örneğin:

mylist = mylist.sort()

sort()Listenin yöntem olup yerinde listesini sıralar mylistdeğiştirilir. Ancak, yöntemin gerçek dönüş değeri Nonesıralanan liste değildir. Yani sadece atadık Noneiçin mylist. Bir sonraki adımda bunu denerseniz, mylist.append(1)Python size bu hatayı verecektir.


Bu harika bir açıklama - c # 'da null referans istisnası almak gibi. Değişkenin atanmış değeri yoktur ve Yoktur .. Thx.
Ken

17

NoneTypeDeğer türüdür None. Bu durumda, değişkenin lifetimedeğeri vardır None.

Bunu yapmanın yaygın bir yolu, eksik bir işlevi çağırmaktır return.

Ancak bir değişkeni Yok olarak ayarlamak için sonsuz sayıda başka yol vardır.


1
Ben (ön düzenleme) lifetimebir değeri olduğunu sanmıyorum None. O başka bir şeyin yaşam boyu özelliğine erişmeye çalışıyordu None.
gddc

13

Aşağıdaki kodu düşünün.

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

y = return_something(2)
y.real()

Bu size hata verecektir

AttributeError: 'NoneType' nesnesinin 'real' özelliği yok

Yani puanlar aşağıdaki gibidir.

  1. Kodda, bir işlev veya sınıf yöntemi hiçbir şey döndürmüyor veya Hiçbiri döndürmüyor
  2. Ardından, döndürülen nesnenin (Yok olan) bir özniteliğine erişmeye çalışarak hata iletisine neden olursunuz.

4

Erişmeye çalıştığınız nesne anlamına gelir None. python'da Nonebir Nulldeğişkendir. Bu tür bir hata kodunuzda meydana geldiği gibi bir şeydir.

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 doğru, ancak çok sık bir örnek ekliyor:

Bu işlevi özyinelemeli bir biçimde çağırabilirsiniz. Bu durumda, null işaretçisi veya ile sonuçlanabilir NoneType. Bu durumda, bu hatayı alabilirsiniz. Bu parametrenin bir özniteliğine erişmeden önce kontrol edin NoneType.


Evet, tamam, ama bu kontrolü nasıl yapıyorsun?
not2qubit

if foo == Yok:
barribow

if foo is not None:
Gringo Suave

1

Bir tahminci (sklearn) oluştururken, kendini fit fonksiyonuna döndürmeyi unutursanız, aynı hatayı alırsınız.

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' nesnesinin 'transform' özelliği yok mu?

Sığdırma return selfişlevine eklemek hatayı düzeltir.


0

Bu hatayı, bir Flask uygulamasında HTML'ye yorum yaptığınızda alabilirsiniz. İşte qual.date_expiry değeri Yok:

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

Satırı silin veya düzeltin:

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

-1

aşağıdaki gibi bir şey atarsak, hatayı "AttributeError: 'NoneType' nesnesinde 'show' özelliği yoktur.

df1=df.withColumn('newAge',df['Age']).show() 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.