2011-12-16 87 views
0

這是一個pythonic實現嗎?Pythonic? ...動態調用嵌套函數

我使用包裝函數從字符串參數動態調用嵌套函數,以減少調用不存在函數的機會。這裏就是我想執行(以==> =,<等方面)上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

實現是無關緊要的,因爲這裏非常的事你尋求實現ISN Pythonic。

在Python中,我們使用__eq__家族的方法進行比較,並且存在標準庫中用於實現其中一些方法的工具。

+0

感謝您的回答!我對Python相當陌生,對__eq__系列不熟悉。當然,我會尋找文件,但你能否給我一個簡單的解釋它是什麼?如果我補充說還有更多的比較(也就是說,greater_than()涉及的不僅僅是要求'是arg1> arg2'),還可能有所幫助,但爲簡單起見,我在此省略了這些。我想我真的不應該指定比較,只是詢問它是否是動態調用嵌套函數的pythonic實現?道歉,如果我在任何地方錯過了點! – burn5 2011-12-16 13:18:50