2015-04-09 23 views
5

voglio usare parziale functools di applicare parzialmente secondo argomento di una funzione, so che è facile da fare con lambda non parziale come seguecome applicare parzialmente l'argomento arbitrario di una funzione?

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

ma strettamente desidera utilizzare parziali qui (per il bene di apprendimento) così mi è venuto in mente questo.

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

E 'possibile estendere questa strategia a un livello in cui posso applicare parziale alcun argomento in qualsiasi luogo come nel seguente pseudocodice

>>>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) 

nel nostro caso posso usare questa funzione come segue

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

È possibile avere un parziale indicizzato come desidero? c'è qualcosa di simile a questo già di cui non sono a conoscenza? e ancora più importante è l'idea di parziale indicizzata generalmente un'idea buona o cattiva perché?

Questa domanda è stato contrassegnato come possibile duplicato di Can one partially apply the second argument of a function that takes no keyword arguments? a questa domanda il PO ha chiesto è possibile applicare parzialmente secondo argomento, ma qui sto chiedendo come cucinare una funzione che può applicare parzialmente qualsiasi argomento arbitrario

+4

Avete preso in considerazione solo utilizzando argomenti con nome? 'functools.partial' li consente, ed è così che lo gestirai in codice reale, anche se forse non si adatta al tuo esercizio. – jwilner

+1

Probabilmente si potrebbe cucinare qualcosa usando 'inspect.getargspec' e vincolando usando i nomi di arg. – tzaman

+0

@jwilner parziale con argomento parola chiave sarebbe praticamente equivalente a quello che sto cercando di ottenere, invece di usare l'indice dovrei usare le chiavi. Grazie :) – k4vin

risposta

0

Anch'io penso che ciò che chiedi non possa essere fatto (facilmente?) Con functools.partial. Probabilmente la soluzione migliore (e più leggibile) è quella di utilizzare partial con argomenti-chiave. Tuttavia, nel caso in cui si desidera utilizzare argomenti posizionali (e quindi indicizzati argomenti parziali), ecco un possibile definizione di 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