如何从具有不同参数的方法列表中随机选择方法?

时间:2018-11-07 10:30:27

标签: python random

我有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的方式来做呢?

3 个答案:

答案 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()