调用参数数量未知的函数 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)
我正在尝试读取模糊纯文本规则并将参数传递给 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)