2016-11-02 47 views
5

mam tę strukturę:Jak zaimportować sam moduł w Pythonie?

. 
└── module 
    ├── __init__.py 
    └── submodule 
     ├── __init__.py 
     ├── foo.py 
     └── bar.py 

W module.submodule.__init__.py mam to:

import foo 
import bar 

W module.submodule.foo.py mam to:

import very_heavy_third_party_module as vhtpm 
... 

Chciałbym importować bar tylko, ale został spowolniony przez foo (wyobraźmy sobie, że w obujest brzydka i module/__init__.py).

Więc moim celem jest napisanie tego poniżej bez uzyskiwania spowolniony przez inne części mojego modułu:

from module.submodule.bar import saybar 
saybar() 

Jak mogę tylko importować saybar położonych w moim modułem bar?

+1

z modułu import submodule.bar.saybar? – Illusionist

+0

@Illusionist naprawdę nie działa. Czy próbowałeś 'from datetime import datetime.now'? – nowox

+0

Nie wiem, czy można to zrobić, ale wygląda na to, że pasek nie należy do tego modułu. – imreal

Odpowiedz

3

Jedynym sposobem na import z bar bez uruchamiania foo jest usunięcie import foo z module.submodule.__init__.py. Dzieje się tak dlatego, że podczas importowania pakietu/modułu w Pythonie, uruchamiany jest cały kod najwyższego poziomu w tym module (lub __init__.py przy imporcie pakietu). Po uruchomieniu from module.submodule.bar import saybar, cały kod najwyższego poziomu w:

  • module.__init__.py
  • module.submodule.__init__.py
  • module.submodule.bar.py

jest prowadzony. Od module.submodule.__init__.py zawiera import foo, foo jest importowany i cały jego kod najwyższego poziomu (w tym import very_heavy_third_party_module as vhtpm) jest uruchamiany, powodując spowolnienie.

kilka możliwych rozwiązań:

  • Move tyle kodu, jak to możliwe poza __init__.py. Powszechną praktyką jest pozostawienie pustych - jeśli istnieje jakaś funkcjonalność, możesz rozważyć przeniesienie go do własnego modułu. Jeśli jedynymi pozostałymi są linie import, możesz je po prostu usunąć, ponieważ nie mają one wpływu na obszar nazw.
  • Przeniesienie import vhtpm w foo.py w dół z najwyższego poziomu (np. Do funkcji, która jest wywoływana przez coś innego w module). To nie jest bardzo czyste, ale może zadziałać, jeśli potrzebujesz optymalizacji.