


Cara Berbeza untuk Membetulkan Import Pekeliling dalam Python
Nov 05, 2024 am 02:21 AMPernahkah anda menjumpai import bulat dalam Python? Nah, ini adalah bau kod yang sangat biasa yang menunjukkan sesuatu yang tidak kena dengan reka bentuk atau struktur.
Contoh Import Pekeliling
Bagaimanakah import pekeliling berlaku? Ralat import ini biasanya berlaku apabila dua atau lebih modul bergantung antara satu sama lain cuba mengimport sebelum memulakan sepenuhnya.
Katakan kita mempunyai dua modul: module_1.py dan module_2.py.
# module_1.py from module_2 import ModY class ModX: mody_obj = ModY()
# module_2.py from module_1 import ModX class ModY: modx_obj = ModX()
Dalam coretan kod di atas, kedua-dua modul_1 dan modul_2 saling bergantung antara satu sama lain.
Pemulaan mody_obj dalam modul_1 bergantung pada modul_2 dan pemulaan modx_obj dalam modul_2 bergantung pada modul_1.
Inilah yang kami panggil pergantungan bulat. Kedua-dua modul akan tersekat dalam gelung import semasa cuba memuatkan satu sama lain.
Jika kami menjalankan module_1.py, kami akan mendapat jejak balik berikut.
Traceback (most recent call last): File "module_1.py", line 1, in <module> from module_2 import ModY File "module_2.py", line 1, in <module> from module_1 import ModX File "module_1.py", line 1, in <module> from module_2 import ModY ImportError: cannot import name 'ModY' from partially initialized module 'module_2' (most likely due to a circular import)
Ralat ini menerangkan situasi import pekeliling. Apabila program cuba mengimport ModY daripada module_2, pada masa itu module_2 tidak dimulakan sepenuhnya (disebabkan oleh kenyataan import lain yang cuba mengimport ModX daripada module_1).
Bagaimana untuk membetulkan import pekeliling dalam Python? Terdapat cara yang berbeza untuk menyingkirkan import pekeliling dalam Python.
Betulkan Import Pekeliling dalam Python
Alihkan kod ke dalam fail biasa
Kami boleh mengalihkan kod ke dalam fail biasa untuk mengelakkan ralat import dan kemudian cuba mengimport modul daripada fail itu.
# main.py ----> common file class ModX: pass class ModY: pass
Dalam coretan kod di atas, kami mengalihkan kelas ModX dan ModY ke dalam fail biasa (main.py).
# module_1.py from main import ModY class Mod_X: mody_obj = ModY()
# module_2.py from main import ModX class Mod_Y: modx_obj = ModX()
Sekarang, modul_1 dan modul_2 mengimport kelas dari utama yang membetulkan keadaan import bulat.
Terdapat masalah dengan pendekatan ini, kadangkala pangkalan kod terlalu besar sehingga menjadi berisiko untuk memindahkan kod ke fail lain.
Alihkan import ke penghujung modul
Kita boleh mengalihkan pernyataan import pada penghujung modul. Ini akan memberi masa untuk memulakan modul sepenuhnya sebelum mengimport modul lain.
# module_1.py class ModX: pass from module_2 import ModY class Mod_X: mody_obj = ModY()
# module_2.py class ModY: pass from module_1 import ModX
Mengimport modul dalam skop kelas/fungsi
Mengimport modul dalam kelas atau skop fungsi boleh mengelakkan import bulat. Ini membolehkan modul diimport hanya apabila kelas atau fungsi dipanggil. Ia relevan apabila kita ingin meminimumkan penggunaan memori.
# module_1.py class ModX: pass class Mod_X: from module_2 import ModY mody_obj = ModY()
# module_2.py class ModY: pass class Mod_Y: from module_1 import ModX modx_obj = ModX()
Kami mengalihkan pernyataan import dalam kelas Mod_X dan skop Mod_Y dalam modul_1 dan modul_2 masing-masing.
Jika kami menjalankan sama ada modul_1 atau modul_2, kami tidak akan mendapat ralat import bulat. Tetapi, pendekatan ini menjadikan kelas boleh diakses hanya dalam skop kelas, jadi kami tidak boleh memanfaatkan import secara global.
Menggunakan nama modul/alias
Menggunakan nama modul atau hanya alias seperti ini menyelesaikan masalah. Ini membolehkan kedua-dua modul dimuatkan sepenuhnya dengan menangguhkan pergantungan bulat sehingga masa jalan.
# module_1.py from module_2 import ModY class ModX: mody_obj = ModY()
# module_2.py from module_1 import ModX class ModY: modx_obj = ModX()
Menggunakan perpustakaan importlib
Kami juga boleh menggunakan perpustakaan importlib untuk mengimport modul secara dinamik.
Traceback (most recent call last): File "module_1.py", line 1, in <module> from module_2 import ModY File "module_2.py", line 1, in <module> from module_1 import ModX File "module_1.py", line 1, in <module> from module_2 import ModY ImportError: cannot import name 'ModY' from partially initialized module 'module_2' (most likely due to a circular import)
# main.py ----> common file class ModX: pass class ModY: pass
Import Pekeliling dalam Pakej Python
Biasanya, import bulat datang daripada modul dalam pakej yang sama. Dalam projek yang kompleks, struktur direktori juga kompleks, dengan pakej dalam pakej.
Pakej dan subpakej ini mengandungi fail __init__.py untuk menyediakan akses yang lebih mudah kepada modul. Di situlah kadangkala timbul kebergantungan bulat antara modul secara tidak sengaja.
Kami mempunyai struktur direktori berikut.
# module_1.py from main import ModY class Mod_X: mody_obj = ModY()
Kami mempunyai pakej mainpkg dan fail main.py. Kami mempunyai dua subpakej modpkg_x dan modpkg_y dalam mainpkg.
Berikut ialah rupa setiap fail Python dalam modpkg_x dan modpkg_y.
mainpkg/modpkg_x/__init__.py
# module_2.py from main import ModX class Mod_Y: modx_obj = ModX()
Fail ini mengimport kedua-dua kelas (ModX dan ModA) daripada module_1 dan module_1_1.
mainpkg/modpkg_x/module_1.py
# module_1.py class ModX: pass from module_2 import ModY class Mod_X: mody_obj = ModY()
Modul_1 mengimport ModY kelas daripada modul_2.
mainpkg/modpkg_x/module_1_1.py
# module_2.py class ModY: pass from module_1 import ModX
Modul_1_1 tidak mengimport apa-apa. Ia tidak bergantung pada mana-mana modul.
mainpkg/modpkg_y/__init__.py
# module_1.py class ModX: pass class Mod_X: from module_2 import ModY mody_obj = ModY()
Fail ini mengimport kelas ModY daripada modul_2.
mainpkg/modpkg_y/module_2.py
# module_2.py class ModY: pass class Mod_Y: from module_1 import ModX modx_obj = ModX()
Modul_2 mengimport ModA kelas daripada modul_1_1.
Kami mempunyai kod berikut dalam fail main.py.
root_dir/main.py
# module_1.py import module_2 as m2 class ModX: def __init__(self): self.mody_obj = m2.ModY()
Fail utama mengimport ModY kelas daripada module_2. Fail ini bergantung pada modul_2.
Jika kita menggambarkan kitaran import di sini, ia akan kelihatan seperti berikut mengabaikan fail __init__.py dalam modpkg_x dan modpkg_y.
Kita dapat melihat bahawa fail utama bergantung pada modul_2, modul_1 juga bergantung pada modul_2 dan modul_2 bergantung pada modul_1_1. Tiada kitaran import.
Tetapi anda tahu, modul bergantung pada fail __init__.py mereka, jadi fail __init__.py dimulakan dahulu dan modul diimport semula.
Beginilah rupa kitaran import sekarang.
Modul_1_1 yang dibuat ini bergantung pada modul_1, yang merupakan kebergantungan palsu.
Jika ini berlaku, kosongkan fail __init__.py subpakej dan menggunakan fail __init__.py yang berasingan boleh membantu dengan memusatkan import pada peringkat pakej.
# module_1.py from module_2 import ModY class ModX: mody_obj = ModY()
Dalam struktur ini, kami menambah subpkg subpakej lain dalam mainpkg.
mainpkg/subpkg/__init__.py
# module_2.py from module_1 import ModX class ModY: modx_obj = ModX()
Ini akan membolehkan modul dalaman mengimport daripada satu sumber, mengurangkan keperluan untuk import silang.
Kini kami boleh mengemas kini pernyataan import dalam fail main.py.
root_dir/main.py
Traceback (most recent call last): File "module_1.py", line 1, in <module> from module_2 import ModY File "module_2.py", line 1, in <module> from module_1 import ModX File "module_1.py", line 1, in <module> from module_2 import ModY ImportError: cannot import name 'ModY' from partially initialized module 'module_2' (most likely due to a circular import)
Ini menyelesaikan masalah pergantungan bulat antara modul dalam pakej yang sama.
Kesimpulan
Kebergantungan bulat atau import dalam Python ialah bau kod yang merupakan petunjuk penstrukturan semula dan pemfaktoran semula kod yang serius.
Anda boleh mencuba mana-mana cara yang dinyatakan di atas ini untuk mengelakkan pergantungan bulat dalam Python.
?Artikel lain yang mungkin anda minati jika anda menyukai artikel ini
?Templat Warisan dalam Flask dengan Contoh.
?Perbezaan antara exec() dan eval() dengan Contoh.
?Memahami Penggunaan Kata Kunci global dalam Python.
?Petua Jenis Python: Fungsi, Nilai Pulangan, Pembolehubah.
?Mengapa Slash dan Asterisk Digunakan dalam Definisi Fungsi.
?Bagaimanakah kadar pembelajaran mempengaruhi model ML dan DL?
Itu sahaja buat masa ini.
Teruskan Pengekodan??.
Atas ialah kandungan terperinci Cara Berbeza untuk Membetulkan Import Pekeliling dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Kunci untuk menangani pengesahan API adalah untuk memahami dan menggunakan kaedah pengesahan dengan betul. 1. Apikey adalah kaedah pengesahan yang paling mudah, biasanya diletakkan dalam tajuk permintaan atau parameter URL; 2. BasicAuth menggunakan nama pengguna dan kata laluan untuk penghantaran pengekodan Base64, yang sesuai untuk sistem dalaman; 3. OAuth2 perlu mendapatkan token terlebih dahulu melalui client_id dan client_secret, dan kemudian bawa bearertoken dalam header permintaan; 4. Untuk menangani tamat tempoh token, kelas pengurusan token boleh dikemas dan secara automatik menyegarkan token; Singkatnya, memilih kaedah yang sesuai mengikut dokumen dan menyimpan maklumat utama adalah kunci.

