我有一本属性及其极限值的字典。对于包含“max”的属性,限制值为允许的最大值。对于最小值也是如此。
我正在尝试创建一个函数字典。每个函数都会根据列表属性的限制值检查输入值。
limits = {'variable1 max': 100,
'variable1 min': 10}
check_acceptable = {key: (lambda x: x < lim) if 'max' in key else
(lambda x: x > lim)
for key, lim in limits.items()}
# Now, I'd expect this to be True, since 90 < 100:
check_acceptable['variable1 max'](90)
Out: False
Run Code Online (Sandbox Code Playgroud)
这里发生的事情是 lambda 函数被分配了变量lim,并且在 for 循环中,lim最后一个值为 10,那么我的第一个 lambda 函数是错误的。
我该如何解决这个问题?
--- 编辑 - 添加相同行为的更通用示例:
funcs = []
for i in range(5):
funcs.append(lambda _: i)
for j in range(5):
print(funcs[j](j), end='')
# Expected: 01234
Out: 44444
Run Code Online (Sandbox Code Playgroud)
小智 3
问题 - 变量lim没有“存储”在 lambda 中,因此两个 lambda 都将参数与 进行比较10。
可能的解决方案:
import functools
def a_less_than_b(a,b):
return a < b
def a_greater_than_b(a,b):
return a > b
limits = {'variable1 max': 100,
'variable1 min': 10}
check_acceptable = {key: functools.partial(a_less_than_b, b=lim) if 'max' in key else
functools.partial(a_greater_than_b, b=lim)
for key, lim in limits.items()}
# Now, I'd expect this to be True, since 90 < 100:
check_acceptable['variable1 max'](90)
Run Code Online (Sandbox Code Playgroud)