Wenn du die "Stern-Variante" vermeiden willst, könntest du das Problem einigermaßen mit einer Hilfsfunktion umgehen:
Code: Alles auswählen
In [1]: def args2list(args):
...: try:
...: if not isinstance(args, basestring):
...: return list(args)
...: except TypeError:
...: pass
...: return [args]
...:
In [2]: args2list(23)
Out[2]: [23]
In [3]: args2list('bla')
Out[3]: ['bla']
In [4]: args2list(['bla', 'blupp'])
Out[4]: ['bla', 'blupp']
In [5]: args2list(xrange(3))
Out[5]: [0, 1, 2]
In [6]: def test(args):
...: for arg in args2list(args):
...: print arg
[...]
Hierbei wird alles außer Zeichenketten durch den `list()`-Konstruktor gejagt. Iterierbare Objekte gehen durch die Umwandlung und werden zurückgegeben. Falls die Umwandlung fehlt schlägt (z.B. bei Zahlen) oder wenn es sich um eine Zeichenkette handelt, wird eine einelementrige Liste mit dem `arg` zurückgegeben. Dies führt dazu, dass man später grundsätzlich über den Rückgabewert iterieren kann, also in etwa das hat, was beim Stern rausgekommen wäre. Der Vorteil: Wenn man als Benutzer nur ein Argument mitgeben will, muss man keine Liste erstellen, da dies später implizit von der Funktion gemacht wird.
Xynon1 hat geschrieben:Kann man bei "unveränderbaren" *args zB in einem Konstrucktor dann ohne Bedenken eingesetzt werden ?
Denn wenn ich mir mal einige Python-Module aus der Standardlib ansehe, sind nutzen eigentlich nicht allzu wenige diese Möglichkeiten, aber werde sie demnächst nach möglichkeit vermeiden.
Diese Bedenken sind ja eher theoretischer Natur. Es könnte halt als sauberer angesehen werden, weil `*` und `**` bei der Verwendung weiterer Argumente in der Signatur blöde Nebeneffekte haben. Wenn du einfach nur einen Wrapper machst, der die Argumente quasi ungesehen weitergibt, dann finde ich Sterne nicht so tragisch.