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?

Jacob Griffin
sumber
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.

gddc
sumber
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'

Koblas
sumber
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.

baik hati
sumber
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.

S.Lott
sumber
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.
PHINCY L PIOUS
sumber
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")
M. Hamza Rajput
sumber
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.

menggonggong
sumber
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.

Chiel
sumber
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>
Jeremy Thompson
sumber
-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() 
BigData-Guru
sumber