Я хотел бы задать динамические аргументы ключа-аргумента по умолчанию. Например, сДинамическое добавление ключей-аргументов к методу
class Module(object):
def __init__(self, **kargs):
set-default-key-args-of-method(self.run, kargs) # change run arguments
def run(self, **kargs):
print kargs
Мы имеем:
m = Module(ans=42)
m.run.im_func.func_code.co_argcount # => 2
m.run.im_func.func_code.co_varnames # => ('self','ans','kargs')
m.run.im_func.func_defaults # => (42,)
m.run() # print {'ans':42}
Я пытался что-то с types.CodeType (который я не очень понимаю) для функции (а не метод) и получил его (нуль не-к-неудачу), но добавленные ключевые аргументы не показывались в словаре kargs функции (он только печатает {})
Это изменение должно быть выполнено только для текущего экземпляра , На самом деле, я использую класс прямо сейчас (я OO в моем сознании), поэтому я хотел бы сделать это с помощью метода класса, но функция может быть лучше. Что-то вроде:
def wrapped_run(**kargs):
def run(**key_args):
print key_args
return wrap-the-run-function(run, kargs)
run = wrapped_run(ans=42)
run.func_code.co_argcount # => 1
run.func_code.co_varnames # => ('ans','key_args') ## keep the 'key_args' or not
run.func_defaults # => (42,)
run() # print {'ans':42}
Любые советы или идеи приветствуются.
Немного о контексте:
Класс модуля является своего рода функция упаковщик, который можно использовать, чтобы включить нижний конец функции в системе автоматически, но потока данных добавить промежуточные процедуры. Я бы хотел, чтобы функция запуска модуля (на самом деле, вероятно, это была функция __call___) имела правильный API, чтобы система потока данных могла легко генерировать вход модуля корректно.
Я использую Python 2.7
Стоит спросить, если вы хотите добавлять функции к методу привязки или к несвязавшемуся методу (например, Должны ли они влиять только на текущий экземпляр или на каждый экземпляр класса?) – mgilson
Итак, вы хотите иметь «конвейер» функций, которые можно настроить во время выполнения для перемещения данных? –
@mgilson, справа, это только для текущего экземпляра –