Kaedah yang sama untuk melintasi dua senarai secara serentak dalam Python adalah menggunakan fungsi zip (), yang akan memasangkan beberapa senarai dalam rangka dan menjadi yang paling singkat; Jika panjang senarai tidak konsisten, anda boleh menggunakan itertools.zip_longest () untuk menjadi yang paling lama dan mengisi nilai yang hilang; Digabungkan dengan penghitungan (), anda boleh mendapatkan indeks pada masa yang sama. 1.Zip () adalah ringkas dan praktikal, sesuai untuk lelaran data berpasangan; 2.zip_longest () boleh mengisi nilai lalai apabila berurusan dengan panjang yang tidak konsisten; 3.enumerate (zip ()) boleh mendapatkan indeks semasa traversal, memenuhi keperluan pelbagai senario kompleks.

Inpython, iteratorsareObjectsThatallowLoopingthroughCollectionsByImplementing__iter __ () dan__Next __ ()

Untuk mewujudkan API moden dan cekap menggunakan Python, FastAPI disyorkan; Ia berdasarkan kepada jenis python standard yang diminta dan secara automatik dapat menghasilkan dokumen, dengan prestasi yang sangat baik. Selepas memasang FastAPI dan Asgi Server UVicorn, anda boleh menulis kod antara muka. Dengan menentukan laluan, menulis fungsi pemprosesan, dan data yang kembali, API boleh dibina dengan cepat. FastAPI menyokong pelbagai kaedah HTTP dan menyediakan sistem dokumentasi Swaggersui dan Redoc yang dihasilkan secara automatik. Parameter URL boleh ditangkap melalui definisi laluan, manakala parameter pertanyaan boleh dilaksanakan dengan menetapkan nilai lalai untuk parameter fungsi. Penggunaan rasional model Pydantic dapat membantu meningkatkan kecekapan dan ketepatan pembangunan.

