python - 检查字典键以确保始终存在所需的键,并且字典除了定义的一组名称之外没有其他键名
问题描述
我在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 个键,其中两个是可选的?
解决方案
就我而言,你想检查一下,
- 该集合
{'field'}
始终包含在您的 dict 键集合中 - 您的 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 进行了非常优雅的代码缩减)
推荐阅读
- c - 如果 C 是行优先顺序,为什么 ARM 内部代码假定列优先顺序?
- php - Laravel 不推荐在对象上使用 array_key_exists()
- python - Binance API Python - 如何使用特定的输出
- mysql - from 子句中的 Laravel 子查询
- java - JPA Criteria API - LIKE / OR 关系
- sas - 试图在 SAS 中转换 Y 轴刻度的刻度值
- python - 快速 Python 算法,用于找到使每次移动的变化之和最大化的路径
- java - R Studio 错误:-(Java):无法初始化类 com.miraisolutions.xlconnect.workbook
- mongodb - 我需要一个简单的解决方案来存储、交付和更新移动应用程序的产品数据
- python - 如何将分离的 tfrecord 数据集:trainX(图像)和 trainY(标签)传递给 model.fit()?