module als funktions argument übergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
schneitzmaster
User
Beiträge: 94
Registriert: Freitag 26. Oktober 2012, 15:35
Wohnort: Hamburg

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
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du kannst den Modulnamen als String übergeben und dann mittels `__import__(modulname)` importieren.
schneitzmaster
User
Beiträge: 94
Registriert: Freitag 26. Oktober 2012, 15:35
Wohnort: Hamburg

danke für die schnelle antwort.
Gibt es auch einen Weg die "as" funktionalität zu benutzen?

Code: Alles auswählen

 __import__(modulname) as my_mod
geht leider nicht.

ich will dann später in meiner funktion ja über "my_mod.do_something()" darauf zugreifen.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

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.

Code: Alles auswählen

my_mod = __import__(modulname)
Denn wenn du auf etwas dynamisches mit definierten Schnittstellen zugreifen willst, klingt das eher nach etwas, wo ich Klassen verwenden würde.
schneitzmaster
User
Beiträge: 94
Registriert: Freitag 26. Oktober 2012, 15:35
Wohnort: Hamburg

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
schneitzmaster
User
Beiträge: 94
Registriert: Freitag 26. Oktober 2012, 15:35
Wohnort: Hamburg

ja ich meinte die funktionen des moduls müssen mit konkreten argumenten aufgerufen werden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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? :P

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!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
schneitzmaster
User
Beiträge: 94
Registriert: Freitag 26. Oktober 2012, 15:35
Wohnort: Hamburg

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?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
schneitzmaster
User
Beiträge: 94
Registriert: Freitag 26. Oktober 2012, 15:35
Wohnort: Hamburg

@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?
BlackJack

@schneitzmaster: Konkret sieht das so aus dass Du das Modul ganz normal importierst und dann das Modul-Objekt übergibst, statt den Namen.

Code: Alles auswählen

def test(library):
    library.do_something()
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)
schneitzmaster
User
Beiträge: 94
Registriert: Freitag 26. Oktober 2012, 15:35
Wohnort: Hamburg

@BlackJack: Super. So sieht das sauberer aus als die "__import__(modulename)"-variante. Vielen Dank!
Antworten