Untuk menguji API, anda perlu menggunakan Perpustakaan Permintaan Python. Langkah -langkahnya adalah untuk memasang perpustakaan, menghantar permintaan, mengesahkan respons, menetapkan masa dan cuba semula. Pertama, pasang perpustakaan melalui PipinstallRequests; kemudian gunakan permintaan.get () atau requests.post () dan kaedah lain untuk menghantar permintaan GET atau pos; Kemudian semak respons.status_code dan response.json () untuk memastikan hasil pulangan mematuhi jangkaan; Akhirnya, tambah parameter tamat masa untuk menetapkan masa tamat, dan menggabungkan perpustakaan semula untuk mencapai percubaan automatik untuk meningkatkan kestabilan.

Dalam Python, pembolehubah yang ditakrifkan di dalam fungsi adalah pembolehubah tempatan dan hanya sah dalam fungsi; Ditakrifkan secara luaran adalah pembolehubah global yang boleh dibaca di mana sahaja. 1. Pembolehubah tempatan dimusnahkan kerana fungsi dilaksanakan; 2. Fungsi ini boleh mengakses pembolehubah global tetapi tidak dapat diubahsuai secara langsung, jadi kata kunci global diperlukan; 3. Jika anda ingin mengubah suai pembolehubah fungsi luar dalam fungsi bersarang, anda perlu menggunakan kata kunci nonlocal; 4. Pembolehubah dengan nama yang sama tidak mempengaruhi satu sama lain dalam skop yang berbeza; 5. Global mesti diisytiharkan apabila mengubah suai pembolehubah global, jika tidak, kesilapan unboundlocalerror akan dibangkitkan. Memahami peraturan ini membantu mengelakkan pepijat dan menulis lebih banyak fungsi yang boleh dipercayai.

