Ist es möglich, die Standardparameter einer Funktion in Python zu ändern?

In Python ist es möglich, die Standardparameter einer Funktion zur Laufzeit neu zu definieren?

Ich habe hier eine Funktion mit 3 Parametern definiert:

def multiplyNumbers(x,y,z): return x*y*z print(multiplyNumbers(x=2,y=3,z=3)) 

Als nächstes habe ich versucht (erfolglos), den Standardparameterwert für y einzustellen, und dann habe ich versucht, die Funktion ohne den Parameter y aufzurufen:

 multiplyNumbers.y = 2; print(multiplyNumbers(x=3, z=3)) 

Aber der folgende Fehler wurde erzeugt, da der Standardwert von y nicht korrekt gesetzt wurde:

 TypeError: multiplyNumbers() missing 1 required positional argument: 'y' 

Ist es möglich, die Standardparameter einer Funktion zur Laufzeit neu zu definieren, wie ich hier versuche?

  • Verständnis von Pythons Call-by-Objekt-Stil der Übergabe von Funktionsargumenten
  • Python: lokale Variable referenziert vor Zuweisungsfehler
  • Python konvertieren dezimal zu hex
  • Rückkehr Funktionsname in Python?
  • Übergeben von Werten an eine Funktion aus einer Funktion in Python
  • Was ist der Zweck der bloßen Asterix in Funktionsargumenten?
  • Kann nicht funktionieren
  • Anfängerfrage: Rückgabe eines booleschen Wertes aus einer Funktion in Python
  • 3 Solutions collect form web for “Ist es möglich, die Standardparameter einer Funktion in Python zu ändern?”

    Verwenden Sie einfach functools.partial

      multiplyNumbers = functools.partial(multiplyNumbers, y = 42) 

    Ein Problem hier: Du wirst es nicht als MultipleNummer nennen können multiplyNumbers(5, 7, 9); Du solltest manuell sagen y=7

    Wenn Sie Standard-Argumente entfernen müssen, sehe ich zwei Möglichkeiten:

    1. Speichern Sie die ursprüngliche Funktion irgendwo

       oldF = f f = functools.partial(f, y = 42) //work with changed f f = oldF //restore 
    2. Verwenden partial.func

       f = f.func //go to previous version. 

    Technisch ist es möglich zu tun, was Sie fragen … aber es ist keine gute Idee. Die Antwort von RiaD ist die Pythonische Möglichkeit, dies zu tun.

    In Python 3:

     >>> def f(x=1, y=2, z=3): ... print(x, y, z) >>> f() 1 2 3 >>> f.__defaults__ = (4, 5, 6) 4 5 6 

    Wie bei allem, was unter den Decken liegt und schwer in den docs zu finden ist, ist das inspect Diagramm der beste Ort, um nach Funktionsattributen zu suchen.

    Die Details sind in Python 2 etwas anders, aber die Idee ist die gleiche. (Ändern Sie einfach den Pulldown oben links von der docs Seite von 3.3 auf 2.7.)


    Wenn Sie sich fragen, wie Python weiß, welche Ausfälle mit welchen Argumenten gehen, wenn es gerade ein Tupel ist … es zählt nur rückwärts vom Ende (oder das erste von * , *args , **kwargs alles, was danach in die __kwdefaults__ dict geht stattdessen). f.__defaults = (4, 5) setzt die Vorgaben auf y und z auf 4 und 5 und mit Voreinstellung für x . Das funktioniert, weil man nach vorgegebenen Parametern keine nicht ausgefallenen Parameter haben kann.


    Es gibt einige Fälle, in denen dies nicht funktionieren wird, aber selbst dann kannst du es unveränderlich in eine neue Funktion mit verschiedenen Vorgaben kopieren:

     >>> f2 = types.FunctionType(f.__code__, f.__globals__, f.__name__, ... (4, 5, 6), f.__closure__) 

    Hier, die types Modul Dokumentation nicht wirklich etwas erklären, aber help(types.FunctionType) in der interaktiven Dolmetscher zeigt die Params, die Sie benötigen.


    Der einzige Fall, den Sie nicht verarbeiten können, ist eine eingebaute Funktion. Aber sie haben in der Regel keine wirklichen Vorgaben. Stattdessen fälschen sie etwas Ähnliches in der C-API.

    Verwenden Sie func_defaults wie in

     def myfun(a=3): return a myfun.func_defaults = (4,) b = myfun() assert b == 4 

    Überprüfen Sie hier die docs für func_defaults

    UPDATE: Blick auf Riads Antwort Ich glaube, ich war zu wörtlich mit mir. Ich weiß nicht, den Kontext, von wo aus Sie diese Frage stellen, aber im Allgemeinen (und nach dem Zen von Python ) Ich glaube, dass die Arbeit mit Teilanwendungen ist eine bessere Option als die Definition der Standard-Standard-Argumente der Funktion

    Python ist die beste Programmiersprache der Welt.