Nie mam doświadczenia w pythonie, więc jeśli w moich słowach jest coś złego, po prostu powiedz mi. Jeśli hierarchia plików ułożona jest w następujący sposób:
project\
module_1.py
module_2.py
module_1.pydefiniuje funkcję o nazwie func_1(), module_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
i uruchomisz python module_2.pyw cmd, wykona to, co func_1()definiuje. Tak zazwyczaj importujemy te same pliki hierarchii. Ale kiedy piszesz from .module_1 import func_1w module_2.py, interpreter Pythona powie No module named '__main__.module_1'; '__main__' is not a package. Aby to naprawić, po prostu zachowujemy zmiany, które właśnie wprowadzamy, i przenosimy oba moduły do pakietu, i uruchamiamy trzeci moduł jako program wywołujący module_2.py.
project\
package_1\
module_1.py
module_2.py
main.py
main.py :
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
Ale powodem dodamy .zanim module_1w module_2.pyto, że jeśli nie zrobimy tego i run main.py, interpreter Pythona powie No module named 'module_1', że to trochę skomplikowane, module_1.pyjest tuż obok module_2.py. Teraz niech func_1()się module_1.pycoś zrobić:
def func_1():
print(__name__)
który __name__rejestruje, kto dzwoni do func_1. Teraz trzymamy .przed module_1, uruchom main.py, wydrukuje package_1.module_1, a nie module_1. Wskazuje, że ten, kto dzwoni, func_1()jest w tej samej hierarchii main.py, co .implikuje, że module_1jest w tej samej hierarchii co on module_2.pysam. Więc jeśli nie ma kropki, main.pyrozpozna module_1w tej samej hierarchii co ona, może rozpoznać package_1, ale nie to, co „pod” nią.
Teraz zróbmy to trochę skomplikowanym. Masz a config.inii moduł definiuje funkcję do odczytu w tej samej hierarchii co 'main.py'.
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
I z jakiegoś nieuniknionego powodu musisz do niego zadzwonić module_2.py, więc musi zostać zaimportowany z wyższej hierarchii. moduł_2.py :
import ..config
pass
Dwie kropki oznaczają import z górnej hierarchii (trzy kropki mają dostęp do górnej niż górnej itd.). Teraz możemy uruchomić main.pyinterpreter powie: ValueError:attempted relative import beyond top-level package. „Pakiet najwyższego poziomu” tutaj main.py. Tylko dlatego , że config.pyjest obok main.py, są oni w tej samej hierarchii, config.pynie jest „pod” main.pylub nie jest „prowadzony” przez main.py, więc jest poza main.py. Aby to naprawić, najprostszym sposobem jest:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Myślę, że jest to zbieżne z zasadą hierarchii plików projektu, powinieneś rozmieścić moduły z różnymi funkcjami w różnych folderach i po prostu zostawić górnego rozmówcę na zewnątrz, i możesz importować, jak tylko chcesz.