Supponiamo di avere una funzione generica f. Voglio programmaticamente creare una funzione f2 che si comporta come f, ma ha una firma personalizzata.Imposta la firma della funzione in Python
Maggiori dettagli
Dato un elenco l ed e dizionario d voglio essere in grado di:
- impostare gli argomenti non di parole chiave di f2 alle corde in l
- Set gli argomenti della parola chiave di f2 alle chiavi in d e i valori predefiniti ai valori di d
ie. Supponiamo di avere
l=["x", "y"]
d={"opt":None}
def f(*args, **kwargs):
#My code
Poi vorrei una funzione con la firma:
def f2(x, y, opt=None):
#My code
un uso specifico caso
Questa è solo una versione semplificata del mio specifico caso d'uso. Sto dando questo solo come esempio.
Il mio caso di utilizzo effettivo (semplificato) è il seguente. Abbiamo una funzione generica di avvio:
def generic_init(self,*args,**kwargs):
"""Function to initiate a generic object"""
for name, arg in zip(self.__init_args__,args):
setattr(self, name, arg)
for name, default in self.__init_kw_args__.items():
if name in kwargs:
setattr(self, name, kwargs[name])
else:
setattr(self, name, default)
Vogliamo utilizzare questa funzione in un numero di classi. In particolare, vogliamo creare una funzione init che si comporta come generic_init, ma ha la firma definito da alcune variabili di classe al momento della creazione:
class my_class:
__init_args__=["x", "y"]
__kw_init_args__={"my_opt": None}
__init__=create_initiation_function(my_class, generic_init)
setattr(myclass, "__init__", __init__)
Vogliamo create_initiation_function per creare una nuova funzione con la firma definito utilizzando init_args e kw_init_args. È possibile scrivere create_initiation_function?
Si prega di notare:
- Se Volevo solo migliorare l'aiuto, ho potuto impostare doc.
- Vogliamo impostare la firma della funzione sulla creazione. Dopodiché, non ha bisogno di essere cambiato.
- Invece di creare una funzione come generic_init, ma con una firma diversa, potremmo creare una nuova funzione con la firma desiderata che chiama semplicemente generic_init
- Vogliamo definire create_initiation_function. Non vogliamo specificare manualmente la nuova funzione!
correlati
- Preserving signatures of decorated functions: Questo è come conservare una firma quando decorare una funzione.Dobbiamo essere in grado di impostare la firma di un valore arbitrario
Ovviamente vuoi sapere qualcosa di completamente diverso da quello che stai chiedendo. Forse dovresti spiegare qual è il problema che stai avendo? Questo potrebbe dirci cosa stai cercando di chiedere. –
Stai chiedendo come programmare una tale funzione?Ad ogni modo, penso che tu debba darci un contesto. Come vuoi usarlo? Come si desidera specificare il corpo della funzione? Puoi mostrarci come vorresti utilizzarlo? –
È più chiaro ora che l'ho modificato di nuovo? – Casebash