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__
семейство методов для сравнения, и в стандартной библиотеке есть инструменты для реализации некоторых из них с точки зрения других.