目的
kwargsを複数の関数に対して、適切に振り分けたいです。
コードの例
mainfunc以外はパッケージ化されていて変更できないとします。
# 自由にいじれる関数 def mainfunc(**kwargs): func_a(**kwargs) func_b(**kwargs) # 以下、変更できない関数 def func_a(a1=0, **kwargs): func_a_inner(**kwargs) def func_a_inner(aa1=0): pass def func_b(b1=0, **kwargs): func_b_inner(**kwargs) def func_b_inner(bb1=0): pass
このようなコードに対して
mainfunc(a1=1, bb1=2)
のよう呼び出したいです。
そのままだと、以下のようなエラーが出ます。
mainfunc(a1=1)と呼び出すと、func_b_inner(a1=1)が呼ばれ、
**kwargsのない関数に、想定していないキーが来るため、エラーになります。
Traceback (most recent call last): File "a.py", line 22, in <module> mainfunc(a1=0) File "a.py", line 3, in mainfunc func_b(**kwargs) File "a.py", line 15, in func_b func_b_inner(**kwargs) TypeError: func_b_inner() got an unexpected keyword argument 'a1'
試したこと
- inspect.signatureを用いた方法
関数の引数がどんなキーワードを待っているかを知ることができれば、うまく振り分けられるのですが、
param = inspect.signature(func_a).parameter print(param) >>> OrderedDict([('a1', <Parameter "a1=0">), ('xargs', <Parameter "**xargs">)])
上記の方法だと、aa1に関するkeywordのdictは得られません。
また、aa1を見つけるために、func_a_innerのsignatureを取っていくのはスマートではありません。
calleeを取得する方法は見つけることができませんでした。
- jedi
emacsの補完では、calleeの引数ほdictまで出るので、そちらを参考にしようとしましたが、ちんぷんかんぷんでした。
- ナイーブな方法
このような方法は取りたくありません
def mainfunc(func_a_kwargs, func_b_kwargs): func_a(**func_a_kwargs) func_b(**func_b_kwargs) main_func(func_a_kwargs={aa1:1}, func_b_kwargs={b1:2})
def mainfunc(**kwargs): func_a_key = {a1, aa1} func_b_key = {b1, bb1} ...
補足情報(FW/ツールのバージョンなど)
python 3.6
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/11 17:07