映射两个不同字符串并将其作为一个字符串的最具Python风格的方法是什么



问题

想象两个服务在运行:

服务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的状态可能没有映射,您可以选择其中一个:

  1. 升高KeyError(如上所述,使用mapping[service1_status](。

  2. 通过使用CCD_ 5来消除错误;没有匹配";。

  3. 捕获错误并将其重新引发为一条信息性调试消息:

    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")

最新更新