Предположим, у меня есть общая функция f. Я хочу программно создать функцию f2, которая ведет себя так же, как f, но имеет настроенную подпись.
Подробнее
Учитывая список l и словарь d, я хочу иметь возможность:
- Установить аргументы без ключевого слова для f2 в строки в l
- Установите ключевые аргументы f2 для ключей в d и значения по умолчанию для значений d
т. Предположим, у нас есть
l=["x", "y"]
d={"opt":None}
def f(*args, **kwargs):
#My code
Тогда я бы хотел функцию с подписью:
def f2(x, y, opt=None):
#My code
Особый вариант использования
Это просто упрощенная версия моего конкретного варианта использования. Я приведу это только в качестве примера.
Мой фактический вариант использования (упрощенный) выглядит следующим образом. У нас есть общая функция инициации:
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)
Мы хотим использовать эту функцию в ряде классов. В частности, мы хотим создать функцию init , которая ведет себя как generic_init, но имеет сигнатуру, определенную некоторыми переменными класса в время создания :
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__)
Мы хотим, чтобы create_initiation_function создала новую функцию с сигнатурой, определенной с использованием init_args и kw_init_args . Можно ли написать функцию create_initiation_function?
Обратите внимание:
- Если бы я просто хотел улучшить помощь, я мог бы установить doc .
- Мы хотим установить сигнатуру функции при создании. После этого его не нужно менять.
- Вместо создания функции, такой как generic_init, но с другой сигнатурой, мы могли бы создать новую функцию с нужной сигнатурой, которая просто вызывает generic_init
- Мы хотим определить функцию create_initiation_function. Мы не хотим указывать новую функцию вручную!
Относящиеся