2011-12-16 17 views
0

これはPythonの実装ですか?Pythonic? ...入れ子関数を動的に呼び出す

私は、存在しない関数を呼び出すの機会を減らすためにラッパーを持つ文字列引数から動的にネストされた関数を呼び出しています。非常に事はあなたがISNを実装することを求めるので、ここで私は(==、> =、<などの面で)ARG1とARG2に異なる比較を実行する例を示します...

class ComparisonClass(object): 
    def__init__(self): 
     pass 

    def comparison(self,arg1,arg2,comparison): 
     def equal_to():    
      pass 
     def greater_than(): 
      pass 
     def less_than(): 
      pass 

     return locals()[comparison]() 

    def comparison_equal_to(self,arg1,arg2): 
     return self.comparison(arg1,arg2,'equal_to') 

    def comparison_greater_than(self,arg1,arg2): 
     return self.comparison(arg1,arg2,'greater_than') 

    def comparison_less_than(self,arg1,arg2): 
     return self.comparison(arg1,arg2,'less_than') 

答えて

1

はPythonで、関数はファーストクラスのオブジェクトであるということです。つまり、変数に代入して他のオブジェクトと同様に渡すことができます。

だから、むしろ機能をネストし、親関数内でそれを呼び出すよりも、あなたは自分の関数の戻り値として、関連する機能を割り当て、リターンでそれを呼びたいです。または、より良い、関数を含むクラスレベルで辞書を割り当てる:

def equal_to(): 
     pass 

    (etc) 

COMPARISONS = { 
    'equal_to': equal_to, 
    etc 
} 

今、あなたはCOMPARISONS['equal_to'](arg1, arg2)を呼び出すことができます。

6

実装は、ここには無関係です'Python' t。

Pythonでは、比較のために__eq__ファミリのメソッドを使用しています。また、標準ライブラリには、他のツールで実装するためのツールがあります。あなたが不足しているもの

+0

あなたの答えをありがとう!私はかなりPythonを初めて使い、__eq__ファミリに精通していません。もちろん、私はドキュメンテーションを探しますが、それが何であるか簡単に説明してもらえますか?私は比較にはるかがあることを追加した場合、それはまた、役立つかもしれない(すなわちGREATER_THAN()尋ねるよりも多くを必要とする「引数1> arg2にある」)が、私は簡単にするため、そのここでは省略しています。私は本当に比較を指定してはいけないと思って、それが動的にネストされた関数を呼び出すのpythonic実装だったかどうか尋ねただけですか?私がポイントをどこにも見逃しているなら、お詫び! – burn5

+0

私はほとんどの場合、「動的にネストされた関数を呼び出す」というフレーズの意味を理解するのが難しいです。私がそれを理解する限り、ダニエルの答えはそれ以上のものです。 '__eq__' et。その他のドキュメント:http://docs.python.org/reference/datamodel.html#object.__lt__ –

関連する問題