如何从 lambda 函数中的变量生成持久值

Raf*_*Raf 5 python

我有一本属性及其极限值的字典。对于包含“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)