调用参数数量未知的函数Python

问题描述

我试图读取Fuzzy纯文本规则,并将参数传递给SciKit-Fuzzy函数调用以创建模糊规则。 例如,如果我阅读以下文本规则:

IF service IS poor OR food IS rancid THEN tip IS cheap

然后函数调用将是:

ctrl.Rule(service ['poor'] | food ['rancid '],tip ['cheap'])

如果文本规则为:

IF service IS good THEN tip IS average; 

然后函数调用将是:

ctrl.Rule(service ['good '],tip ['average'])

由于每个规则可以有无限数量的输入变量,例如用户还可以说:

IF service IS good AND food IS good AND mood IS happy THEN tip IS high

,其中包含3个输入变量service['good']food['good']mood['happy'],以及1个输出变量tip['high']。 我想不出一种自动读取文本规则并将其转换为函数调用方法,您对实现此目标有任何想法或建议吗?任何帮助将不胜感激。谢谢。

解决方法

在python中,我们可以使用星号表示法将未知数量的参数传递给函数。

让我们尝试创建带有未知数量参数的函数sum_up()

def sum_up(*args):
    s = 0
    for i in args:
        s += i
    return s

如您所见,前面带有星号的参数将在args元组中收集该函数的所有参数。

我们可以这样调用此函数:

sum_up(5,4,6)  # Gives 15

但是,如果我们想对列表中的元素进行汇总,则需要将其作为参数传递给函数...

我们可以尝试以下操作:

l = [5,6]
sum_up(l)

这不会产生我们需要的效果:args中的sum_up看起来像([5,6],)。 要执行我们想要的操作,我们需要在传递的参数前加一个星号:

sum_up(*l)  # Becomes sum_up(5,6)

您需要做的就是收集要传递到列表中的所有参数,然后在此列表作为调用内的参数传递之前放置一个星号:

args = [service ['good '],tip ['average']]
ctrl.Rule(*args)
,

您可以尝试这样的事情:

string_input = "IF service IS poor OR food IS rancid THEN tip IS cheap"
string_input = string_input.replace(" THEN ",'"],').replace(' IS ','["').strip("IF ").replace(" OR ",'"] | ') +'"]'
eval('ctrl.Rule({})'.format(string_input))

但是要警告您,评估eval时要非常小心。由于用户可以以这种方式执行代码,因此存在安全隐患!!!在使用此功能之前,您可能需要研究如何防止此安全问题。