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

Calling a function with unknown number of parameters Python

我正在尝试读取模糊纯文本规则并将参数传递给 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']。 我想不出一种方法来自动读取文本规则并将其转换为函数调用,您对实现这个目标有什么想法或建议吗?任何帮助将不胜感激。谢谢。

您可以尝试这样的操作:

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。这是一种安全风险,因为用户可以通过这种方式执行代码!!!在使用它之前,您可能会研究如何防止此安全问题。

在 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, 4, 6]
sum_up(l)

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

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

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

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