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 defined

    Kann 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 🙂


Anmelden zum Antworten