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')

2 ответа

Решение

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

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

def equal_to():
       pass

   (etc)

COMPARISONS = {
    'equal_to': equal_to,
    etc
}

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

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

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

Другие вопросы по тегам