Seite 1 von 1
module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 09:00
von schneitzmaster
Hallo python-cracks,
ich habe eine funktion und möchte als argument ein modul übergeben. Geht das in Pyhton?
mein bsp. code würde idealer weise so aussehen:
Code: Alles auswählen
def test(module=my_module):
import module as mod_my
mod_my.do_something()
return
Re: module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 09:16
von snafu
Du kannst den Modulnamen als String übergeben und dann mittels `__import__(modulname)` importieren.
Re: module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 09:23
von schneitzmaster
danke für die schnelle antwort.
Gibt es auch einen Weg die "as" funktionalität zu benutzen?
geht leider nicht.
ich will dann später in meiner funktion ja über "my_mod.do_something()" darauf zugreifen.
Re: module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 09:38
von sparrow
Bist du dir sicher, dass du das möchtest? Die Situationen, die ich mir vorstellen kann, in denen das nötig ist, sind doch recht überschaubar.
Denn wenn du auf etwas dynamisches mit definierten Schnittstellen zugreifen willst, klingt das eher nach etwas, wo ich Klassen verwenden würde.
Re: module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 09:52
von schneitzmaster
mhh vielleicht könnte man das auch mittels klassen lösen.
ich habe aber schon ziemlich viel code geschrieben und möchte jetzt nicht wieder alles ändern.
Die situation ist die folgende. ich habe ein allgemeines module geschrieben mit dem gewisse operationen durchgeführt werden.
Beim ausführen muss das modul dann aber mit konkreten informationen (geometrischen Formen) gefüttert werden.
Die einzelnen Operationen für die konkreten Geometrien unterscheiden sich natürlich. Diese unterscheidung wollte ich eben mit den entsprechend übergebenen modulen realisieren.
das schreit für einen informatiker sicherlich nach klassen. ich werde aus prakmatsichen gründen aber deine vorgeschlagene variante verwenden zumal ich momentan keine nachteile (ausser ästhetische) erkennen kann.
Re: module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 11:20
von Hyperion
schneitzmaster hat geschrieben:
Beim ausführen muss das modul dann aber mit konkreten informationen (geometrischen Formen) gefüttert werden.
Das alleine klingt schon ziemlich komisch... man "füttert" normaler Weise keine Module, sondern Funktion (Methoden, allg. Callables).
Re: module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 11:37
von schneitzmaster
ja ich meinte die funktionen des moduls müssen mit konkreten argumenten aufgerufen werden.
Re: module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 11:44
von Hyperion
schneitzmaster hat geschrieben:ja ich meinte die funktionen des moduls müssen mit konkreten argumenten aufgerufen werden.
Und wieso tust Du das dann nicht einfach?
Mir ist das strukturelle Problem einfach noch unklar, welches Du durch "individuelle" Imports lösen willst... und ich habe einfach den Verdacht, dass das total umständlich ist!
Re: module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 11:58
von schneitzmaster
okay dann probiere ich es noch mal am konkreten beispiel zu erklären.
Ich habe ein modul A das funktionen beinhaltet um ellipsoide zu vernetzen.
dann habe ich ein modul B das diese vernetzten ellipsoide zu einem komplexen netz hinzufügt in dem es funktionen aus modul A aufruft.
Weiterhin liegt eine "Treiber"-routine vor, die funktionen aus modul B aufruft um schließlich das komplexe netzt zu erzeugen.
Diese "Treiber"-routine möchte ich händisch anpassen können um z.B. nicht ellipsoide sondern evtl. zylinder (beschrieben im modul C) o.ä. zu vernetzten.
Diese anpassung wollte ich mittels dem wechsel der übergabe von modul A in modul C realisieren.
Ist das jetzt klarer?
Re: module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 13:14
von Sirius3
@schneitzmaster: solche Wechsel macht man üblicherweise auf der Ebene von Klassen. Also eine Ellipsoid-Netz-Klasse und eine Zylinder-Netz-Klasse. Natürlich kann man auch ganze Module übergeben, da Module in Python auch nur Objekte sind, ist das problemlos möglich, dann wird aber das Modul nicht in der Unterfunktion importiert, sondern ganz normal auf der übergeordneten Ebene im Hauptprogramm.
Re: module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 13:31
von schneitzmaster
@Sirius3: Okay danke für den hinweis. Wie sieht das konkret im code aus? Wie kann ich ein modul im Hauptprogramm übergeben und meine Unterfunktion aus einem anderen Modul weiß davon? Ist der Vorschlag von sparrow solche Variante?
Re: module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 14:19
von BlackJack
@schneitzmaster: Konkret sieht das so aus dass Du das Modul ganz normal importierst und dann das Modul-Objekt übergibst, statt den Namen.
Und irgendwo anders dann:
Code: Alles auswählen
import ellipsoid_library
import cylinder_library
from spam import test
# ...
test(ellipsoid_library)
# oder
test(cylinder_library)
Re: module als funktions argument übergeben
Verfasst: Mittwoch 18. Februar 2015, 14:58
von schneitzmaster
@BlackJack: Super. So sieht das sauberer aus als die "__import__(modulename)"-variante. Vielen Dank!