Beliebige Ausdrücke in optionalen Parametern möglich?
-
Hi,
ist es irgendwie möglich in Python-Funktionen den Wert eines optionalen Arguments zu berechnen?
In Lisp geht das so:(defun testFunc (p1 &optional (p2 (concatenate 'string p1 "test"))) (format t "~a ~a" p1 p2))
In Python wäre das:
def testFunc(p1, p2 = p1 + "test"): print(p1 p2)
Nur leider bekomme ich einen Fehler, wenn ich das so schreiben will:
> def testFunc(p1, p2 = p1 + "test"):
... print(p1, p2)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'p1' is not definedKann mir gar nicht vorstellen, dass das nicht geht. Könnt ihr mir da weiterhelfen?
Ich benutze übrigens Python 3.1.1.
-
Afaik geht das nur so:
def testFunc(p1, p2 = None): if p2 is None: p2 = p1 + "test" print(p1 p2)
-
print(p1 p2)
habe ich beim Kopieren übersehen, muss natürlich z.B.
print(p1, p2)
heißen.
-
python-möger schrieb:
Afaik geht das nur so:
def testFunc(p1, p2 = None): if p2 is None: p2 = p1 + "test" print(p1 p2)
So ähnlich sieht mein bisheriger Workaround auch aus:
def testFunc(p1, p2 = None): p2 = p1 + tmp if p2 == None else p2 print(p1, p2)
Ist natürlich nicht viel umständlicher, wollte nur sicher gehen, dass ich nichts übersehen habe. Danke
-
Python-Lerner schrieb:
python-möger schrieb:
Afaik geht das nur so:
def testFunc(p1, p2 = None): if p2 is None: p2 = p1 + "test" print(p1 p2)
So ähnlich sieht mein bisheriger Workaround auch aus:
def testFunc(p1, p2 = None): p2 = p1 + tmp if p2 == None else p2 print(p1, p2)
Ist natürlich nicht viel umständlicher, wollte nur sicher gehen, dass ich nichts übersehen habe. Danke
Da hat sich der Fehlerteufel eingeschlichen, richtig ist:
def testFunc(p1, p2 = None): p2 = p1 + "test" if p2 == None else p2 print(p1, p2)
-
Wenn du das oft brauchst kannst du dir dafür einen decorator schreiben.
def addTest(fn): def new(*args): if len(args) == 1: args = (args[0], args[0] + "test") return fn(*args) return new @addTest def testFunc(p1, p2): print p1, p2 testFunc("xxx") testFunc("xxx", "yyy")
olaf@pc /tmp> python test.py
xxx xxxtest
xxx yyy
-
Cool danke, das ist ja so ähnlich wie ein Lisp-Macro