2017-05-10 25 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