Seite 1 von 1
Funktionsnamen aus Variablen zusammensetzen
Verfasst: Freitag 31. August 2018, 14:02
von Trial&Error
Hallo in die Runde,
ich bin mir sicher, dass sich das Problem mit dem richtigen Suchbegriff schnell lösen ließe aber ich komme einfach nicht darauf
Folgendes Problem:
Ich suche eine Möglichkeit die Namen von Funktionen dynamisch aus Variablen zu generieren.
Da ich die benötigten Informationen für jedes "Paket" aus verschienenen Quellen zusammenkratzen muss, habe ich mich dafür entschieden die einzelnen "Pakete" in Module (heißt das so?) auszugliedern. Wenn ich diese direkt anspreche (z.B.: rocketchat.getOPSI_PackageName()) funktioniert das auch. Aber bei später über 100 Modulen würde das in einem Spagetticode enden. Die Schleife war easy aber wie setze ich jetzt die Funktionsaufrufe aus den Variablen zusammen?
Irgend wo habe ich glesen, dass das mit "globals()" gehen soll. Das Endet bei mir aber einem "KeyError: rocketchat.getOPSI_PackageName()":
Code: Alles auswählen
import driver.rocketchat as rocketchat
import driver.powerfolder as powerfolder
…
pakete = {'rocketchat', 'powerfolder', 'openboard', '…'}
for paket in pakete:
# Paketname ermitteln
tmp = globals()[paket + '.getOPSI_PackageName']
tmp()
…
Ach so, ich scripte jetzt erst wieder seit 2 Tagen mit Python. Wenn jemand nen Tipp für ne einfachere Lösung als meine hat, bin ich auch nicht abgeneigt.
Ich freue mich auf eure Antworten.
MfG
Trial&Error
Re: Funktionsnamen aus Variablen zusammensetzen
Verfasst: Freitag 31. August 2018, 14:08
von snafu
Denke dass hier
__import__ am sinnigsten ist. So kommt man z.B. an
os.chdir:
Code: Alles auswählen
module = __import__('os')
function = getattr(module, 'chdir')
Bleibt aber die Frage, ob das wirklich nötig ist. Die Namen von Paketen und Funktionen musst du doch trotzdem irgendwo hinschreiben. Warum dann nicht gleich "normal" importieren? Wo siehst du den Vorteil?
Re: Funktionsnamen aus Variablen zusammensetzen
Verfasst: Freitag 31. August 2018, 14:25
von Trial&Error
Ich bin mir gerade nicht sicher, ob ich das richtig verstehe, aber den import der Module habe ich eignetlich noch gar nicht in eine Schleife gebaut. Gegenwärtig importiere ich die einfach der Reihe nach:
Code: Alles auswählen
import driver.rocketchat as rocketchat
import driver.powerfolder as powerfolder
…
Mir geht es um den eigentlichen Funktionsaufruf innerhalb des main scriptes:
Code: Alles auswählen
rocketchat.getOPSI_PackageName()
powerfolder.getOPSI_PackageName()
openboard.getOPSI_PackageName()
putty.getOPSI_PackageName()
…
ich würde gerne folgendes in eine Schleife bauen:
Code: Alles auswählen
pakete = {'rocketchat', 'powerfolder', 'openboard', '…'}
for <Variable> in pakete:
<Variable>.getOPSI_PackageName()
Ich habe bisher nicht herausgefunden, wie ich "
<Variable>.getOPSI_PackageName()" in Python umsetzen kann.
Re: Funktionsnamen aus Variablen zusammensetzen
Verfasst: Freitag 31. August 2018, 15:00
von Trial&Error
ok, ich habe jetzt herausgefunden, wie ich es als String zusammensetzen lassen kann.
Das Ergebnis passt: "rocketchat.getOPSI_PackageName"
Allerdings kann man Strings anscheinend nicht als Funktion ausführen
Ergebnis:
Code: Alles auswählen
Traceback (most recent call last):
File "./main.py", line 25, in <module>
print(tmp())
TypeError: 'str' object is not callable
Re: Funktionsnamen aus Variablen zusammensetzen
Verfasst: Freitag 31. August 2018, 17:03
von snafu
Dann eben so:
Code: Alles auswählen
modules = [rocketchat, powerfolder, openboard, putty]
for module in modules:
pkg_name = getattr(module, 'getOPSI_PackageName')()
print('Package name:', pkg_name)
Dein Ansatz, dass Strings magisch zum passenden Objekt werden, wenn man versucht sie aufzurufen, geht leider nicht auf.

Re: Funktionsnamen aus Variablen zusammensetzen
Verfasst: Freitag 31. August 2018, 17:46
von pillmuncher
Und das hier geht nicht?
Code: Alles auswählen
modules = [rocketchat, powerfolder, openboard, putty]
for module in modules:
pkg_name = module.getOPSI_PackageName()
print('Package name:', pkg_name)
Re: Funktionsnamen aus Variablen zusammensetzen
Verfasst: Freitag 31. August 2018, 19:14
von Trial&Error
Danke für die Antworten! Beides funktioniert.
Wenn ich das jetzt richtig verstehe, war mein Fehler die Bezeichner "rocketchat", ... in Häkchen zu setzen? Damit habe ich sie für Python als String gekennzeichnet? richtig?
Da ich gerade nicht wirklich verstehe, was dieses "getattr()()" tut, habe ich mich jetzt für den zweiten Vorschlag entschieden.
Re: Funktionsnamen aus Variablen zusammensetzen
Verfasst: Samstag 1. September 2018, 16:28
von snafu
pillmuncher hat geschrieben: Freitag 31. August 2018, 17:46
Und das hier geht nicht?
Code: Alles auswählen
modules = [rocketchat, powerfolder, openboard, putty]
for module in modules:
pkg_name = module.getOPSI_PackageName()
print('Package name:', pkg_name)
Nicht wenn man ein Brett vorm Kopf hatte. Dieser Ansatz ist natürlich zu bevorzugen.
Re: Funktionsnamen aus Variablen zusammensetzen
Verfasst: Samstag 1. September 2018, 16:31
von snafu
Trial&Error hat geschrieben: Freitag 31. August 2018, 19:14
Da ich gerade nicht wirklich verstehe, was dieses "getattr()()" tut, habe ich mich jetzt für den zweiten Vorschlag entschieden.
Ein
getattr(obj, name) macht das selbe wie ein
obj.name und wird verwendet, wenn
name erst zur Laufzeit bekannt ist. In diesem Fall ist es aber unnötig. Es ist sinnvoller, an der zweiten Lösung festzuhalten, so wie du es ja auch getan hast.