Предположим, что у меня есть общая функция 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. Мы не хотим вручную указывать новую функцию!
Связанные
- Сохранение подписи декорированных функций: таким образом, чтобы сохранить подпись при декорировании функции. Нам нужно иметь возможность установить подпись на произвольное значение