Ya, anda boleh menghuraikan jadual HTML menggunakan python dan panda. Pertama, gunakan fungsi pandas.read_html () untuk mengekstrak jadual, yang boleh menghuraikan elemen HTML dalam laman web atau rentetan ke dalam senarai dataframe; Kemudian, jika jadual tidak mempunyai tajuk lajur yang jelas, ia boleh ditetapkan dengan menentukan parameter header atau menetapkan secara manual atribut. Untuk halaman yang kompleks, anda boleh menggabungkan Perpustakaan Permintaan untuk mendapatkan kandungan HTML atau menggunakan BeautifulSoup untuk mencari jadual tertentu; Perhatikan perangkap biasa seperti rendering JavaScript, masalah pengekodan, dan pengiktirafan pelbagai meja.

Cara untuk mengakses objek JSON bersarang di Python adalah untuk menjelaskan struktur dan kemudian lapisan indeks dengan lapisan. Pertama, sahkan hubungan hierarki JSON, seperti kamus kamus bersarang atau senarai; Kemudian gunakan kunci kamus dan indeks senarai untuk mengakses lapisan mengikut lapisan, seperti data "butiran" ["zip"] untuk mendapatkan pengekodan zip, data "butiran" [0] untuk mendapatkan hobi pertama; Untuk mengelakkan keyError dan indexError, nilai lalai boleh ditetapkan oleh kaedah .get (), atau fungsi enkapsulasi Safe_get boleh digunakan untuk mencapai akses yang selamat; Untuk struktur yang kompleks, cari rekursif atau gunakan perpustakaan pihak ketiga seperti JMespath untuk mengendalikan.
