我想在给定一些数据的情况下运行一组方法。我想知道如何删除或选择运行不同的方法来运行。我想用更大的方法对它们进行分组,以便我可以调用它;它将沿着测试用例的路线。
在代码中:现在这些是处理数据的方法。我有时可能希望运行所有三个或其子集来收集有关此数据集的信息。
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中反思一样。
请和谢谢。
答案 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'})}
)
但是在这一点上,它看起来更像代码而不是它的价值!