Mengapa saya mendapatkan kesalahan ketik python?

Pengecualian TypeError di Python dimunculkan saat Anda mencoba menerapkan panggilan operasi atau fungsi apa pun ke jenis objek yang tidak sesuai

Sebagai contoh -

  1. Mencoba menggabungkan daftar dan angka
  2. Memanggil variabel sebagai fungsi
  3. Meneruskan argumen ke fungsi dengan tipe yang salah, dll

Contoh 1

Kode/Keluaran

# concatenating list with an integer
x = [1, 2, 3]
y = 2

print(x+y)
>>> TypeError: can only concatenate list (not "int") to list

# passing an unsupported index
x = [1, 2, 3]
print(x[0.5])
>>> TypeError: list indices must be integers or slices, not float

# calling a variable as a function
x = "Pylenin"
x()
>>> TypeError: 'str' object is not callable

# Passing wrong argument
def addition(x, y):
    return x+y

print(addition(10, [1, 2]))
>>> TypeError: unsupported operand type(s) for +: 'int' and 'list'

Anda dapat menangani kesalahan ini menggunakan kelas Pengecualian TypeError


Contoh 2

Kode

# concatenating list with an integer
x = [1, 2, 3]
y = 2
try:
    print(x+y)
except TypeError as e:
    print(f"TypeError handled."
          f"Error reason - {e}")

# passing an unsupported index
x = [1, 2, 3]
try:
    print(x[0.5])
except TypeError as e:
    print(f"TypeError handled."
          f"Error reason - {e}")


# calling a variable as a function
x = "Pylenin"
try:
    x()
except TypeError as e:
    print(f"TypeError handled."
          f"Error reason - {e}")


# Passing wrong argument
def addition(x, y):
    return x+y

try:
    print(addition(10, [1, 2]))
except TypeError as e:
    print(f"TypeError handled."
          f"Error reason - {e}")
_

Keluaran

TypeError handled.Error reason - can only concatenate list (not "int") to list
TypeError handled.Error reason - list indices must be integers or slices, not float
TypeError handled.Error reason - 'str' object is not callable
TypeError handled.Error reason - unsupported operand type(s) for +: 'int' and 'list'

Lihat kelas Pengecualian Bawaan Python lainnya di Python

kelas pengecualian bawaan - Pylenin

Seorang programmer yang bertujuan untuk mendemokratisasi pendidikan di dunia pemrograman dan membantu rekan-rekannya mencapai karir impian mereka

Pertama, lihat traceback untuk melihat di bagian kode mana kesalahan terjadi. Jika ada di perpustakaan, kerjakan mundur ke titik di mana kode Anda menggunakan perpustakaan. Kemudian baca pesan kesalahan dengan hati-hati, dan bandingkan dengan kodenya, untuk mencari tahu penyebab keluhan tersebut. Terakhir, pikirkan baik-baik. apakah operasinya salah, atau nilainya?

Contoh

(MELAKUKAN)

Beberapa hal yang tidak jelas

Menggunakan kembali nama

Apakah Anda mungkin menetapkan ulang nama panggilan bawaan, seperti str atau input atau list?

