我正在寻找一种方法来命名表达式中的值,以便在该表达式中多次使用它。由于在表达式中找到了值,因此我无法使用典型的assign语句将其保存为变量。我也希望它的用法与表达式的其余部分功能相同,所以我宁愿不将其分解为单独的函数。
更具体地说,我喜欢理解。列表/字典理解是我最喜欢的Python功能。我试图使用两者来将不受信任的结构的字典强制转换为受信任的结构(所有字段都存在,并且它们的值的类型正确)。没有我想要的东西,它看起来像这样:
{
...
'outer': [{
...
'inner': {
key: {
...
'foo': {
'a': get_foo_from_value(value)['a'],
'b': get_foo_from_value(value)['b'],
...
}
} for key, value in get_inner_from_outer(outer)
}
} for outer in get_outer_from_dictionary(dictionary)]
}
这些函数调用实际上是表达式,但我只想评估get_foo_from_value(value)
一次。理想情况下会有类似的东西:
'foo': {
'a': foo['a'],
'b': foo['b'],
...
} with get_foo_from_value(value) as foo
到目前为止,我提出的选项是单项生成器和lambda表达式。我将把每个例子作为答案包括在内,以便可以单独讨论。
答案 0 :(得分:0)
单项生成器解决方案
这是目前我最喜欢的问题解决方案(我喜欢理解,请记住)。
'foo': next({
'a': foo['a'],
'b': foo['b'],
...
} for foo in [get_foo_from_value(value)])
我喜欢它,因为生成器表达式与表达式中其余的理解相匹配,但我不是next
的忠实粉丝,不得不将get_foo_from_value(value)
括在括号中。
答案 1 :(得分:0)
lambda解决方案
'foo': (lambda foo: {
'a': foo['a'],
'b': foo['b'],
...
})(get_foo_from_value(value))
我觉得这个可能不是那么可读。我也不喜欢创建一个只调用一次的lambda。我喜欢这个名字在它被使用之前出现,但我不喜欢它的名称和价值的分离。