Funktionsargumente zaehlen

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
Pytoniac
User
Beiträge: 7
Registriert: Montag 13. August 2012, 09:53

Hallo,

ist es moeglich innerhalb einer Funktion herauszufinden, wieviele Argumente uebergeben wurden?

Gruesse
Pytoniac
Benutzeravatar
sparrow
User
Beiträge: 4530
Registriert: Freitag 17. April 2009, 10:28

Meinst du so?

Code: Alles auswählen

>>> def test(*para):
	print type(para)
	print len(para)
	print para

	
>>> test(1, 2, "hallo")
<type 'tuple'>
3
(1, 2, 'hallo')
Pytoniac
User
Beiträge: 7
Registriert: Montag 13. August 2012, 09:53

Genau, allerdings mit einer Funktion, welche so aussieht:

Code: Alles auswählen

def test(arg1, arg2, arg3):
Was bewirkt denn dieser Stern am Anfang der Variable, in der Funktion?
Benutzeravatar
snafu
User
Beiträge: 6853
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

>>> def test(arg1, arg2, arg3):
...     return "foo"
... 
>>> test.func_code.co_argcount
3
Das ist aber meistens nichts, was man wirklich will. Zudem bin ich nicht sicher, wie portabel diese Herangehensweise ist.

Alternativ ginge noch:

Code: Alles auswählen

>>> import inspect
>>> inspect.getargspec(test)
ArgSpec(args=['arg1', 'arg2', 'arg3'], varargs=None, keywords=None, defaults=None)
>>> len(inspect.getargspec(test).args)
3
In welchem Zusammenhang brauchst du das denn?
Benutzeravatar
sparrow
User
Beiträge: 4530
Registriert: Freitag 17. April 2009, 10:28

@snafu das zählt aber die Parameter, die die Funktion erwartet, nicht die übergebenen, oder? Deshalb dachte ich eigentlich, dass Pytoniac die dynamischen Parameter meint.
Benutzeravatar
snafu
User
Beiträge: 6853
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

sparrow hat geschrieben:@snafu das zählt aber die Parameter, die die Funktion erwartet, nicht die übergebenen, oder? Deshalb dachte ich eigentlich, dass Pytoniac die dynamischen Parameter meint.
Dem zweiten Beitrag des OP hatte ich entnommen, dass er anscheinend nicht die übergebene Anzahl meint, sondern die Anzahl an Argumenten in der Funktionssignatur. Aber ehrlich gesagt hatte ich danach gar nicht mehr auf den Threadtitel geachtet... :oops:
Benutzeravatar
sparrow
User
Beiträge: 4530
Registriert: Freitag 17. April 2009, 10:28

@Pytoniac: das * heißt, dass eine dynamische Anzal von Parametern übergeben werden kann. Für mich ist das der einzige sinnvolle Grund die Parameter zu zählen. Wenn die Anzahl eh fest definiert ist, macht es ja keinen Sinn in der Funktion zu schauen wieviele es sind. Es sind nämlich immer alle.

Ansonst: zeig was du machen willst und wofür du das brauchst. Klingt nämlich sehr seltsam.
Benutzeravatar
snafu
User
Beiträge: 6853
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dann vielleicht nochmal direkt auf den Beitrag antwortend:
Pytoniac hat geschrieben:allerdings mit einer Funktion, welche so aussieht:

Code: Alles auswählen

def test(arg1, arg2, arg3):
Was bewirkt denn dieser Stern am Anfang der Variable, in der Funktion?
Ein Funktionskopf, wie du ihn gezeigt hast, kann definitiv nur exakt 3 Argumente annehmen. Was willst du da noch zählen? Eine variable Anzahl von Argumenten ist nur mit den gezeigten Stern davor möglich.

Oder willst du *vor* dem Funktionsaufruf wissen, was der Aufrufer vorhat? Weil der Funktionsaufruf an sich findet wie gesagt nur statt, wenn die Anzahl an Argumenten der Funktionssignatur entspricht. Andernfalls wird die Funktion gar nicht erst betreten.
Pytoniac
User
Beiträge: 7
Registriert: Montag 13. August 2012, 09:53

Ich wusste vorher nicht, dass es "*args" gibt. Genau das habe ich gesucht... Danke!
BlackJack

@Pytoniac: Damit sollte man IMHO übrigens sparsam umgehen und es zum Beispiel nicht verwenden wenn man statt dessen auch tatsächlich eine Liste übergeben könnte.
Antworten