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
替换印刷品
我在清理我的一些代码时遇到问题。
一般来说,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
替换印刷品