如何将认知复杂度从17降低?如何重构呢? 我有下面的实用程序方法,并且正在使用多个if语句并遇到认知复杂性问题。我浏览了一些链接,但是我不明白如何更改代码而不影响此方法的用户
def check_nova_parameter_format(prop, yaml_file):
formats = {
"string": {
"name": re.compile(r"(.+?)_name_\d+$"),
"flavor": re.compile(r"(.+?)_flavor_name$"),
"image": re.compile(r"(.+?)_image_name$"),
},
"comma_delimited_list": {"name": re.compile(r"(.+?)_names$")},
}
with open(yaml_file) as fh:
yml = yaml.load(fh)
# skip if resources are not defined
if "resources" not in yml:
pytest.skip("No resources specified in the heat template")
# skip if resources are not defined
if "parameters" not in yml:
pytest.skip("No parameters specified in the heat template")
invalid_parameters = []
for k, v in yml["resources"].items():
if not isinstance(v, dict):
continue
if v.get("type") != "OS::Nova::Server":
continue
prop_val = v.get("properties", {}).get(prop, {})
prop_param = prop_val.get("get_param", "") if isinstance(prop_val, dict) else ""
if not prop_param:
pytest.skip("{} doesn't have property {}".format(k, prop))
elif isinstance(prop_param, list):
prop_param = prop_param[0]
template_param_type = yml.get("parameters", {}).get(prop_param, {}).get("type")
if not template_param_type:
pytest.skip("could not determine param type for {}".format(prop_param))
format_match = formats.get(template_param_type, {}).get(prop)
if not format_match or not format_match.match(prop_param):
msg = (
"Invalid parameter format ({}) on Resource ID ({}) property" " ({})"
).format(prop_param, k, prop)
invalid_parameters.append(msg)