我有a
的对象class b
和方法foo(), boo(), noo(arg)
。现在,我想随机选择其中之一而不扩展class b
。问题是,如果我使用此处假设的技术:Syntax to call random function from a list,那么我必须具有与方法相同的参数。
所以我不能这样使用smth:
my_list = [a.foo, a.boo, a.noo]
random.choice(my_list)()
我遇到noo
方法的情况,我需要用arg
来调用它:a.noo(arg)
。那么如何以pythonic的方式来做呢?
答案 0 :(得分:3)
import random
funcs = [foo, boo, noo]
args = [[1,2,3], [4,5], [2]]
choice = random.randint(len(funcs))
funcs[choice](*args[choice])
通过这种方式,您可以灵活地调用带有动态参数的任何函数,具体取决于您的方法。
记住要使参数和函数保持相同的顺序
编辑:您也可以按照评论中的建议进行操作(我认为这很容易,谢谢!):
import random
calls = [(foo, [1,2,3]), (boo, [4,5]), (noo, [2])]
choice = random.choice(calls)
choice[0](*choice[1])
答案 1 :(得分:1)
这就是我要做的。尽管如果您希望函数具有多个参数,则最好将其作为列表发送并在函数中解压缩。
import random
def foo():
print('foo')
def boo():
print('boo')
def noo(arg):
print('noo:', arg)
my_list = [(foo,), (boo,), (noo, 'hello world')]
for i in range(10):
choice = random.choice(my_list)
if len(choice) == 1:
choice[0]()
else:
choice[0](choice[1])
答案 2 :(得分:0)
在评论中建议这样的事情:
import random
my_list = [a.foo, a.boo, a.noo]
rand = random.choice(my_list)
if rand.__name__ == 'noo':
rand(arg)
else:
rand()