Wie erstelle ich eine Python-Funktion mit optionalen Argumenten?

218

Ich habe eine Python-Funktion, die mehrere Argumente akzeptiert. Einige dieser Argumente könnten in einigen Szenarien weggelassen werden.

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
    #code

Die Argumente ddurch hsind Strings , die jeweils unterschiedliche Bedeutungen haben. Es ist wichtig, dass ich auswählen kann, welche optionalen Parameter in einer beliebigen Kombination übergeben werden sollen. Zum Beispiel, (a, b, C, d, e)oder (a, b, C, g, h), oder (a, b, C, d, e, foder alle (dies sind meine Entscheidungen).

Es wäre großartig, wenn ich die Funktion überladen könnte - aber ich habe gelesen, dass Python das Überladen nicht unterstützt. Ich habe versucht, einige der erforderlichen int-Argumente in die Liste einzufügen - und habe einen Fehler bei der Nichtübereinstimmung der Argumente erhalten.

Im Moment sende ich leere Zeichenfolgen anstelle der ersten fehlenden Argumente als Platzhalter. Ich möchte eine Funktion nur mit tatsächlichen Werten aufrufen können.

Gibt es eine Möglichkeit, dies zu tun? Könnte ich eine Liste anstelle der Argumentliste übergeben?

Im Moment sieht der Prototyp mit ctypes ungefähr so ​​aus:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]
Thalia
quelle

Antworten:

193

Versuchen Sie es so zu nennen : obj.some_function( '1', 2, '3', g="foo", h="bar" ). Nach den erforderlichen Positionsargumenten können Sie bestimmte optionale Argumente nach Namen angeben.

Russell Borogove
quelle
245

Verwenden *argsSie einfach den Parameter, mit dem Sie so viele Argumente übergeben können, wie Sie möchten a,b,c. Sie müssten der Zuordnung eine Logik hinzufügen args-> c,d,e,faber es ist eine "Art" der Überladung.

def myfunc(a,b, *args, **kwargs):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

Und es werden Werte von gedruckt c,d,e,f


Ebenso könnten Sie das kwargsArgument verwenden und dann Ihre Parameter benennen.

def myfunc(a,b, *args, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      #etc
myfunc(a,b, c='nick', d='dog', ...)

Und dann kwargshätte ein Wörterbuch aller Parameter, nach denen der Schlüssel bewertet wirda,b

Nix
quelle
Danke dir. Ich kann zwar nicht so viel Flexibilität in meinem Code verwenden und es löst nicht mein Problem, mit verschiedenen leeren Löchern in meiner Liste aufzurufen, aber es ist ein großartiges Werkzeug, um in einem anderen Projekt verwendet zu werden. und Russel Borogove gab mir die genaue Antwort, die ich für mein Problem brauchte, ich bin glücklich.
Thalia
12
Es heißt Arbitrary Argument Lists
FabienB
@Nix, ich mag deine Antwort wirklich. Könnten Sie bitte klarstellen, wofür die Aussage c = kwargs.get('c', None)verwendet wird? Wird es in allen Funktionen benötigt, die optionale Argumente haben? In Ihrem Code hatten Sie nur 2 optionale Argumente. Was ist, wenn der Benutzer ein anderes Argument sagen möchte e? Wie kann ich Ihren Beispielcode für eine unbekannte Anzahl optionaler Argumente ändern, zum Beispiel : def my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...)? Muss ich einschließen, c = kwargs.get('c', None) etcbevor ich das mache obj.add(c, d, ...)?
Nemo
Wenn Sie sich Sorgen über die Komplexität der Zeit machen. Dies wäre ein Problem
NduJay