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

Posted

技术标签:

【中文标题】调用具有未知数量参数Python的函数【英文标题】:Calling a function with unknown number of parameters Python 【发布时间】:2020-12-06 01:16:44 【问题描述】:

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

【问题讨论】:

这能回答你的问题吗? Mini-languages in Python 【参考方案1】:

在 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)

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

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

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

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

【讨论】:

【参考方案2】:

你可以试试这样的:

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

【讨论】:

这个eval()函数可以完美解决我的问题。谢谢 很高兴我能提供帮助,但如前所述,如果您考虑用户会编写该输入,请注意潜在的安全问题!快乐编码!

以上是关于调用具有未知数量参数Python的函数的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的求和函数,参数和类型数量未知

Javascript未知数量的参数

PHP - 具有未知数量参数的安全 PDO 准备语句

调用具有不同数量参数的 cdecl 函数

在Python中拆分具有未知数量空格的字符串作为分隔符

Python C++ API - 具有可变数量参数的重载函数