Mengapa saya mendapatkan AttributeError: objek 'NoneType' tidak memiliki atribut 'sesuatu'?


292

Saya terus mendapatkan kesalahan yang mengatakan

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

Kode yang saya miliki terlalu panjang untuk dikirim di sini. Skenario umum apa yang akan menyebabkan ini AttributeError, apa yang NoneTypeseharusnya berarti dan bagaimana saya bisa mempersempit apa yang terjadi?


8
Tarik sedikit kode terkecil yang menunjukkan masalah. Posting itu. Tambahkan printfungsi (atau pernyataan tergantung pada versi) untuk mengungkapkan nilai aktual yang sebenarnya dimiliki variabel dalam kode yang mengalami masalah ini.
S.Lott

1
Jenis berarti 'NoneType' = Tidak Ada. Anda mungkin mencoba mengakses variabel yang tidak dideklarasikan. Anda harus memposting inti sehingga kami dapat membantu Anda.
Loïc G.

2
@ LoïcGRENON: "variabel yang tidak dideklarasikan"? Dengan Python? Itu tidak masuk akal. Bagaimana seseorang mendeklarasikan variabel?
S.Lott

2
@ LoïcGRENON - Bukan dengan Python bukan. Anda mendapatkan pengecualian "referensi sebelum tugas". Variabel tidak default untuk None.
gddc

1
@ LoïcGRENON: Apakah Anda memiliki beberapa kode yang menunjukkan ide yang sedang Anda bicarakan ini?
S.Lott

Jawaban:


287

NoneType berarti bahwa alih-alih sebuah instance dari Kelas atau Obyek apa pun yang Anda pikir sedang Anda kerjakan, Anda sebenarnya memilikinya None. Itu biasanya berarti bahwa tugas atau fungsi panggilan di atas gagal atau mengembalikan hasil yang tidak terduga.


111

Anda memiliki variabel yang sama dengan Tidak Ada dan Anda mencoba mengakses atribut yang disebut 'sesuatu'.

foo = None
foo.something = 1

atau

foo = None
print foo.something

Keduanya akan menghasilkan AttributeError: 'NoneType'


9
Ini mungkin tidak membantu sampai Anda menunjukkan bagaimana orang akhirnya bisa mendapatkan Nonesesuatu. Yang eksplisit foo = Nonetidak mungkin menjadi masalah; itu akan terjadi foo = something()dan Anda tidak menyadari something()akan kembali Noneketika tidak berhasil atau hasil yang ditetapkan kosong atau apa pun.
tripleee

54

Yang lain telah menjelaskan apa NoneTypeitu dan cara yang umum untuk mengakhiri dengan itu (yaitu, kegagalan untuk mengembalikan nilai dari suatu fungsi).

Alasan umum lain yang Anda miliki di Nonetempat yang tidak Anda harapkan adalah penugasan operasi di tempat pada objek yang dapat diubah. Sebagai contoh:

mylist = mylist.sort()

The sort()metode daftar macam daftar di tempat, yang, mylistdimodifikasi. Tetapi nilai pengembalian aktual dari metode ini Nonedan bukan daftar yang diurutkan. Jadi Anda baru saja ditugaskan Noneuntuk mylist. Jika selanjutnya Anda coba lakukan, katakanlah, mylist.append(1)Python akan memberi Anda kesalahan ini.


Ini adalah penjelasan yang bagus - semacam suka mendapatkan pengecualian referensi nol di c #. Variabel tidak memiliki nilai yang ditetapkan dan tidak ada .. Thx.
Ken

17

The NoneTypeadalah jenis nilai None. Dalam hal ini, variabel lifetimememiliki nilai None.

Cara umum untuk membuat ini terjadi adalah memanggil fungsi yang hilang a return.

Namun, ada banyak cara lain untuk mengatur variabel ke Tidak ada.


1
Saya pikir tidak lifetimememiliki nilai None(pra-edit). Dia mencoba mengakses atribut seumur hidup dari sesuatu yang lain None.
gddc

13

Pertimbangkan kode di bawah ini.

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

y = return_something(2)
y.real()

Ini akan memberi Anda kesalahan

AttributeError: objek 'NoneType' tidak memiliki atribut 'nyata'

Jadi poinnya seperti di bawah ini.

  1. Dalam kode tersebut, fungsi atau metode kelas tidak mengembalikan apa pun atau mengembalikan Tidak Ada
  2. Kemudian Anda mencoba mengakses atribut dari objek yang dikembalikan (yang tidak ada), menyebabkan pesan kesalahan.

4

Ini berarti objek yang Anda coba akses None. Noneadalah Nullvariabel dalam python. Jenis kesalahan ini terjadi pada kode Anda adalah sesuatu seperti ini.

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 benar, tetapi menambahkan contoh yang sangat sering:

Anda dapat memanggil fungsi ini dalam bentuk rekursif. Dalam hal ini, Anda mungkin berakhir pada null pointer atau NoneType. Dalam hal ini, Anda bisa mendapatkan kesalahan ini. Jadi sebelum mengakses atribut parameter itu periksa apakah tidak NoneType.


Ya, oke, tapi bagaimana Anda melakukan itu?
not2qubit

if foo == Tidak ada:
barribow

if foo is not None:
Gringo Suave

1

Saat membuat estimator (sklearn), jika Anda lupa untuk mengembalikan diri dalam fungsi fit, Anda mendapatkan kesalahan yang sama.

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: objek 'NoneType' tidak memiliki atribut 'transform'?

Menambahkan return selfke fungsi fit memperbaiki kesalahan.


0

Anda bisa mendapatkan kesalahan ini dengan Anda berkomentar HTML dalam aplikasi Flask. Di sini nilai untuk qual.date_expiry adalah Tidak Ada:

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

Hapus baris atau perbaiki:

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

-1

jika kita menetapkan sesuatu seperti di bawah ini, ia akan menampilkan kesalahan sebagai "AttributeError: objek 'NoneType' tidak memiliki atribut 'tampilkan'"

df1=df.withColumn('newAge',df['Age']).show() 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.