2010-12-13 12 views
1

以下のコードで辞書からget_productname関数を呼び出すにはどうすればよいですか?クラスのDictキーとしての機能

test = { 
     'get_productname' : { 
         'id' : 1, 
         'active' : 1, 
         } 
    } 

class search(object): 
    def __init__(self): 
     for key, value in test.items(): 
      if test[key]['active']: 
       ... here i want to call the "get_productname" function from the dict key name 
       self.key() 
       ... HOW CAN I DO THIS? 

    def get_productname(self, id): 
     ... 
     return productname 
+0

質問がありますか? –

答えて

7

class search(object): 
    def __init__(self): 
    for key, value in test.items(): 
     if test[key]['active']: 
     getattr(self, key)(test['key']['id']) 
コメントパー

、あなたが100%の方法は、あなたが前もってhasattr(self, name)チェックを実行することができます存在することを肯定いないのであれば、それはこれに同等です:あなたが持っていると仮定し

try: 
    getattr(self, key) 
except AttributeError, e: 
    # code here that would handle a missing method. 
+2

メソッドが存在することを確認する最良の方法は、 'getattr'を試して、' AttributeError'をキャッチすることです - これは 'hasattr'の行います! – katrielalex

+0

また 'getattr(self、key、None)'(関数が存在しない場合に取得したいデフォルト値を 'None'に置き換えて)でもかまいません。 – kindall

3

呼び出すメソッドがどのクラスに属しているかを事前に知っている場合は、名前の代わりにメソッドを辞書キーとして使用できます。そして、あなたは、単にそれらを呼び出すことができます:あなたはgetattr機能が欲しい

class search(object): 
    def __init__(self, test): 
     for func, value in test.iteritems(): 
      if value['active']: 
       func(self, value['id']) 
    def get_productname(self, id): 
     pass 

test = {search.get_productname: {'id' : 1, 'active' : 1}} 
0

test = { 
     'get_productname' : { 
         'id' : 1, 
         'active' : 1, 
         'func' : get_productname 
         } 
    } 

は、その後、あなたがこのようにそれを呼び出すことができます:get_productname()機能は、私はちょうどこのような辞書に追加したい、どこかで定義された

class search(object): 
    def __init__(self): 
     for key, value in test.items(): 
      if test[key]['active']: 
       # then call the associated function like this 
       test[key]['func']() 
       ... 

希望します。

http://docs.python.org/library/functions.html#eval

これを試してみてください:

test = { 
     'get_productname' : { 
         'id' : 1, 
         'active' : 1, 
         } 
    } 

class search(object): 
    def __init__(self): 
     for key, value in test.items(): 
      if test[key]['active']: 
       eval("self.%s()" % key) 
       # or, if you want to pass ID as an arg: 
       eval("self.%(method_name)s(id=%(id)s)" % \ 
         dict(method_name=key, id=value["id"]) 

    def get_productname(self, id): 
     ... 
     return productname 

はそれを実行していないが、それは動作するはずの人がこのことを示唆するために私を炎かもしれないにもかかわらず

0

+0

hmmm、nevermind。上記のgetattrの提案は、この場合にははるかに優れているようです。もちろん、可能な限りevalを避ける、std disclaimer。 –

関連する問題