在单个数据上运行一堆python方法

时间:2011-03-12 00:43:22

标签: python methods

我想在给定一些数据的情况下运行一组方法。我想知道如何删除或选择运行不同的方法来运行。我想用更大的方法对它们进行分组,以便我可以调用它;它将沿着测试用例的路线。

在代码中:现在这些是处理数据的方法。我有时可能希望运行所有三个或其子集来收集有关此数据集的信息。

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

我希望能够通过另一个调用来调用这些方法,所以我不必输入run this;跑这个。我正在寻找通过一个调用运行一堆方法的优雅方式,所以我可以选择哪个运行。

期望的结果

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

我希望我的问题清楚。我只是在寻找一种优雅的方式来做到这一点。就像在Java中反思一样。

请和谢谢。

3 个答案:

答案 0 :(得分:4)

将要运行的方法作为参数发送:

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)

答案 1 :(得分:2)

如果您通常执行所有功能但有时会有异常,那么默认情况下完成它们会很有用,但可以选择禁用它们:

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)

答案 2 :(得分:1)

回答关于传递任意值的评论中的问题:

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

但是在这一点上,它看起来更像代码而不是它的价值!