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

しかし、基本的には、グローバル以外のグローバル名にアクセスする場合スコープを文字列で指定すると、 '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

関連する問題