问题
想象两个服务在运行:
服务1有两种状态:ACTIVE/INACTIVE
服务2有两种状态:RUNNING/TERMINATED
我们想做一个简单的状态比较:
service1_status = get_service2_status()
service2_status = get_service2_status()
if service1_status == service2_status:
// They match!
else:
// They don't match!
工作解决方案
当然,这是一项相对简单的任务。一个可行的解决方案是这样的:
service1_status = get_service2_status()
service2_status = get_service2_status()
if service1_status == 'ACTIVE' and service2_status == 'RUNNING':
return "They match!"
elif service1_status == 'INACTIVE' and service2_status == 'TERMINATED':
return "They match!"
else:
return "They don't match!"
问题-但更困难
现在想象一下这个例子,每个服务有一百种不同的状态,而不是两种。
if的声明将是压倒性的。我正在寻找一种更优雅的编程方式。例如:
matching_tuples = [('x1', 'y1'), ('x2', 'y2'), ..., ('x100', 'y100')]
service1_status = get_service2_status()
service2_status = get_service2_status()
if (service1_status, service2_status) in matching_tuples:
return "They match!"
elif:
return "They don't match!"
这很好用。不过,我想知道是否有一种更好、更像蟒蛇、更优雅的方式可以将两根绳子结合在一起并进行比较。
决定一个基线服务并将其状态映射到另一个:
service1_status = get_service2_status()
service2_status = get_service2_status()
mapping = {"ACTIVE": "RUNNING", "INACTIVE": "TERMINATED"}
if mapping[service1_status] == service2_status:
return "They match!"
else:
return "They don't match!"
如果service1的状态可能没有映射,您可以选择其中一个:
升高
KeyError
(如上所述,使用mapping[service1_status]
(。通过使用CCD_ 5来消除错误;没有匹配";。
捕获错误并将其重新引发为一条信息性调试消息:
try: match = mapping[service1_status] == service2_status except KeyError: raise KeyError(f"The status {service1_status} of service1 is not mapped to any status in service2")
根据您的实际输入,您可能不需要手动构建dict:
如果您已经有了类似于您提供的
matching_tuples
的东西,您可以直接将其传递给dict构造函数-mapping = dict(matching_tuples)
。如果您有两个匹配的状态列表,您可以执行
mapping = dict(zip(statuses1, statuses2))
(注意,基本上是matching_tuples = list(zip(statuses1, statuses2))
(
我还必须从后端和前端映射密钥
对于映射,我通常使用dictionary
,您可以像这样添加任意数量的密钥。
MapService1to2 = {
"ACTIVE": "RUNNING",
"INACTIVE": "TERMINATED"
}
service1_status = get_service2_status()
service2_status = get_service2_status()
if MapService1to2[service1_status] == service2_status:
print("They match")
else:
print("They don't match")