Для собственного развлечения мне было интересно, как добиться следующего:
functionA = make_fun(['paramA', 'paramB'])
functionB = make_fun(['arg1', 'arg2', 'arg3'])
эквивалентно
def functionA(paramA, paramB):
print(paramA)
print(paramB)
def functionB(arg1, arg2, arg3):
print(arg1)
print(arg2)
print(arg3)
Это означает, что требуется следующее поведение:
functionA(3, paramB=1) # Works
functionA(3, 2, 1) # Fails
functionB(0) # Fails
В центре внимания вопроса находится переменная argspec - мне удобно создавать тело функции, используя обычные методы декоратора.
Для тех, кто заинтересован, я пытался программно создавать классы, подобные следующим. Опять же, трудность заключается в генерации метода __init__
с программными параметрами - остальная часть класса выглядит просто, используя декоратор или, возможно, метакласс.
class MyClass:
def __init__(self, paramA=None, paramB=None):
self._attr = ['paramA', 'paramB']
for a in self._attr:
self.__setattr__(a, None)
def __str__(self):
return str({k:v for (k,v) in self.__dict__.items() if k in self._attributes})