调用具有未知数量参数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)
这不会产生我们需要的效果:args
的 sum_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的函数的主要内容,如果未能解决你的问题,请参考以下文章