Parameter für Funktion, Methode, Klasse ermitteln?

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.
Gast

Parameter für Funktion, Methode, Klasse ermitteln?

Beitragvon Gast » Sonntag 11. Juli 2004, 20:37

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?
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 11. Juli 2004, 20:49

Hi Gast,

Du kannst dir die Pythonsourcen runterladen und in diesen nachschauen.
Ich verwende meist pydoc


Gruß

Dookie
Gast

Beitragvon Gast » Sonntag 11. Juli 2004, 20:53

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.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 11. Juli 2004, 21:13

äh, hmm wie bitte?

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")


Gruß

Dookie
Gast

Beitragvon Gast » Sonntag 11. Juli 2004, 21:56

Damit erhalte ich aber weder namen noch Position der Variablen.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 11. Juli 2004, 22:33

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")


Wenn ich wüsste was Du wirklich machen willst, könnte ich dir sicher besser helfen.


Gruß

Dookie
Gast

Beitragvon Gast » Sonntag 11. Juli 2004, 23:21

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.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 12. Juli 2004, 00:52

Hi nochmal,
Anonymous hat geschrieben:Nun, genau das was ich schrieb.

Hast Du mal selber durchgelesen was du geschreiben hast?
Ich hab eine unbestimmte Zahl variablen wovon eine den Namen definiert.

Was für einen Namen bzw. den Namen von was?
Damit wird eine Klasse Importiert die dann Instanziert werden soll.

Endlich mal ein Satz, den ich verstehe ;)
Die Parameter fuer die Klasse existieren jeweils im Speicher weil sie vorher von einem anderen Skript ausgelesen wurden.

Tja ;)
Unbekannt ist aber eben welche Parameter konkret an welche Stelle des Aufrufs der Klasse benoetigt werden.

Meinst Du mit Aufruf der Klasse das Instanziieren der Klasse?
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.

Hmm ich wüsste nichtmal, wie das mit grossem Aufwand zu machen ist.
Ein bisschen Code wär auch nicht schlecht. Dann würde man sehen, ob eventuell schon ein gravierender Entwurfsfehler darin steckt.
Die alternative waer halt ein grösserer umbau und eventuelle Verlagerung von Logik in die Klasse selbst, was ich nun wirklich nicht will.

Sorry, aber für den Moment muss ich da kapitulieren.


Gruß

Dookie
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Beitragvon Christopy » Montag 12. Juli 2004, 01:03

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:

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


Als Beispiel eine Klasse T mit __init__( self, a, b, c ):

Code: Alles auswählen

class T:
    def __init__( self, a, b,c ):
        pass


Code: Alles auswählen

GetInitVarNames( T )

liefert nun

Code: Alles auswählen

['a', 'b', 'c']


Hilft das irgendwie?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Montag 12. Juli 2004, 08:00

Hi. Ein kleiner Verbesserungsvorschlag:

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

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.
Gast

Beitragvon Gast » Montag 12. Juli 2004, 11:38

Christopy 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?


Jep, danke :)
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...
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 1. August 2004, 20:26

Ist zwar schon ein bisschen her, aber ich bin gerade über die Lösung gestolpert: Modul inspect


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Beitragvon genrich » Sonntag 1. August 2004, 22:21

Ich glaube ich habe das Problem noch nicht richtig verstanden, aber will mal mitreden:
Wäre es nicht eine Möglichkeit mit einem Dict zu arbeiten???

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]