Gibt es eine Möglichkeit, eine Python-Funktion mit der falschen Anzahl von Argumenten aufrufen, ohne eine Typeerror Aufruf?

StackOverflow https://stackoverflow.com/questions/933484

  •  06-09-2019
  •  | 
  •  

Frage

Wenn Sie eine Funktion mit der falschen Anzahl von Argumenten aufrufen, oder mit einem Schlüsselwort-Argument, das nicht in seiner Definition ist, erhalten Sie eine Typeerror. Ich würde ein Stück Code wie einen Rückruf zu nehmen und rufen Sie es mit variablen Argumenten, auf dem, was der Callback unterstützt. Eine Möglichkeit, es zu tun wäre, für einen Rückruf cb, verwendet cb.__code__.cb_argcount und cb.__code__.co_varnames, aber ich würde eher abstrakt, dass in so etwas wie apply, aber das gilt nur die Argumente, die „fit“.

Zum Beispiel:

 def foo(x,y,z):
   pass

 cleanvoke(foo, 1)         # should call foo(1, None, None)
 cleanvoke(foo, y=2)       # should call foo(None, 2, None)
 cleanvoke(foo, 1,2,3,4,5) # should call foo(1, 2, 3)
                           # etc.

Gibt es etwas wie dies bereits in Python, oder ist es etwas, was ich von Grund auf neu schreiben sollte?

War es hilfreich?

Lösung

Rather sich nach unten in die Details als Graben, können Sie die Funktion der Signatur prüfen - Sie wollen wahrscheinlich inspect.getargspec(cb)

.

Genau wie Sie diese Informationen verwenden möchten, und die args Sie haben die Funktion „richtig“ zu nennen, ist mir nicht ganz klar. Unter der Annahme, der Einfachheit halber, die Sie nur über einfache Namen args kümmern, und die Werte, die Sie möchten, dass in dict d passieren sind ...

args = inspect.getargspec(cb)[0]
cb( **dict((a,d.get(a)) for a in args) )

Vielleicht möchten Sie etwas schicker und kann genau erarbeiten, was?

Andere Tipps

Das vielleicht?

def fnVariableArgLength(*args, **kwargs):
    """
    - args is a list of non keywords arguments
    - kwargs is a dict of keywords arguments (keyword, arg) pairs
    """
    print args, kwargs


fnVariableArgLength() # () {}
fnVariableArgLength(1, 2, 3) # (1, 2, 3) {}
fnVariableArgLength(foo='bar') # () {'foo': 'bar'}
fnVariableArgLength(1, 2, 3, foo='bar') # (1, 2, 3) {'foo': 'bar'}

Bearbeiten Ihre Anwendungsfälle

def foo(*args,*kw):
    x= kw.get('x',None if len(args) < 1 else args[0])
    y= kw.get('y',None if len(args) < 2 else args[1])
    z= kw.get('z',None if len(args) < 3 else args[2])
    # the rest of foo

foo(1)         # should call foo(1, None, None)
foo(y=2)       # should call foo(None, 2, None)
foo(1,2,3,4,5) # should call foo(1, 2, 3)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top