インスタンス メソッドのデフォルトのキー引数を動的に設定したいと考えています。たとえば、
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 に表示されませんでした関数の辞書 ({} のみを表示)
変更は、現在のインスタンスに対してのみ行う必要があります。実は今、クラスを使っているので(心の中で○○なのですが)クラスメソッドでやりたいのですが、関数の方がいいかもしれません。何かのようなもの:
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}
アドバイスやアイデアは大歓迎です。
コンテキストについて少し:
Module クラスはある種の関数ラッパーであり、ローエンド関数をデータフロー システムに自動的に含めるために使用できますが、中間プロシージャを追加します。データフローシステムが正しいモジュールの入力を透過的に適切に生成するために、モジュール実行関数 (実際には、おそらく __call___ 関数) に正しい API を持たせたいと考えています。
私はpython 2.7を使用しています