2015-04-09 2 views
5

ich von functools Teil verwenden möge eine Funktion der zweite Argument teilweise anwenden, ich weiß es einfach, mit Lambda zu tun ist, anstatt teilweise alsWie partitioniert man willkürlich das Argument einer Funktion?

>>> def func1(a,b): 
...  return a/b 
... 
>>> func2 = lambda x:func1(x,2) 
>>> func2(4) 
2 

folgt aber ich will unbedingt hier teilweise verwenden (aus Gründen zu lernen), also kam ich auf diese Idee.

>>> def swap_binary_args(func): 
...  return lambda x,y: func(y,x) 
... 
>>> func3 = partial(swap_binary_args(func1),2) 
>>> func3(4) 
2 

Ist es möglich, diese Strategie auf ein Niveau zu erweitern, wo ich teilweise Argumente an jedem Ort wie in dem folgenden Pseudo-Code

>>>def indexed_partial(func, list_of_index, *args): 
...  ###do_something### 
...  return partially_applied_function 

>>>func5=indexed_partial(func1, [1,4,3,5], 2,4,5,6) 

in unserem Fall gelten kann ich diese Funktion nutzen zu können, wie

folgt
>>>func6=indexed_partial(func1, [1], 2) 

Ist es möglich, eine indexierte partielle haben wie ich will? Gibt es etwas Ähnliches, dem ich nicht bewusst bin? und noch wichtiger ist die Idee der indizierten partiellen im Allgemeinen eine gute oder schlechte Idee warum?

Diese Frage wie möglich Duplikat Can one partially apply the second argument of a function that takes no keyword arguments? in dieser Frage markiert wurde der OP gefragt ist es möglich, teilweise zweites Argument gelten, aber hier ist mir zu fragen, wie eine Funktion, um zu kochen, die

+4

Haben Sie darüber nachgedacht, nur Argumente mit dem Namen? 'functools.partial' erlaubt es ihnen, und so würdest du das in echtem Code handhaben, obwohl es vielleicht nicht zu deiner Übung passt. – jwilner

+1

Sie könnten wahrscheinlich etwas mit 'inspect.getargspec' und Bindung mit Arg-Namen erstellen. – tzaman

+0

@jwilner teilweise mit Keyword-Argument wäre praktisch gleichwertig zu dem, was ich versuche zu erreichen, anstelle der Verwendung von Index sollte ich Schlüssel verwenden. Danke :) – k4vin

Antwort

0

jedes beliebiges Argument teilweise anwenden kann Ich denke auch, was Sie fragen, kann nicht getan werden (leicht?) Mit functools.partial. Wahrscheinlich ist die beste (und am besten lesbare) Lösung, partial mit Schlüsselwortargumenten zu verwenden. jedoch im Fall, dass Sie Positionsargumente (und somit indizierten Teil Argumente) verwenden, hier ist eine mögliche Definition von indexed_partial:

def indexed_partial(func, list_of_index, *args): 
    def partially_applied_function(*fargs, **fkwargs): 
     nargs = len(args) + len(fargs) 
     iargs = iter(args) 
     ifargs = iter(fargs) 
     posargs = ((ifargs, iargs)[i in list_of_index].next() for i in range(nargs)) 
     return func(*posargs, **fkwargs) 
    return partially_applied_function 
Verwandte Themen