Supongamos que tengo una función genérica f. Quiero programmatically crear una función f2 que se comporta igual que f, pero tiene una firma personalizada.Establecer firma de función en Python
Más detalles
Dada una lista ly y un diccionario d Quiero ser capaz de:
- Establecer los argumentos que no sean de palabras clave de f2 para las cuerdas en l
- Conjunto los argumentos de palabra clave de f2 a las claves en d y los valores predeterminados a los valores de d
es decir. Supongamos que tenemos
l=["x", "y"]
d={"opt":None}
def f(*args, **kwargs):
#My code
Entonces me gustaría que una función con la firma:
def f2(x, y, opt=None):
#My code
un uso específico caso
Esto es sólo una versión simplificada de mi caso de uso específico. Estoy dando esto como un ejemplo solamente.
Mi caso de uso real (simplificado) es el siguiente. Tenemos una función de iniciación genérica:
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)
Queremos utilizar esta función en varias clases. En particular, queremos crear una función init que se comporta como generic_init, pero tiene la firma definida por algunas variables de clase en hora de creación:
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__)
Queremos create_initiation_function para crear una nueva función con la firma definido usando init_args y kw_init_args. ¿Es posible escribir create_initiation_function?
Tenga en cuenta:
- Si sólo quería mejorar la ayuda, pude establecer doc.
- Queremos establecer la firma de la función en la creación. Después de eso, no necesita ser cambiado.
- En lugar de crear una función como generic_init, pero con una firma diferente, podríamos crear una nueva función con la firma deseada que simplemente llama a generic_init
- Queremos definir create_initiation_function. ¡No queremos especificar manualmente la nueva función!
relacionada
- Preserving signatures of decorated functions: Esto es cómo preservar una firma al momento de decorar una función.Necesitamos ser capaces de establecer la firma a un valor arbitrario
Obviamente, desea saber algo completamente diferente de lo que está preguntando. ¿Tal vez deberías explicar cuál es el problema que estás teniendo? Eso podría decirnos lo que en realidad estás tratando de preguntar. –
¿Estás preguntando cómo crear programáticamente esa función?De todos modos, creo que debes darnos un contexto. ¿Cómo quieres usarlo? ¿Cómo quieres especificar el cuerpo de la función? ¿Podrías mostrarnos cómo te gustaría usarlo? –
¿Está más claro ahora que lo he editado de nuevo? – Casebash