Rumah pembangunan bahagian belakang Tutorial Python Cara Berbeza untuk Membetulkan Import Pekeliling dalam Python

Cara Berbeza untuk Membetulkan Import Pekeliling dalam Python

Nov 05, 2024 am 02:21 AM

Pernahkah 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()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
# module_2.py
from module_1 import ModX
class ModY:
    modx_obj = ModX()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk

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()
Salin selepas log masuk
Salin selepas log masuk
# module_2.py
from main import ModX

class Mod_Y:
    modx_obj = ModX()
Salin selepas log masuk
Salin selepas log masuk

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()
Salin selepas log masuk
Salin selepas log masuk
# module_2.py
class ModY:
   pass

from module_1 import ModX
Salin selepas log masuk
Salin selepas log masuk

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()
Salin selepas log masuk
Salin selepas log masuk
# module_2.py
class ModY:
   pass

class Mod_Y:
   from module_1 import ModX
   modx_obj = ModX()
Salin selepas log masuk
Salin selepas log masuk

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()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
# module_2.py
from module_1 import ModX
class ModY:
    modx_obj = ModX()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
# main.py ----> common file
class ModX:
    pass

class ModY:
    pass
Salin selepas log masuk
Salin selepas log masuk

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()
Salin selepas log masuk
Salin selepas log masuk

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()
Salin selepas log masuk
Salin selepas log masuk

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()
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk

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()
Salin selepas log masuk
Salin selepas log masuk

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()
Salin selepas log masuk
Salin selepas log masuk

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()
Salin selepas log masuk

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.

Different Ways to Fix Circular Imports in Python

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.

Different Ways to Fix Circular Imports in Python

Beginilah rupa kitaran import sekarang.

Different Ways to Fix Circular Imports in Python

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()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

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

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1653
14
Tutorial PHP
1251
29
Tutorial C#
1224
24
Python vs C: Aplikasi dan kes penggunaan dibandingkan Python vs C: Aplikasi dan kes penggunaan dibandingkan Apr 12, 2025 am 12:01 AM

Python sesuai untuk sains data, pembangunan web dan tugas automasi, manakala C sesuai untuk pengaturcaraan sistem, pembangunan permainan dan sistem tertanam. Python terkenal dengan kesederhanaan dan ekosistem yang kuat, manakala C dikenali dengan keupayaan kawalan dan keupayaan kawalan yang mendasari.

Berapa banyak python yang boleh anda pelajari dalam 2 jam? Berapa banyak python yang boleh anda pelajari dalam 2 jam? Apr 09, 2025 pm 04:33 PM

Anda boleh mempelajari asas -asas Python dalam masa dua jam. 1. Belajar pembolehubah dan jenis data, 2. Struktur kawalan induk seperti jika pernyataan dan gelung, 3 memahami definisi dan penggunaan fungsi. Ini akan membantu anda mula menulis program python mudah.

Python: Permainan, GUI, dan banyak lagi Python: Permainan, GUI, dan banyak lagi Apr 13, 2025 am 12:14 AM

Python cemerlang dalam permainan dan pembangunan GUI. 1) Pembangunan permainan menggunakan pygame, menyediakan lukisan, audio dan fungsi lain, yang sesuai untuk membuat permainan 2D. 2) Pembangunan GUI boleh memilih tkinter atau pyqt. TKInter adalah mudah dan mudah digunakan, PYQT mempunyai fungsi yang kaya dan sesuai untuk pembangunan profesional.

Rancangan Python 2 jam: Pendekatan yang realistik Rancangan Python 2 jam: Pendekatan yang realistik Apr 11, 2025 am 12:04 AM

Anda boleh mempelajari konsep pengaturcaraan asas dan kemahiran Python dalam masa 2 jam. 1. Belajar Pembolehubah dan Jenis Data, 2.

Python vs C: Lengkung pembelajaran dan kemudahan penggunaan Python vs C: Lengkung pembelajaran dan kemudahan penggunaan Apr 19, 2025 am 12:20 AM

Python lebih mudah dipelajari dan digunakan, manakala C lebih kuat tetapi kompleks. 1. Sintaks Python adalah ringkas dan sesuai untuk pemula. Penaipan dinamik dan pengurusan memori automatik menjadikannya mudah digunakan, tetapi boleh menyebabkan kesilapan runtime. 2.C menyediakan kawalan peringkat rendah dan ciri-ciri canggih, sesuai untuk aplikasi berprestasi tinggi, tetapi mempunyai ambang pembelajaran yang tinggi dan memerlukan memori manual dan pengurusan keselamatan jenis.

Python: meneroka aplikasi utamanya Python: meneroka aplikasi utamanya Apr 10, 2025 am 09:41 AM

Python digunakan secara meluas dalam bidang pembangunan web, sains data, pembelajaran mesin, automasi dan skrip. 1) Dalam pembangunan web, kerangka Django dan Flask memudahkan proses pembangunan. 2) Dalam bidang sains data dan pembelajaran mesin, numpy, panda, scikit-learn dan perpustakaan tensorflow memberikan sokongan yang kuat. 3) Dari segi automasi dan skrip, Python sesuai untuk tugas -tugas seperti ujian automatik dan pengurusan sistem.

Python dan Masa: Memanfaatkan masa belajar anda Python dan Masa: Memanfaatkan masa belajar anda Apr 14, 2025 am 12:02 AM

Untuk memaksimumkan kecekapan pembelajaran Python dalam masa yang terhad, anda boleh menggunakan modul, masa, dan modul Python. 1. Modul DateTime digunakan untuk merakam dan merancang masa pembelajaran. 2. Modul Masa membantu menetapkan kajian dan masa rehat. 3. Modul Jadual secara automatik mengatur tugas pembelajaran mingguan.

Python: Automasi, skrip, dan pengurusan tugas Python: Automasi, skrip, dan pengurusan tugas Apr 16, 2025 am 12:14 AM

Python cemerlang dalam automasi, skrip, dan pengurusan tugas. 1) Automasi: Sandaran fail direalisasikan melalui perpustakaan standard seperti OS dan Shutil. 2) Penulisan Skrip: Gunakan Perpustakaan Psutil untuk memantau sumber sistem. 3) Pengurusan Tugas: Gunakan perpustakaan jadual untuk menjadualkan tugas. Kemudahan penggunaan Python dan sokongan perpustakaan yang kaya menjadikannya alat pilihan di kawasan ini.

See all articles