2017-05-10 1 views
0

J'ai quelques fonctions importées from package import fizz, buzz et je veux les mapper à une variable func à partir d'un argument chaîne.Carte importé fonction à une variable

class Whatever(object): 
    def __init__(self, func_name='fizz'): 
     try: 
      self.func = vars()[func_name] 
     except KeyError: 
      print "Bad func_name" 
      raise 

Mais vars() capture que l'espace de noms local, et je ne veux pas permettre l'accès à globals(). Des idées? Ou devrais-je juste aller avec la logique d'if-else?

+0

Cela pourrait être ce que vous cherchez: https://docs.python.org/3 /library/functions.html#exec –

+1

Pourquoi ne pas passer la fonction * directement * à l'initialiseur: 'def __init __ (self, func = fizz)' –

+0

Mais fondamentalement, si vous voulez accéder à un nom global en dehors du global scope en utilisant une chaîne, alors vous avez en quelque sorte * have * pour utiliser 'globals', ou pire, quelque chose comme' exec' ou 'eval'. –

Répondre

2

Vous pouvez utiliser une liste blanche ... ou dans ce cas, un « dict blanc »

class Whatever(object): 

    allowed = { 'fizz':fizz, 'buzz':buz } 

    def __init__(self, func_name='fizz'): 
     try: 
      self.func = self.allowed[func_name] 
     except KeyError: 
      print "Bad func_name" 
      raise 
+0

Merci, c'est ce que j'ai mentionné dans les commentaires ci-dessus comme une alternative décente. – BoltzmannBrain