Modul python getattr tidak memiliki atribut

Berikut adalah contoh bagaimana kesalahan terjadi ketika modul yang diimpor dibayangi oleh file lokal dengan nama yang sama

Ini adalah file bernama main.py_ yang menggunakan modul requests

Namun, saya memiliki file lokal bernama

def first_function():
    print('first function')
_0 yang membayangi modul requests resmi dan menyebabkan kesalahan

def greet():
    print('hello world')
_

Ini juga dapat terjadi ketika Anda memberi modul nama yang sama dengan modul pustaka standar, mis. g.

def first_function():
    print('first function')
_2

Anda dapat menggunakan modul

def first_function():
    print('first function')
_3 untuk mencetak semua nama modul bawaan jika Anda pernah bertanya-tanya apakah modul lokal Anda berbenturan dengan modul bawaan

Kesalahan juga terjadi jika salah satu modul yang Anda impor mengimpor modul yang memiliki nama yang sama dengan file lokal di proyek Anda

Misalnya, jika Anda mengimpor requests dan requests mengimpor

def first_function():
    print('first function')
2, tetapi Anda memiliki file lokal bernama
def first_function():
    print('first function')
7, Anda masih akan mendapatkan kesalahan

Penerjemah Python dalam modul bawaan, lalu di direktori saat ini, lalu di PATH PYTHON, lalu di direktori default yang bergantung pada instalasi

Jadi, saat kami membuat file lokal dengan nama yang sama dengan modul pihak ketiga, kami secara efektif membayangi modul resmi dengan file lokal kami

Untuk mengatasi Python "AttributeError. modul tidak memiliki atribut", pastikan Anda belum menamai modul lokal Anda dengan nama modul jarak jauh, mis. g.

def first_function():
    print('first function')
7 atau
def first_function():
    print('first function')
0 dan menghapus semua dependensi melingkar dalam pernyataan import

Itu juga mendefinisikan nama untuk beberapa tipe objek yang digunakan oleh juru bahasa Python standar, tetapi tidak diekspos sebagai builtin seperti atau

Terakhir, ini menyediakan beberapa kelas dan fungsi utilitas terkait tipe tambahan yang tidak cukup mendasar untuk dibangun

Pembuatan Tipe Dinamis

jenis. kelas_baru(nama , basis=(), kwds=None, exec_body=None)

Membuat objek kelas secara dinamis menggunakan metaclass yang sesuai

Tiga argumen pertama adalah komponen yang membentuk header definisi kelas. nama kelas, kelas dasar (dalam urutan), argumen kata kunci (seperti metaclass)

Argumen exec_body adalah panggilan balik yang digunakan untuk mengisi ruang nama kelas yang baru dibuat. Itu harus menerima ruang nama kelas sebagai satu-satunya argumen dan memperbarui ruang nama secara langsung dengan konten kelas. Jika tidak ada panggilan balik yang diberikan, efeknya sama dengan meneruskan lambda ns: None

Baru di versi 3. 3

jenis. prepare_class(nama , basis=(), kwds=None)

Menghitung metaclass yang sesuai dan membuat namespace kelas

Argumen adalah komponen yang membentuk header definisi kelas. nama kelas, kelas dasar (berurutan) dan argumen kata kunci (seperti metaclass)

Nilai yang dikembalikan adalah 3-tuple. metaclass, namespace, kwds

metaclass adalah metaclass yang sesuai, namespace adalah namespace kelas yang disiapkan dan kwds adalah salinan terbaru dari argumen kwds yang diteruskan dengan entri 'metaclass' dihapus. Jika tidak ada argumen kwds yang diteruskan, ini akan menjadi dict kosong

Baru di versi 3. 3

Berubah di versi 3. 6. Nilai default untuk elemen

