首页 > 解决方案 > 检查字典键以确保始终存在所需的键,并且字典除了定义的一组名称之外没有其他键名

问题描述

我在python中有一个遵循这种通用格式的字典:

{'field': ['$.name'], 'group': 'name', 'function': 'some_function'}

我想对字典进行一些预检查,以确保“字段”始终存在,并且除了“组”和“功能”之外不再存在键,这两个键都是可选的。

我知道我可以通过使用冗长而不整洁的 if 语句来做到这一点,但我认为必须有一种更清洁的方式?

这是我目前拥有的:

if (('field' in dict_name and len(dict_name.keys()) == 1) or 
    ('group' in dict_name and len(dict_name.keys()) == 2) or 
    ('function' in dict_name and len(dict_name.keys()) == 2) or 
    ('group' in dict_name and 'function' in dict_name and len(dict_name.keys()) == 3))

本质上,我首先检查“字段”是否存在,因为这是必需的。然后我正在检查它是否是唯一的键(这很好),或者它是否是“组”旁边的键而没有其他键,或者是“功能”旁边的键而没有其他键,或者是“组”旁边的键和“功能”,没有其他。

是否有更简洁的方法来检查提供的键只有这 3 个键,其中两个是可选的?

标签: pythondictionary

解决方案


就我而言,你想检查一下,

  1. 该集合{'field'}始终包含在您的 dict 键集合中
  2. 您的 dict 键集合始终包含在集合中{'field', 'group', 'function'}

所以只需编码!

required_fields = {'field'}
allowed_fields = required_fields | {'group', 'function'}

d = {'field': 123}  # Set any value here

if required_fields <= d.keys() <= allowed_fields:
    print("Yes!")
else:
    print("No!")

除非您有一些特殊条件(例如,互斥键),否则此解决方案对于任何必填和允许的字段集都是可扩展的

(感谢@Duncan 进行了非常优雅的代码缩减)


推荐阅读