重构此功能以将其认知复杂度从17降低到15 ...如何重构?

时间:2019-09-30 10:39:02

标签: redundancy

如何将认知复杂度从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)

0 个答案:

没有答案