class SimpleNamespace:
    def __init__(self, /, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        items = (f"{k}={v!r}" for k, v in self.__dict__.items())
        return "{}({})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace):
           return self.__dict__ == other.__dict__
        return NotImplemented
0 dari tuple yang dikembalikan telah berubah. Sekarang pemetaan urutan penyisipan digunakan ketika metaclass tidak memiliki metode
class SimpleNamespace:
    def __init__(self, /, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        items = (f"{k}={v!r}" for k, v in self.__dict__.items())
        return "{}({})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace):
           return self.__dict__ == other.__dict__
        return NotImplemented
1.

Lihat juga

Detail lengkap dari proses pembuatan kelas yang didukung oleh fungsi-fungsi ini

PEP 3115 - Metaclasses di Python 3000

Memperkenalkan pengait namespace

class SimpleNamespace:
    def __init__(self, /, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        items = (f"{k}={v!r}" for k, v in self.__dict__.items())
        return "{}({})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace):
           return self.__dict__ == other.__dict__
        return NotImplemented
1

jenis. resolve_bases(resolve_bases)

Selesaikan entri MRO secara dinamis seperti yang ditentukan oleh PEP 560

Fungsi ini mencari item dalam basis yang bukan turunan dari , dan mengembalikan tuple di mana setiap objek yang memiliki metode

class SimpleNamespace:
    def __init__(self, /, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        items = (f"{k}={v!r}" for k, v in self.__dict__.items())
        return "{}({})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace):
           return self.__dict__ == other.__dict__
        return NotImplemented
4 diganti dengan hasil yang belum dibuka dari pemanggilan metode ini. Jika item basis adalah turunan dari , atau tidak memiliki metode
class SimpleNamespace:
    def __init__(self, /, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        items = (f"{k}={v!r}" for k, v in self.__dict__.items())
        return "{}({})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace):
           return self.__dict__ == other.__dict__
        return NotImplemented
4, maka item tersebut disertakan dalam tuple pengembalian tidak berubah

Baru di versi 3. 7

Lihat juga

PEP 560 - Dukungan inti untuk modul pengetikan dan tipe umum

Jenis Penerjemah Standar

Modul ini memberikan nama untuk banyak tipe yang diperlukan untuk mengimplementasikan juru bahasa Python. Ini dengan sengaja menghindari memasukkan beberapa jenis yang muncul hanya secara kebetulan selama pemrosesan seperti jenis

class SimpleNamespace:
    def __init__(self, /, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        items = (f"{k}={v!r}" for k, v in self.__dict__.items())
        return "{}({})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace):
           return self.__dict__ == other.__dict__
        return NotImplemented
7

Penggunaan umum dari nama-nama ini adalah untuk atau cek

Jika Anda menginstansiasi salah satu dari jenis ini, perhatikan bahwa tanda tangan dapat berbeda di antara versi Python

Nama standar ditentukan untuk jenis berikut

jenis. NoneType

Tipe dari

Baru di versi 3. 10

jenis. Jenis Fungsijenis. LambdaType

Jenis fungsi yang ditentukan pengguna dan fungsi yang dibuat oleh ekspresi

Memunculkan types_2 dengan argumen types3

Kejadian audit hanya terjadi untuk instantiasi langsung objek fungsi, dan tidak dimunculkan untuk kompilasi normal

jenis. JenisGenerator

Jenis objek -iterator, dibuat oleh fungsi generator

jenis. CoroutineType

Jenis objek, dibuat oleh fungsi

Baru di versi 3. 5

jenis. AsyncGeneratorType

Jenis objek -iterator, dibuat oleh fungsi generator asinkron

Baru di versi 3. 6

jenis kelas. Jenis Kode(**kwargs)

Tipe untuk objek kode seperti dikembalikan oleh

Memunculkan types6 dengan argumen types3, types8, types9, int0, int1, int2, int3, ________32______4, ________3

Perhatikan bahwa argumen yang diaudit mungkin tidak cocok dengan nama atau posisi yang diperlukan oleh penginisialisasi. Kejadian audit hanya terjadi untuk instantiasi langsung objek kode, dan tidak dimunculkan untuk kompilasi normal

ganti(**kwargs)

Kembalikan salinan objek kode dengan nilai baru untuk bidang yang ditentukan

Baru di versi 3. 8

jenis. CellType

Tipe untuk objek sel. objek seperti itu digunakan sebagai wadah untuk variabel bebas fungsi

Baru di versi 3. 8

jenis. Tipe Metode

Jenis metode instance kelas yang ditentukan pengguna

jenis. BuiltinFunctionTypetipe. BuiltinMethodType

Jenis fungsi bawaan seperti or , dan metode kelas bawaan. (Di sini, istilah "built-in" berarti "ditulis dalam C". )

jenis. WrapperDescriptorType

Jenis metode dari beberapa tipe data bawaan dan kelas dasar seperti atau

Baru di versi 3. 7

jenis. MethodWrapperType

Jenis metode terikat dari beberapa tipe data bawaan dan kelas dasar. Misalnya jenis str0

Baru di versi 3. 7

jenis. NotImplementedType

Tipe dari

Baru di versi 3. 10

jenis. MethodDescriptorType

Jenis metode dari beberapa tipe data bawaan seperti

Baru di versi 3. 7

jenis. ClassMethodDescriptorType

Jenis metode kelas tidak terikat dari beberapa tipe data bawaan seperti str3

Baru di versi 3. 7

jenis kelas. ModuleType(nama , doc=None)

Tipe dari. Konstruktor mengambil nama modul yang akan dibuat dan secara opsional

Catatan

Gunakan untuk membuat modul baru jika Anda ingin menyetel berbagai atribut yang dikontrol impor

__dokter__

Bagian dari modul. Default ke types0

__pemuat__

Yang memuat modul. Default ke types0

Atribut ini untuk mencocokkan seperti yang disimpan dalam objek

Catatan

Versi Python yang akan datang mungkin berhenti menyetel atribut ini secara default. Untuk mencegah kemungkinan perubahan ini, lebih baik baca dari atribut atau gunakan metaclass0 jika Anda secara eksplisit perlu menggunakan atribut ini

Berubah di versi 3. 4. Default ke types0. Sebelumnya atribut bersifat opsional.

__nama__

Nama modul. Diharapkan cocok

__kemasan__

Modul mana yang dimiliki. Jika modulnya adalah tingkat atas (mis. e. bukan bagian dari paket tertentu) maka atribut harus disetel ke metaclass3, selain itu harus disetel ke nama paket (yang bisa jika modul adalah paket itu sendiri). Default ke types0

Atribut ini untuk mencocokkan seperti yang disimpan dalam objek

Catatan

Versi Python yang akan datang mungkin berhenti menyetel atribut ini secara default. Untuk menghindari kemungkinan perubahan ini, lebih baik baca dari atribut saja atau gunakan metaclass9 jika Anda secara eksplisit perlu menggunakan atribut ini

Berubah di versi 3. 4. Default ke types0. Sebelumnya atribut bersifat opsional.

__spec__

Catatan status terkait sistem impor modul. Diharapkan menjadi contoh dari

Baru di versi 3. 4

jenis. EllipsisType

Tipe dari

Baru di versi 3. 10

jenis kelas. GenericAlias(t_origin , t_args)

Jenis seperti lambda ns: None3

lambda ns: None4 harus berupa kelas generik non-parameter, seperti lambda ns: None5, lambda ns: None6 atau lambda ns: None7. lambda ns: None_8 harus berupa (mungkin dengan panjang 1) jenis yang menjadi parameter lambda ns: None4

>>> from types import GenericAlias

>>> list[int] == GenericAlias(list, (int,))
True
>>> dict[str, int] == GenericAlias(dict, (str, int))
True

Baru di versi 3. 9

Berubah di versi 3. 9. 2. Tipe ini sekarang dapat dijadikan subkelas.

jenis kelas. UnionType

Tipe dari

Baru di versi 3. 10

jenis kelas. TracebackType(tb_next , tb_frame, tb_lasti, tb_lineno)

Jenis objek traceback seperti yang ditemukan di metaclass1

Lihat detail atribut dan operasi yang tersedia, dan panduan untuk membuat traceback secara dinamis

jenis. FrameType

Jenis objek bingkai seperti yang ditemukan di metaclass2 jika metaclass3 adalah objek traceback

Lihat detail atribut dan operasi yang tersedia

jenis. GetSetDescriptorType

Jenis objek yang ditentukan dalam modul ekstensi dengan metaclass4, seperti metaclass5 atau metaclass6. Jenis ini digunakan sebagai deskriptor untuk atribut objek;

jenis. MemberDescriptorType

Jenis objek yang ditentukan dalam modul ekstensi dengan metaclass8, seperti metaclass9. Tipe ini digunakan sebagai deskriptor untuk anggota data C sederhana yang menggunakan fungsi konversi standar;

Detail implementasi CPython. Dalam implementasi Python lainnya, tipe ini mungkin identik dengan metaclass, namespace, kwds1

jenis kelas. MappingProxyType(memetakan)

Proksi hanya-baca dari sebuah pemetaan. Ini memberikan tampilan dinamis pada entri pemetaan, yang berarti bahwa saat pemetaan berubah, tampilan mencerminkan perubahan ini

Baru di versi 3. 3

Berubah di versi 3. 9. Diperbarui untuk mendukung operator gabungan baru (metaclass, namespace, kwds2) dari PEP 584, yang hanya mendelegasikan ke pemetaan dasar.

kunci di proksi

Kembalikan metaclass, namespace, kwds_3 jika pemetaan yang mendasarinya memiliki kunci kunci, selain itu metaclass, namespace, kwds4

proksi[kunci]

Kembalikan item pemetaan yang mendasarinya dengan key key. Memunculkan kunci if tidak ada dalam pemetaan yang mendasarinya

iter(proksi)

Kembalikan iterator di atas kunci pemetaan yang mendasarinya. Ini adalah jalan pintas untuk metaclass, namespace, kwds6

len(proksi)

Kembalikan jumlah item dalam pemetaan yang mendasarinya

salin()

Kembalikan salinan dangkal dari pemetaan yang mendasarinya

dapatkan(kunci[ , default])

Kembalikan nilai untuk kunci jika kunci ada di pemetaan yang mendasarinya, jika tidak, default. Jika default tidak diberikan, defaultnya adalah types0, sehingga metode ini tidak pernah memunculkan

item()

Kembalikan tampilan baru dari item pemetaan yang mendasarinya (metaclass, namespace, kwds9 pasang)

kunci()

Kembalikan tampilan baru dari kunci pemetaan yang mendasarinya

nilai()

Kembalikan tampilan baru dari nilai pemetaan yang mendasarinya

terbalik (proksi)

Kembalikan iterator terbalik di atas kunci pemetaan yang mendasarinya

Baru di versi 3. 9

Kelas dan Fungsi Utilitas Tambahan

jenis kelas. SimpleNamespace

Subclass sederhana yang menyediakan akses atribut ke namespace-nya, serta repr yang berarti

Tidak seperti , dengan 'metaclass'_2 Anda dapat menambah dan menghapus atribut. Jika objek 'metaclass'_2 diinisialisasi dengan argumen kata kunci, objek tersebut langsung ditambahkan ke namespace yang mendasarinya

Jenisnya kira-kira setara dengan kode berikut

class SimpleNamespace:
    def __init__(self, /, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        items = (f"{k}={v!r}" for k, v in self.__dict__.items())
        return "{}({})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace):
           return self.__dict__ == other.__dict__
        return NotImplemented
_

'metaclass'_2 mungkin berguna sebagai pengganti 'metaclass'5. Namun, untuk penggunaan tipe catatan terstruktur sebagai gantinya

Baru di versi 3. 3

Berubah di versi 3. 9. Urutan atribut dalam repr diubah dari abjad menjadi penyisipan (seperti lambda ns: None7).

jenis. DynamicClassAttribute(fget=Tidak ada, fset=None, fdel=None, doc=None)

Arahkan akses atribut pada kelas ke __getattr__

Ini adalah deskriptor, digunakan untuk mendefinisikan atribut yang bertindak berbeda saat diakses melalui instance dan melalui kelas. Akses instance tetap normal, tetapi akses ke atribut melalui kelas akan dialihkan ke metode __getattr__ kelas;

Ini memungkinkan seseorang untuk memiliki properti yang aktif pada sebuah instance, dan memiliki atribut virtual pada kelas dengan nama yang sama (lihat contoh)

Baru di versi 3. 4

Fungsi Utilitas Coroutine

jenis. coroutine(gen_func)

Fungsi ini mengubah fungsi menjadi a yang mengembalikan coroutine berbasis generator. Coroutine berbasis generator masih berupa , tetapi juga dianggap sebagai objek dan. Namun, itu mungkin tidak menerapkan metode 'metaclass'9

Jika gen_func adalah fungsi generator, itu akan dimodifikasi di tempat

Jika gen_func bukan fungsi generator, itu akan dibungkus. Jika mengembalikan instance dari , instance tersebut akan dibungkus dengan objek proxy yang dapat ditunggu. Semua jenis objek lainnya akan dikembalikan sebagaimana adanya

Bagaimana cara mendapatkan Getattr dengan Python?

Sintaksis. getattr(obj, kunci, def)
Parameter
Pengembalian. Nilai objek jika nilai tersedia, nilai default jika atribut tidak ada. dan mengembalikan AttributeError jika atribut tidak ada dan nilai default tidak ada. ditentukan

Apa yang dilakukan __ Getattr __ dengan Python?

Fungsi Python getattr() digunakan untuk mendapatkan nilai atribut objek dan jika tidak ada atribut objek yang ditemukan, nilai default dikembalikan.

Untuk apa Setattr () dan Getattr () digunakan?