Pythonic? ... Динамический вызов вложенных функций - PullRequest
0 голосов
/ 16 декабря 2011

Это питонная реализация?

Я вызываю вложенные функции динамически из строкового аргумента с обертками, чтобы уменьшить вероятность вызова несуществующей функции. Вот пример, где я хочу выполнить различные сравнения для 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')

Ответы [ 2 ]

6 голосов
/ 16 декабря 2011

Реализация здесь неактуальна, потому что вы пытаетесь реализовать не Pythonic.

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

1 голос
/ 16 декабря 2011

Что вам не хватает, так это то, что в Python функции являются первоклассными объектами. Это означает, что они могут быть назначены переменным и переданы, как и любой другой объект.

Таким образом, вместо того, чтобы вкладывать функцию и вызывать ее в родительской функции, вы просто хотите назначить соответствующую функцию в качестве возвращаемого значения вашей функции и вызвать ее по возвращении. Или, что еще лучше, назначьте словарь на уровне класса, содержащий функции:

def equal_to():
       pass

   (etc)

COMPARISONS = {
    'equal_to': equal_to,
    etc
}

Теперь вы можете звонить COMPARISONS['equal_to'](arg1, arg2).

...