Запуск группы методов Python на одном фрагменте данных - PullRequest
0 голосов
/ 12 марта 2011

Я хотел бы запустить набор методов с учетом некоторых данных.Мне было интересно, как я могу удалить или выбрал запускать различные методы для запуска.Я хотел бы сгруппировать их в более крупный метод, чтобы я мог его вызвать;и это пойдет по образцу тестового примера

В коде: теперь это методы обработки данных.Иногда мне может потребоваться запустить все три или их подмножество для сбора информации об этом наборе данных.

def one(self):
    pass
def two(self):
    pass
def three(self):
    pass

Я хотел бы иметь возможность вызывать эти методы с другим вызовом, поэтому мне не нужно вводитьзапустить это;запустить это.Я ищу элегантный способ запустить кучу методов через один вызов, чтобы я мог выбирать, какие из них запускаются.

Желаемый результат

def run_methods(self, variables):
     #runs all three or subset of

Надеюсь, я был ясен в своем вопросе.Я просто ищу элегантный способ сделать это.Как в Java с отражением.

Пожалуйста и спасибо.

Ответы [ 3 ]

4 голосов
/ 12 марта 2011

Отправьте методы, которые вы хотите запустить, в качестве параметра:

def runmethods(self, variables, methods):
   for method in methods:
       method(variables)

, затем вызовите что-то вроде:

self.runmethods(variables, (method1, method2))

Это приятно иметь функции в качестве объектов первого классав Python

Для вопроса об OP в комментарии (разные параметры для функций), грязное решение (извините за это):

def rest(a, b):
    print a - b

def sum(a, b):
    print a + b

def run(adictio):
    for method, (a, b) in adictio.iteritems():
        method(a, b)

mydictio = {rest:(3, 2), sum:(4, 5)}

run(mydictio)

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

, если ваши методы / функции используют различное количество параметров, вы не можете использовать

for method, (a,b) in adictio.iteritems():

, потому что этоожидает одинаковое количество параметров для всех методов.В этом случае вы можете использовать * args:

def rest(*args):
    a, b = args
    print a - b

def sum(*args):
    a, b, c, d, e = args
    print a + b + c + d + e

def run(adictio):
    for method, params in adictio.iteritems():
        method(*params)

mydictio = {rest:(3, 2), sum:(4, 5, 6, 7, 8)}

run(mydictio)
2 голосов
/ 12 марта 2011

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

def doWalkDog():
    pass

def doFeedKid():
    pass

def doTakeOutTrash():
    pass

def doChores(walkDog=True, feedKid=True, takeOutTrash=True):
    if walkDog: doWalkDog()
    if feedKid: doFeedKid()
    if takeOutTrash: doTakeOutTrash()

# if the kid is at grandma's...
# we still walk the dog and take out the trash
doChores(feedKid=False)
1 голос
/ 12 марта 2011

Чтобы ответить на вопрос в комментарии относительно передачи произвольных значений:

def runmethods(self, methods):
   for method, args in methods.iteritems():
       method(*args[0], **args[1])

runmethods( {methodA: ([arg1, arg2], {'kwarg1:' 'one', 'kwarg2'})},
            {methodB: ([arg1], {'kwarg1:' 'one'})} 
          )

Но на данный момент это выглядит как больше кода, чем стоит!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...