Python getattrで取得したメソッドの引数に変数で値を渡す
タイトルに困ったのですが、やりたいことはgetattrでリフレクションっぽいことをやりたい。Pythonでオブジェクトに対し、動的にプロパティやメソッドを追加する(setattr)
この時、メソッドに渡す引数も変数で動的に指定したい。
要するに
- # -*- coding:utf-8 -*-
- class Sample(object):
- def func0(self):
- print('引数なし')
- def func1(self, v1):
- print('引数1つあり:' + v1)
- def func2(self, v1, v2):
- print('引数2つあり:' + v1 + ':' + v2)
- s = Sample()
- # 引数なし
- getattr(s, 'func0')()
- # 引数1つ
- getattr(s, 'func1')('first')
- # 引数2つ
- getattr(s, 'func2')('first', 'second')
ここの「('first')」や「('first', 'second')」を変数で指定したい。
イメージはこんな感じ。
※このプログラムは動きません。
- # -*- coding:utf-8 -*-
- # not work!
- class Sample(object):
- def func0(self):
- print('引数なし')
- def func1(self, v1):
- print('引数1つあり:' + v1)
- def func2(self, v1, v2):
- print('引数2つあり:' + v1 + ':' + v2)
- # 指定されたメソッドを引数付きで呼び出し
- def func_call(s, method, args):
- getattr(s, method)(args)
- s = Sample()
- # 引数なし
- func_call(s, 'func0', ())
- # 引数1つ
- func_call(s, 'func1', ('first'))
- # 引数2つ
- func_call(s, 'func2', ('first', 'second'))
リスト渡し
Pythonで辞書型のオブジェクトをキーワード引数として関数に渡す
こちらでやったことがヒントになりました。
- # -*- coding:utf-8 -*-
- class Sample(object):
- def func0(self):
- print('引数なし')
- def func1(self, v1):
- print('引数1つあり:' + v1)
- def func2(self, v1, v2):
- print('引数2つあり:' + v1 + ':' + v2)
- # 指定されたメソッドを引数付きで呼び出し
- def func_call(s, method, args = []):
- getattr(s, method)(*args)
- s = Sample()
- # 引数なし
- func_call(s, 'func0')
- # 引数1つ
- func_call(s, 'func1', ['first'])
- # 引数2つ
- func_call(s, 'func2', ['first', 'second'])
狙い通りの動作です。
$ python sample.py
引数なし
引数1つあり:first
引数2つあり:first:second
- 関連記事
コメント