[Python-de] Modul von anderswo laden?

Janko Hauser jhauser at ifm.uni-kiel.de
Fri Mar 8 09:09:34 EST 2002


On Fri, 8 Mar 2002 06:05:09 +0100
Matthias Urlichs <smurf at noris.de> wrote:

> Hallo,
> 
> ich habe hier ein Modul, nennen wir es foo.bar. Wenn ich es verwenden 
> will, sag ich folglich "import foo.bar". So weit so gut.
> 
> Dummerweise ist das Ding in meiner Entwicklungsumgebung ganz 
> woanders, d.h. die Datei heisst "libtest/bar.py". Damit findet python 
> natürlich nix. Die Frage lautet nun: kann ich dem import-Statement 
> das Ding trotzdem unterschieben, ohne die Datei woandershin zu 
> kopieren oder mit Symlinks rumzuspielen?
> 
import sys
sys.path.append('path_to_libtest/libtest')
import bar

> 
> Zweite Frage: Ich bin gerade dabei, Dinge zu importieren, die sich 
> als nicht-Module entpuppen...
> 
> foo/__init__.py:
> import foo._bar
> bar=_bar.magie()
> 
> foo/_bar.py:
> def magie():
>      return "Dies ist magisch."
> 
> foo/bar.py:
> import sys
> import foo
> sys.modules["foo.bar"]=foo.bar
> 
> ... und schon ist, nach einem Import von foo.bar, der Wert ebendieses 
> "foo.bar" ein String. Das funktioniert soweit perfekt, hat nur den 
> kleinen Nachteil, dass auch ein nackter "import foo" immer auch 
> foo._bar lädt und magie() aufruft, obwohl ich das möglicherweise 
> diesmal gar nicht brauche.
> 
> Die Frage lautet also: Gibt es eine Möglichkeit, in einem Modul 
> festzustellen, welche Variablen von ihm verlangt werden? 
> (Killerargument für ein solches Feature: mit Perl geht es. ;-)

Das ist ja gerade das Killerargument gegen Perl :-). Ich denke auf Modul-Ebene gibt es nur __all__ womit du bestimmen kannst, welche Namen ein Modul exportiert. Das ist aber wohl nicht dynamisch. Wenn du wirklich solche Tricks machen musst, dann versuche dir eine Factory-Klasse zu bauen, da kannst du alles moegliche einbauen. Aber das Programm wird dadurch wahrscheinlich nicht besser verstaendlich.

__Janko



More information about the Python-de mailing list