2011-12-16 5 views
0

Является ли это пифонической реализацией?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 Питонический.

В Python мы используем семейство методов сравнения для __eq__, и в стандартной библиотеке существуют инструменты для реализации некоторых из них с точки зрения других.

+0

Спасибо за ваш ответ! Я довольно новичок в Python и не знаком с семьей __eq__. Естественно, я буду искать документацию, но могли бы вы дать мне краткое объяснение, что это такое? Это может также помочь, если я добавлю, что сравнение намного больше (т. Е. More_than() включает в себя больше, чем запрос «arg1> arg2»), но я просто пропустил это для простоты. Наверное, я действительно не должен был указывать сравнения и просто спросил, была ли это пифоническая реализация динамических вызовов вложенных функций? Извиняюсь, если я пропущу точку в любом месте! – burn5

+0

В основном я испытываю трудности с выяснением того, что вы чувствуете в фразе «динамически вызывающие вложенные функции». Насколько я понимаю, ответ Даниила более чем достаточен. Для '__eq__' и. al., см. документацию: http://docs.python.org/reference/datamodel.html#object.__lt__ –

Смежные вопросы