考虑以下示例:
config_parameters = ['PARAM1', 'PARAM2', 'PARAM3']
sample_config = {
'PARAM1': 'Value1',
'PARAM2': 'Value2'
}
try:
# Collects param values from the sample config
config = {k: sample_config[k] for k in config_parameters}
except KeyError as e:
# Tries using comprehension var `k` to advise which variable was missing
raise KeyError(f'Value: "{k}" missing from config file.')
Run Code Online (Sandbox Code Playgroud)
在错误处理中,它尝试捕获使用字典理解的严格字典查找步骤中出现的关键错误。对于任何捕获的错误,它会尝试利用在字典理解期间分配的变量。
这对于 Python 来说是否被认为是安全的,或者是否有任何理由预期它k可能不会指示导致错误的相同值?
推导式中定义的变量被视为推导式的本地变量,因此k不能在显示之外使用dict。(这是 Python 3 中为防止此类泄漏而进行的更改。)
然而,赋值表达式被专门定义为允许从该匿名命名空间“提取”值。(参见https://peps.python.org/pep-0572/#scope-of-the-target)
try:
# Collects param values from env vars
config = {k: sample_config[(offending_key := k)] for k in config_parameters}
except KeyError:
raise KeyError(f'Value: "{offending_key}" missing from config file.')
Run Code Online (Sandbox Code Playgroud)
k对于理解而言是局部的;offending_key对于包含推导式的任何范围来说都是本地的。
| 归档时间: |
|
| 查看次数: |
47 次 |
| 最近记录: |