在Python错误处理中使用字典推导式的变量是否安全?
问题解答
这种用法在Python中不安全,且存在k无法指向引发错误的键的情况,具体分版本说明:
Python 3 场景
Python 3的字典(包括列表、集合)推导式会创建独立的局部作用域,循环变量k仅在推导式内部可见。当推导式执行抛出KeyError进入except块时,外层作用域中根本不存在k这个变量,直接使用会触发NameError,完全无法获取到缺失的键。
Python 2 场景
Python 2的推导式循环变量会泄漏到外层作用域,此时k确实会是引发错误的那个键,但这是Python 2的特殊行为,而Python 2早已停止官方维护,依赖这种行为的代码不具备可移植性和可靠性。
正确的写法
想要安全获取缺失的键,应该直接从捕获的KeyError实例中提取信息,示例代码如下:
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: # 从KeyError实例中获取缺失的键 raise KeyError(f'Value: "{e}" missing from config file.') from e
内容的提问来源于stack exchange,提问作者MrChadMWood
相关产品推荐
相关产品推荐

