Seite 1 von 1

`import_str("foo")` statt `import foo`

Verfasst: Montag 21. Juli 2008, 20:45
von droptix
Ich suche eine Möglichkeit, Module zu importieren, deren Namen ich als String parat habe. Es gibt zwar das imp-Modul, aber da muss man ja gleich den kompletten Pfad zur Modul-Datei und so noch einiges angeben...

Ich suche aber sowas hier: statt `import foo` `import_str("foo")`. Geht das? Ich dachte ich bin schonmal drüber gestolpert, finde es aber nicht wieder... auch nicht hier in der Forum-Suche.

Verfasst: Montag 21. Juli 2008, 20:56
von Leonidas
Du suchst ``__import__``.

Verfasst: Dienstag 22. Juli 2008, 07:25
von jens

Verfasst: Dienstag 22. Juli 2008, 09:01
von veers

Verfasst: Dienstag 22. Juli 2008, 19:03
von jens
Irgendwie komisch den Name. Man importiert ja keinen string...
Finde meine Variante besser: http://www.python-forum.de/post-99528.html#99528 Weil sie im Prinzip genauso funktioniert wie der normale import.

Verfasst: Dienstag 22. Juli 2008, 23:55
von Leonidas
jens hat geschrieben:
Irgendwie komisch den Name. Man importiert ja keinen string...
Finde meine Variante besser: http://www.python-forum.de/post-99528.html#9952
Irgendwie komisch der Name. Man importiert ja nicht zwei Module...

Außerdem mutable Objekte als Default-Parameter in der Signatur? Das wird wohl kaum so funktionieren wie gedacht.

Verfasst: Mittwoch 23. Juli 2008, 07:10
von jens
Leonidas hat geschrieben:Irgendwie komisch der Name. Man importiert ja nicht zwei Module...
Das ist die selbe Idee wie bei urllib und urllib2.
Leonidas hat geschrieben:Außerdem mutable Objekte als Default-Parameter in der Signatur? Das wird wohl kaum so funktionieren wie gedacht.
Was meinst du damit? Kannst du mal ein Beispiel geben?

Verfasst: Mittwoch 23. Juli 2008, 08:01
von audax
jens hat geschrieben:
Leonidas hat geschrieben:Außerdem mutable Objekte als Default-Parameter in der Signatur? Das wird wohl kaum so funktionieren wie gedacht.
Was meinst du damit? Kannst du mal ein Beispiel geben?

Code: Alles auswählen

def test(foo=[]):
    foo.append("bar")
    print foo 


for dummy in xrange(10):
    test()

Code: Alles auswählen

['bar']
['bar', 'bar']
['bar', 'bar', 'bar']
['bar', 'bar', 'bar', 'bar']
['bar', 'bar', 'bar', 'bar', 'bar']
['bar', 'bar', 'bar', 'bar', 'bar', 'bar']
['bar', 'bar', 'bar', 'bar', 'bar', 'bar', 'bar']
['bar', 'bar', 'bar', 'bar', 'bar', 'bar', 'bar', 'bar']
['bar', 'bar', 'bar', 'bar', 'bar', 'bar', 'bar', 'bar', 'bar']
['bar', 'bar', 'bar', 'bar', 'bar', 'bar', 'bar', 'bar', 'bar', 'bar']

yay. Den Code hatte ich noch gespeichert :D

Verfasst: Mittwoch 23. Juli 2008, 08:25
von jens
OK, aber wie kann man das jetzt auf import2() übertragen?

Verfasst: Mittwoch 23. Juli 2008, 08:29
von audax
Bei deiner Funktion tritt der Effekt nicht auf, da du die Argumente nicht veränderst.

Aber eigentlich lässt es man per Konvention ganz, mutables als Default zu nehmen und nimmt stattdessen "None", damit keine Verwirrung auftritt.

Verfasst: Mittwoch 23. Juli 2008, 08:34
von jens
audax hat geschrieben:Aber eigentlich lässt es man per Konvention ganz, mutables als Default zu nehmen und nimmt stattdessen "None", damit keine Verwirrung auftritt.
Das ist mir jetzt zum ersten mal aufgefallen.

Ich hab's mal geändert.

Verfasst: Mittwoch 23. Juli 2008, 11:45
von Leonidas
audax hat geschrieben:Bei deiner Funktion tritt der Effekt nicht auf, da du die Argumente nicht veränderst.
Bei der Funktion tritt das schon auf, denn wenn man sie mit irgendwelchen Parametern aufruft, dann bleiben die Referenzen bestehen und Memory Leaks können durch unbenötigte Referenzen entstehen.

Verfasst: Mittwoch 23. Juli 2008, 14:54
von birkenfeld
Leonidas hat geschrieben:
audax hat geschrieben:Bei deiner Funktion tritt der Effekt nicht auf, da du die Argumente nicht veränderst.
Bei der Funktion tritt das schon auf, denn wenn man sie mit irgendwelchen Parametern aufruft, dann bleiben die Referenzen bestehen und Memory Leaks können durch unbenötigte Referenzen entstehen.
Versteh ich jetzt nicht.

Verfasst: Mittwoch 23. Juli 2008, 15:10
von Leonidas
birkenfeld hat geschrieben:Versteh ich jetzt nicht.
Mein Fehler - das passiert so nicht.