2017-05-10 18 views
0

我有一些导入函数from package import fizz, buzz,我想将它们映射到字符串arg的变量func将导入的函数映射到变量

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

vars()只捕捉局部命名空间,我不希望允许globals()访问。有任何想法吗?或者我应该只用if-else逻辑呢?

+0

这可能是你在找什么:https://docs.python.org/3 /library/functions.html#exec –

+1

为什么不直接将*函数直接传递给初始值设定项:'def __init __(self,func = fizz)' –

+0

但基本上,如果你想访问全球以外的全局名称使用一个字符串作用域,那么你可以使用* glob *来使用'globals',或者更糟的是,使用'exec'或'eval'。 –

回答

2

你可以使用白名单......或在这种情况下,“白色字典”

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

谢谢,这是我在上面评论中提到的一个体面的替代品。 – BoltzmannBrain