Python: 帮助将循环 a 中凌乱的 if-elif 语句阶梯转换为用于创建 grpc ssl 证书的字典 switch case

Python: Help converting messy if-elif statement ladder within loop a into dictionary switch case for creating grpc ssl certificates

我在清理我的一些代码时遇到问题。

一般来说,python 代码用于读取两个 json 文件。第一个 json 文件包含每个微服务的地址,第二个 json 文件包含每个服务与之通信的服务列表。这段代码的功能是通过循环这两个 json 文件为每个微服务创建 grpc ssl 证书。

我已经写了代码,但是我使用了 if 语句,它非常混乱,但我正在努力使用字典来清理代码。

下面我将列出我上面描述的两个 json 的示例:

ServicesAddresses.json

[
  {
    "service":"service-A",
    "address": ["localhost1"]
  },
  {
    "service":"service-B",
    "address": ["localhost2"]
  },
]

ServicesUsed.json

[
  {
    "service":"service-A",
    "services_used": ["service-B", "service-C"]
  },
  {
    "service":"service-B",
    "services_used": ["service-C", "service-D"]
  },
]

我将分享我用来循环第一个 json 并将地址分配给下面变量的代码

for address in addressData:
    if address["service"] == "service-A":
        addresses.serviceA = address["address"]
    elif address["service"] == "service-B":
        addresses.serviceB = address["address"]

最后,我将分享用于循环第二个 json 并使用名为 cert_create 的函数生成 ssl 证书的代码,该函数具有每个服务地址的输入

for service in runningData:
    if service["service"] == "service-A" and service["services_used"] == ["service-B", "service-C"]:
        os.chdir('/certs/service-A/service-B')
        cert_create(str(addresses.serviceA))
        os.chdir('/certs/service-A/service-C')
        cert_create(str(addresses.serviceA))

    elif service["service"] == "service-B" and service["services_used"] == ["service-C", "service-D"]:
        os.chdir('/certs/service-B/service-C')
        cert_create(str(addresses.serviceB))
        os.chdir('/certs/service-B/service-D')
        cert_create(str(addresses.serviceB))

如您所见,对于大量服务,此逻辑可能会变得相当怪异。问题是,以我对 python 的有限经验,我看不出如何使用字典创建 switch 语句来简化此逻辑,同时保留与 if 语句相同数量的赋值和函数。

有什么想法吗?我知道这是非常基本的,但我觉得如果使用不同的语言,比如 go 或 java 我本可以使这段代码更清晰

也许您需要一些额外的数据结构(如下面的字典)或修改现有的 addresses 对象,以便您可以通过名称获取地址。 当然,如果您的地址数据来自用户输入,请考虑 sanitizing/checking。

services_addresses = {
    'service-A': str(addresses.serviceA),
    'service-B': str(addresses.serviceB),
    'service-C': str(addresses.serviceC),
}

for service in runningData:
    service_name = service["service"]
    for service_name_used in service["services_used"]:
        os.chdir(f'/certs/{service_name}/{service_name_used}')
        # here comes the difference - you need additional dict
        cert_create( services_addresses[service_name] )
        # or modification of addresses object ?..
        # cert_create( addresses.getServiceAddress(service_name) )
import os

running_data = [
  {
    "service":"service-A",
    "services_used": ["service-B", "service-C"]
  },
  {
    "service":"service-B",
    "services_used": ["service-C", "service-D"]
  },
]

address_data = [
  {
    "service":"service-A",
    "address": ["localhost1"]
  },
  {
    "service":"service-B",
    "address": ["localhost2"]
  },
]

def get_service_address(service):
    return [i.get("address")[0] for i in address_data if i.get("service") == service][0]

for data in running_data:
    service = data.get("service")
    used = data.get("services_used")
    if service is None or used is None:
        raise ValueError("Missing information")
    for u in used:
        print(os.path.join("certs", service, u))
        print(get_service_address(service))

当然用 os.chdir 和 create_cert

替换印刷品