Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从lambda函数中的变量生成持久值_Python - Fatal编程技术网

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

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

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

问题是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)