Nama dalam Python hanya bisa merujuk pada satu hal pada satu waktu. Jika Anda menggunakan, katakanlah, list sebagai nama variabel, maka itu juga bukan nama "konsep abstrak daftar" lagi, jadi Anda tidak dapat menggunakannya untuk membuat lebih banyak daftar (termasuk mengonversi hal lain menjadi . Jika Anda membuat variabel global months dengan daftar string, dan kemudian menulis fungsi months, fungsi menggantikan daftar, dan kode fungsi tidak dapat mencari daftar. Ini dapat dengan mudah terjadi secara tidak sengaja saat menggunakan sintaks from some_module import *

Demikian pula, jika Anda mencoba membuat kelas yang menggunakan nama yang sama untuk metode seperti atribut data dari instance, itu akan menyebabkan masalah yang sama. (Ada juga kasus khusus yang rumit dengan @staticmethod)

Daftar pemrosesan

Terkadang orang berharap dapat menggunakan daftar seperti larik Numpy, dan "menyiarkan" panggilan operasi atau fungsi ke setiap elemen daftar. Itu tidak berhasil. Gunakan pemahaman daftar sebagai gantinya

Penanganan None

Pertimbangkan apakah Anda perlu menangani None sebagai kasus khusus. Tetapi cobalah untuk menghindari situasi itu sejak awal;

Mencoba menggunakan perpustakaan (termasuk perpustakaan standar)

Jika sesuatu tidak bekerja seperti yang Anda harapkan (misalnya, mencoba mengurangi input0s atau membuat serial instance dari kelas yang ditentukan pengguna sebagai JSON) - daripada mencoba memperlakukan masalah sebagai pertanyaan debug, cari solusi untuk apa

Jika kesalahan menyebutkan tipe 'str' dan Anda pikir itu harus berupa angka

Apakah Anda mendapatkannya dari fungsi input? . Silakan lihat Bagaimana cara membaca input sebagai angka?

Jika kesalahan menyebutkan tipe 'fungsi' atau tipe 'tipe'

Apakah Anda lupa memanggil fungsi, atau membuat instance kelas?


Pesan kesalahan tentang argumen yang salah

Pesan kesalahan akan memberi tahu Anda nama fungsi; . Apakah ada jumlah argumen posisi yang benar?

Jika Anda menulis metode untuk kelas, ingatlah untuk mengizinkan input3. Hal ini diperlukan untuk metode contoh. Jika Anda memanggil metode, perlu diingat bahwa input3 akan dihitung sebagai argumen (baik untuk jumlah "wajib" dan jumlah "diberikan")

Jika Anda menggunakan panggilan balik yang mengambil argumen dari sumber tidak langsung, periksa sumbernya

Jika Anda mencoba membuat turunan dari kelas Anda sendiri, dan mendapatkan input5 dari input6, pastikan Anda benar-benar menulis input6

Jika Anda tidak tahu apa argumennya, periksa dokumentasinya. Jika argumennya masuk akal, mungkin fungsinya salah - pastikan Anda tidak bingung dengan yang lain di perpustakaan yang sama

Pesan kesalahan tentang jenis operan

Pastikan operator benar untuk apa yang Anda ingin kode lakukan (misalnya. input_8 bukan eksponensial;

Dalam kebanyakan kasus, akan tepat untuk mengonversi jenis - tetapi pikirkan baik-baik. Pastikan operasi masuk akal dengan tipe baru. Misalnya, jika kodenya adalah list_0, dan list1 adalah list yang saat ini berisi list3, kemungkinan besar kita tidak ingin menggabungkan string, melainkan membuat daftar yang dimodifikasi yang juga memiliki list4 sebagai elemen. Jadi sebenarnya kami ingin "menambahkan" daftar lain. list5

Jika list_6, bisa jadi string yang diindeks adalah JSON atau semacamnya, yang seharusnya sudah diuraikan untuk membuat kamus (mungkin dengan daftar dan kamus bersarang)

Jika list_7, kemungkinan masalahnya ada pada list, bukan indeks. Jika Anda mengharapkan list menjadi list0, periksa apakah itu berisi list0 - terutama jika mengandung tepat satu elemen, yaitu list0. Kemudian periksa apakah itu list_0 yang harus benar-benar diperhatikan. Jika demikian, solusinya mudah. cukup tambahkan tingkat pengindeksan lain, untuk meraih list0 itu terlebih dahulu. Ini biasanya terjadi saat mencoba mengambil data dari JSON yang diurai

Pesan kesalahan tentang pemformatan string

Serius, apakah Anda berniat melakukan pemformatan string? . Tetapi kemungkinan besar, sisi kiri adalah beberapa string seperti list6 yang seharusnya diubah menjadi list7 (atau mungkin list8) terlebih dahulu

Pesan kesalahan tentang "deskriptor"

Pesan kesalahan Python di sini cukup samar - ini menggunakan terminologi yang jarang dikhawatirkan oleh sebagian besar programmer. Tapi begitu dikenali, kesalahannya sangat mudah untuk dicocokkan dengan pola. Berhati-hatilah jika kelas dapat dibuat instance-nya tanpa argumen - sepasang tanda kurung kosong list9 masih diperlukan untuk membuat instance kelas; . Sebuah instance diperlukan untuk menggunakan metode

Pesan kesalahan khusus dari fungsi bawaan

Sebuah "operan buruk" untuk operator "unary" (misalnya months0) dapat disebabkan oleh koma liar. months1 tidak sama dengan months2; . (Anda tahu bagaimana Anda bisa menulis e. g. months_5 untuk mendapatkan angka negatif? . Ternyata Anda juga bisa menulis months_7; . )

Terutama jika Anda harus memigrasikan kode dari 2. x ke 3. x, berhati-hatilah tentang perbedaan antara months9 dan str jenis dalam 3. x. months_9 mewakili data mentah; . Ini adalah hal-hal yang pada dasarnya berbeda dan tidak terkait, dan hanya mungkin untuk mengubah dari satu ke yang lain dengan menggunakan pengkodean. Dalam Python 3. x, file yang dibuka dalam mode biner (menggunakan months4 dalam string mode) menghasilkan months9 saat dibaca, dan harus diberikan sesuatu yang kompatibel dengan months9 saat ditulis ke. str tidak memenuhi syarat; . Kanonik untuk masalah ini adalah TypeError. diperlukan objek seperti byte, bukan 'str' saat menulis ke file dengan Python 3

Pesan kesalahan di mana sesuatu "tidak" dapat digunakan dalam beberapa cara

Apakah Anda ingin menggunakannya seperti itu?

Python tidak bisa membaca maksud Anda. Misalnya, mengakses elemen daftar dilakukan menggunakan months7, bukan list9. Jika kode mengatakan list_9 sebagai gantinya, itu akan ditafsirkan sebagai upaya untuk memanggil daftar, sehingga pesan kesalahan akan mengeluh bahwa daftar tidak dapat dipanggil

Tidak dapat diubah

Ketika sesuatu from some_module import *_0, masalahnya sangat mungkin dengan hal itu, bukan iterasi. Jika Anda ingin from some_module import *1 loop berjalan beberapa kali, Anda masih memerlukan sesuatu untuk diulangi; . Hal yang sama berlaku jika Anda menggunakan pemahaman daftar dll. untuk membuat banyak salinan dari suatu nilai. Jika Anda memiliki bilangan bulat from some_module import *_3 dan Anda ingin membuat daftar dengan satu item, yaitu bilangan bulat itu, yang dieja from some_module import *4, bukan from some_module import *5

Sangat umum untuk melihat from some_module import *6. Tepatnya ada satu from some_module import *_7. nilai khusus None - Python melarang membuat lebih banyak instance dari kelas itu. Metode python yang berfungsi di tempat - terutama metode daftar - umumnya mengembalikan None daripada daftar yang telah dimodifikasi. Lihat juga TypeError. Objek 'NoneType' tidak dapat diubah dengan Python

Tidak dapat dipanggil

Jika @staticmethod_0, kemungkinan besar karena Anda menginginkan fungsi atau kelas dari modul, yang memiliki nama yang sama dengan modul, bukan modul itu sendiri. Contoh tertaut adalah untuk pustaka standar @staticmethod1;

Pastikan juga kode tidak memanggil fungsi dan mengingat hasilnya, alih-alih mengingat fungsi itu sendiri. Ini adalah masalah umum dengan API yang mengharapkan fungsi "panggilan balik". (Jika Anda perlu memilih argumen sebelumnya, tetapi tidak benar-benar memanggil fungsi, lihat Pengikat Argumen Python. ) Terkadang orang juga mencoba memberikan nama fungsi sebagai string, daripada memberikan fungsi itu sendiri

Pemula terkadang berharap bisa melakukan "perkalian implisit" dalam rumus matematika, cara kerjanya di kelas matematika. Dalam program Python (seperti bahasa populer lainnya), kode seperti @staticmethod4 tidak mengalikan bilangan bulat @staticmethod5 dengan hasil @staticmethod6; . Lihat Mengapa saya mendapatkan "TypeError. objek 'int' tidak dapat dipanggil" dari kode seperti "5(panjang_sisi**2)"?

Tidak dapat dilanggankan

Terkadang, orang mencoba mendapatkan "digit" dari sebuah angka dengan mengindeksnya seolah-olah itu adalah sebuah string. Nilai list7 dan list8 bukan string; . Jadi ini akan menyebabkan "tidak dapat dilanggani" input5. Nilai numeriknya sama terlepas dari basis apa Anda menuliskannya, dan ada cara lain untuk menulis angka selain basis sepuluh;

Jika Anda mencoba bekerja dengan daftar bersarang, berhati-hatilah saat mengindeksnya. Daftar seperti None_1 harus diindeks seperti None2, bukan e. g. None3. Logikanya di sini seharusnya cukup sederhana. kode yang benar berarti mengindeks ke None4 (mendapatkan daftar bilangan bulat), dan kemudian mengindeks ke hasil itu. Kode yang salah berarti menggunakan None_5 sebagai indeks ke None6 terlebih dahulu, karena cara tanda kurung bersarang

Bagaimana cara memperbaiki kesalahan ketik di Python?

Cara Memperbaiki TypeError dengan Python. Untuk menghindari kesalahan ketik di Python, jenis objek harus diperiksa sebelum melakukan operasi . Ini dapat membantu memastikan bahwa tipe objek sesuai untuk operasi dan jika operasi didukung oleh objek.

Apa yang menyebabkan kesalahan ketik di Python?

TypeError adalah salah satu dari beberapa pengecualian standar Python. TypeError dimunculkan setiap kali operasi dilakukan pada tipe objek yang salah/tidak didukung. Misalnya, menggunakan operator + (tambahan) pada string dan nilai integer akan memunculkan TypeError

Bagaimana cara memperbaiki kesalahan jenis?

Memperbaiki TypeError . Secara umum, untuk memperbaiki TypeError, pikirkan baik-baik tentang jenis nilai di baris yang disorot Python untuk Anda. Jenisnya tidak kompatibel. Jadi putuskan tipe mana yang benar-benar Anda inginkan, lalu gunakan gips. casting your value(s) to the correct type. In general, to fix a TypeError, think carefully about the types of the values in the line that Python highlighted for you. The types are not compatible. So decide which types you really want, then use casts.

Bagaimana cara memperbaiki kesalahan nilai Python?

Untuk mengatasi ValueError dalam kode Python, blok coba-kecuali dapat digunakan . Baris kode yang dapat membuang ValueError harus ditempatkan di blok try, dan blok exception dapat menangkap dan menangani kesalahan.