Parameter für Funktion, Methode, Klasse ermitteln?
Gibt es irgendeine möglichkeit ohne in der Doku oder einem DocString nachzuschauen, die notwendigen Parameter zum aufruf oder Instanzieren einer Funktion/Methode oder Klasse zu ermitteln?
Das kommt dann ja effektiv dem nachschauen in der Dokumentation gleich.
Was ich konkret will ist eine variable Zahl unter4schiedlicher Klassen instanzieren ohne speziell fuer jeden einzelnen Typ eine verzweigung einzubauen. Die Notwendigen Variablen dafuer sind auch jeweils vorhanden, nur den Aufruf selber muss ich zusammenbasteln. Und dafuer will ich nun automatisiert die notwendigen Parameter ermitteln.
Was ich konkret will ist eine variable Zahl unter4schiedlicher Klassen instanzieren ohne speziell fuer jeden einzelnen Typ eine verzweigung einzubauen. Die Notwendigen Variablen dafuer sind auch jeweils vorhanden, nur den Aufruf selber muss ich zusammenbasteln. Und dafuer will ich nun automatisiert die notwendigen Parameter ermitteln.
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
äh, hmm wie bitte?
Wenn du eine Funktion/Methode mit variabler Anzahl an Parametern willst verwende doch *args bzw. **kw.
Gruß
Dookie
Wenn du eine Funktion/Methode mit variabler Anzahl an Parametern willst verwende doch *args bzw. **kw.
Code: Alles auswählen
def Demo(*args):
for arg in args:
print arg
Demo(1)
Demo(1,2,3)
Demo("Hallo", "Welt")
Dookie
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Code: Alles auswählen
def Demo(**kw):
for key, value in kw.iteritems():
print "Parameter %s hat den Wert %s" % (key, str(value))
Demo(anrede = "Hallo", name = "Gast")
Gruß
Dookie
Nun, genau das was ich schrieb.
Ich hab eine unbestimmte Zahl variablen wovon eine den Namen definiert. Damit wird eine Klasse Importiert die dann Instanziert werden soll. Die Parameter fuer die Klasse existieren jeweils im Speicher weil sie vorher von einem anderen Skript ausgelesen wurden. Unbekannt ist aber eben welche Parameter konkret an welche Stelle des Aufrufs der Klasse benoetigt werden.
Um das zu erreichen will ich eben ganz einfach eine Methode wissen mit der man ohne grossen aufwand ermitteln kann welche Variablen zum Aufruf der Klasse benotigt werden, wobei die Name im Speicher mit den Parameter fuer die Klasse identisch sind.
Die alternative waer halt ein grösserer umbau und eventuelle Verlagerung von Logik in die Klasse selbst, was ich nun wirklich nicht will.
Ich hab eine unbestimmte Zahl variablen wovon eine den Namen definiert. Damit wird eine Klasse Importiert die dann Instanziert werden soll. Die Parameter fuer die Klasse existieren jeweils im Speicher weil sie vorher von einem anderen Skript ausgelesen wurden. Unbekannt ist aber eben welche Parameter konkret an welche Stelle des Aufrufs der Klasse benoetigt werden.
Um das zu erreichen will ich eben ganz einfach eine Methode wissen mit der man ohne grossen aufwand ermitteln kann welche Variablen zum Aufruf der Klasse benotigt werden, wobei die Name im Speicher mit den Parameter fuer die Klasse identisch sind.
Die alternative waer halt ein grösserer umbau und eventuelle Verlagerung von Logik in die Klasse selbst, was ich nun wirklich nicht will.
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi nochmal,
Ein bisschen Code wär auch nicht schlecht. Dann würde man sehen, ob eventuell schon ein gravierender Entwurfsfehler darin steckt.
Gruß
Dookie
Hast Du mal selber durchgelesen was du geschreiben hast?Anonymous hat geschrieben:Nun, genau das was ich schrieb.
Was für einen Namen bzw. den Namen von was?Ich hab eine unbestimmte Zahl variablen wovon eine den Namen definiert.
Endlich mal ein Satz, den ich versteheDamit wird eine Klasse Importiert die dann Instanziert werden soll.
TjaDie Parameter fuer die Klasse existieren jeweils im Speicher weil sie vorher von einem anderen Skript ausgelesen wurden.
Meinst Du mit Aufruf der Klasse das Instanziieren der Klasse?Unbekannt ist aber eben welche Parameter konkret an welche Stelle des Aufrufs der Klasse benoetigt werden.
Hmm ich wüsste nichtmal, wie das mit grossem Aufwand zu machen ist.Um das zu erreichen will ich eben ganz einfach eine Methode wissen mit der man ohne grossen aufwand ermitteln kann welche Variablen zum Aufruf der Klasse benotigt werden, wobei die Name im Speicher mit den Parameter fuer die Klasse identisch sind.
Ein bisschen Code wär auch nicht schlecht. Dann würde man sehen, ob eventuell schon ein gravierender Entwurfsfehler darin steckt.
Sorry, aber für den Moment muss ich da kapitulieren.Die alternative waer halt ein grösserer umbau und eventuelle Verlagerung von Logik in die Klasse selbst, was ich nun wirklich nicht will.
Gruß
Dookie
Ich muß gestehen den Gast auch nicht so recht zu verstehen...
Aber wenn es so ist wie ich es verstanden hab, dann werden jeweils in der __init__-Methode Übergabeparameter erwartet deren Name er benötigt...
Evt. könnte man mit help() sowas auslesen. help() schreibt aber in stdout. Folgendes Konstrukt könnte helfen:
Als Beispiel eine Klasse T mit __init__( self, a, b, c ):
liefert nun
Hilft das irgendwie?
Aber wenn es so ist wie ich es verstanden hab, dann werden jeweils in der __init__-Methode Übergabeparameter erwartet deren Name er benötigt...
Evt. könnte man mit help() sowas auslesen. help() schreibt aber in stdout. Folgendes Konstrukt könnte helfen:
Code: Alles auswählen
def GetInitVarNames( object ):
old_stdout = sys.stdout
buffer = StringIO.StringIO()
sys.stdout = buffer
help( object.__init__ )
sys.stdout = old_stdout
raw_vars = buffer.getvalue()
begin = string.find( raw_vars, "(" )
end = string.find( raw_vars, ")" )
vars = string.split( raw_vars[begin:end], "," )
del vars[0]
vars = [string.strip(v) for v in vars]
return vars
Code: Alles auswählen
class T:
def __init__( self, a, b,c ):
pass
Code: Alles auswählen
GetInitVarNames( T )
Code: Alles auswählen
['a', 'b', 'c']
Hi. Ein kleiner Verbesserungsvorschlag:
Stringmethoden sind einfach viel schneller als die Funktionen aus string, zudem sind sie veraltet.
Trotzdem bin ich auch der Meinung, dass hier irgendwie ein Designfehler vorliegt. Etwas Beispielcode wäre nicht schlecht, dann könnte man nämlich sagen, wo bessere Alternativen sind.
Code: Alles auswählen
def GetInitVarNames( object ):
old_stdout = sys.stdout
buffer = StringIO.StringIO()
sys.stdout = buffer
help( object.__init__ )
sys.stdout = old_stdout
vars = buffer.getvalue()
begin = vars.find( "(" ) + 1
end = vars.find( ")" )
vars = vars[begin:end].split( "," )
del vars[0]
vars = [v.strip() for v in vars]
return vars
Trotzdem bin ich auch der Meinung, dass hier irgendwie ein Designfehler vorliegt. Etwas Beispielcode wäre nicht schlecht, dann könnte man nämlich sagen, wo bessere Alternativen sind.
Jep, dankeChristopy hat geschrieben:Aber wenn es so ist wie ich es verstanden hab, dann werden jeweils in der __init__-Methode Übergabeparameter erwartet deren Name er benötigt...
Evt. könnte man mit help() sowas auslesen. help() schreibt aber in stdout. Folgendes Konstrukt könnte helfen:
Hilft das irgendwie?
Das ist genau das was ich suchte. Ich hab zwar auch schon mit help() Experimentiert gehabt, aber darauf die Ausgabe vorher umzulenken bin ich nicht gekommen :/
@Milan
Was den Design-Fehler anbelangt... Es handelt sich bei meinem Programm um eine Dynamische GUI, die einzelnen Elemente sind jeweils in Klassen gepackt und werden durch ein simples Ini-File konfiguriert (später mal direkt durch einen Einstellungs-Dialog). Sinn der ganzen Konstruktion hier ist es dem User die moeglichkeit zu geben einzelne Elemente dem Programm hinzufügen zu koennen ohne am Programm-Code selber etwas aendern zu muessen. Wenn du eine Idee hat wie man es besser realisiert ohne das Programm unnoetig zu verkomplizieren...
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Ist zwar schon ein bisschen her, aber ich bin gerade über die Lösung gestolpert: Modul inspect
Gruß
Dookie
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]