Я хочу динамически добавить аргументы в функцию run_func
, которая вызывает другую функцию.
Если я не копирую объект __closure__
из run_func
в modified_func
, Python падает, как толькоЯ пытаюсь вызвать modified_func
.
. Если я пытаюсь скопировать старый объект замыкания в измененную функцию, он не подходит: "#ValueError: run_func требует замыкания длины 0, а не 1"
Как правильно выполнить модификацию, чтобы измененная функция не вылетала?
import types
def make_facade(func, param_names):
def run_func():
return func()
code = run_func.__code__
modified_code = types.CodeType(
len(param_names), #code.co_argcount
code.co_kwonlyargcount,
len(param_names), #code.co_nlocals
code.co_stacksize,
code.co_flags,
code.co_code,
code.co_consts,
code.co_names,
tuple(param_names), #code.co_varnames
code.co_filename,
code.co_name,
code.co_firstlineno,
code.co_lnotab
)
#modified_func = types.FunctionType(modified_code, run_func.__globals__, closure=run_func.__closure__) #ValueError: run_func requires closure of length 0, not 1
modified_func = types.FunctionType(modified_code, run_func.__globals__)
return modified_func
def ffff(dict):
print(dict)
ffff_facade = make_facade(ffff, ['arg1', 'arg2'])
help(ffff_facade) #Help on function run_func in module __main__: run_func(arg1, arg2)
ffff_facade(1, 2) #Crash