Python 如何从lambda函数中的变量生成持久值
我有一本关于属性及其极限值的字典。对于包含“max”的属性,限制值为允许的最大值。对于极小值也是如此 我正在尝试创建一个函数字典。每个函数将对照列表属性的限制值检查输入值Python 如何从lambda函数中的变量生成持久值,python,Python,我有一本关于属性及其极限值的字典。对于包含“max”的属性,限制值为允许的最大值。对于极小值也是如此 我正在尝试创建一个函数字典。每个函数将对照列表属性的限制值检查输入值 limits = {'variable1 max': 100, 'variable1 min': 10} check_acceptable = {key: (lambda x: x < lim) if 'max' in key else (lamb
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
问题是dict comprehension中的每个
lambda
只捕获它找到的lim
的最后一个版本,如下所示。我们可以通过对lim
参数执行一些操作来绕过此限制:
limits = {'variable1 max': 100,
'variable1 min': 10}
check_acceptable = {key: (lambda lim: (lambda x: x < lim))(lim) if 'max' in key else
(lambda lim: (lambda x: x > lim))(lim)
for key, lim in limits.items()}
问题-变量
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)
导入工具
定义a小于b(a,b):
返回ab
限制={'variable1 max':100,
“variable1分钟”:10}
如果键else中的“max”,则选中_acceptable={key:functools.partial(a_小于_小于_b,b=lim)
functools.partial(a_大于b,b=lim)
对于键,lim in limits.items()}
#现在,我希望这是真的,因为90<100:
检查是否可接受['variable1 max'](90)
@Raf要对其进行优化,请使用命名函数而不是lambda。这样做的另一个好处是可以更轻松地调试代码,因为它不会被一行代码阻塞。
check_acceptable['variable1 max'](90)
=> True
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)