Symfoware

Symfowareについての考察blog

Python getattrで取得したメソッドの引数に変数で値を渡す

タイトルに困ったのですが、やりたいことはgetattrでリフレクションっぽいことをやりたい。
Pythonでオブジェクトに対し、動的にプロパティやメソッドを追加する(setattr)

この時、メソッドに渡す引数も変数で動的に指定したい。


要するに




  1. # -*- coding:utf-8 -*-
  2. class Sample(object):
  3.     def func0(self):
  4.         print('引数なし')
  5.     def func1(self, v1):
  6.         print('引数1つあり:' + v1)
  7.     def func2(self, v1, v2):
  8.         print('引数2つあり:' + v1 + ':' + v2)
  9. s = Sample()
  10. # 引数なし
  11. getattr(s, 'func0')()
  12. # 引数1つ
  13. getattr(s, 'func1')('first')
  14. # 引数2つ
  15. getattr(s, 'func2')('first', 'second')




ここの「('first')」や「('first', 'second')」を変数で指定したい。

イメージはこんな感じ。
※このプログラムは動きません。


  1. # -*- coding:utf-8 -*-
  2. # not work!
  3. class Sample(object):
  4.     def func0(self):
  5.         print('引数なし')
  6.     def func1(self, v1):
  7.         print('引数1つあり:' + v1)
  8.     def func2(self, v1, v2):
  9.         print('引数2つあり:' + v1 + ':' + v2)
  10. # 指定されたメソッドを引数付きで呼び出し
  11. def func_call(s, method, args):
  12.     getattr(s, method)(args)
  13. s = Sample()
  14. # 引数なし
  15. func_call(s, 'func0', ())
  16. # 引数1つ
  17. func_call(s, 'func1', ('first'))
  18. # 引数2つ
  19. func_call(s, 'func2', ('first', 'second'))







リスト渡し



Pythonで辞書型のオブジェクトをキーワード引数として関数に渡す

こちらでやったことがヒントになりました。


  1. # -*- coding:utf-8 -*-
  2. class Sample(object):
  3.     def func0(self):
  4.         print('引数なし')
  5.     def func1(self, v1):
  6.         print('引数1つあり:' + v1)
  7.     def func2(self, v1, v2):
  8.         print('引数2つあり:' + v1 + ':' + v2)
  9. # 指定されたメソッドを引数付きで呼び出し
  10. def func_call(s, method, args = []):
  11.     getattr(s, method)(*args)
  12. s = Sample()
  13. # 引数なし
  14. func_call(s, 'func0')
  15. # 引数1つ
  16. func_call(s, 'func1', ['first'])
  17. # 引数2つ
  18. func_call(s, 'func2', ['first', 'second'])





狙い通りの動作です。


$ python sample.py
引数なし
引数1つあり:first
引数2つあり:first:second


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/03/08(日) 11:46:50|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<複数のSupervisordを一括監視する「py-supervisord-monitor」 | ホーム | Slack風チャットシステム「Let's Chat」をDebian 7にインストールする>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1676-f7275974
この記事にトラックバックする(FC2ブログユーザー)