2010-12-13 9 views
1

Comment appeler la fonction get_productname du dictionnaire dans le code ci-dessous?Clé Dict comme fonction dans une classe

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

Y a-t-il une question? –

Répondre

7

Vous voulez que la fonction getattr.

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

par les commentaires, si vous n'êtes pas 100% positif que la méthode que vous existez pouvez effectuer une hasattr(self, name) vérifier à l'avance, mais il est équivalent à ceci:

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

La meilleure façon de s'assurer que la méthode existe est d'essayer 'getattr' et d'attraper le' AttributeError' - c'est ce que 'hasattr' fait! – katrielalex

+0

Vous pouvez également simplement 'getattr (self, key, None)' (remplacer 'None' par la valeur par défaut que vous voulez obtenir si la fonction n'existe pas). – kindall

3

Si vous savez à l'avance quelles sont les classes les méthodes que vous voulez appeler appartenez, vous pouvez utiliser les méthodes lui-même plutôt que leurs noms clés de dictionnaire. Ensuite, vous pouvez simplement les appeler:

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

En supposant que vous avez une fonction définie get_productname() quelque part, je venais de l'ajouter au dictionnaire comme celui-ci:

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

Ensuite, vous pouvez l'appeler comme ceci:

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']() 
       ... 

Espérons que ça aide.

0

Même si les gens pourraient me flamme pour suggérer ceci:

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

Essayez ceci:

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 

courir ne, mais cela devrait fonctionner.

+0

hmmm, rien à faire. La suggestion de getattr ci-dessus semble être une bien meilleure utilisation dans ce cas. Évitez eval chaque fois que possible, bien sûr, std disclaimer. –