Python локальная область действия в случае проблемы блока - PullRequest
0 голосов
/ 03 февраля 2020
import re
def get_version_from_string(text):
    pattern = re.compile("^(\d+\.)*[0-9]{1,5}")
    match = pattern.match(text)
    return str(match.group(0))

findings = [
    {
        "attributes": [            
            {
                "key": "BENCHMARK_RULE_ID",
                "value": "0.0.0 Ensure permissions"
            }
            {
                "key": "INSTANCE_ID",
                "value": "i-6e0"
            }
        ]
    },
    {
        "attributes": [           
            {
                "key": "BENCHMARK_RULE_ID",
                "value": "0.0.1 Ensure That files"
            }
            {
                "key": "INSTANCE_ID",
                "value": "i-6e0"
            }
        ]
    },
    {
        "attributes": [               
            {
                "key": "BENCHMARK_RULE_ID",
                "value": "0.0.2 Ensure successful file"
            }
            {
                "key": "INSTANCE_ID",
                "value": "i-6e0"
            }
        ]
    }
]

non_compliant_instances = {}
cis_id = ""
instance = "dummy_value"
for finding in findings:
    for attribute in finding.get("attributes"):
        if attribute.get("key") == "INSTANCE_ID":
            instance = attribute.get("value")
        if instance not in non_compliant_instances:
            non_compliant_instances[instance] = {"CIS_Violations": [], "CVE_ID": []}
        if attribute.get("key") == "BENCHMARK_RULE_ID":
            cis_id = get_version_from_string(attribute.get("value"))
            non_compliant_instances[instance]["CIS_Violations"].append(cis_id)

# Actual Output:
print(non_compliant_instances)

# Work Around Starts
# Deleting first extra element
extra_cis_id = non_compliant_instances['aws'].get("CIS_Violations")

try:
    del non_compliant_instances['dummy_value']
except:
    print('No dummy_value found')

for ncinstance in non_compliant_instances.keys():
    set1 = set(non_compliant_instances.get(ncinstance).get('CIS_Violations'))
    set1.add(extra_cis_id[0])
    non_compliant_instances[ncinstance]["CIS_Violations"] = sorted(set1) 
# Work Around Ends

# Required Output:
print(non_compliant_instances)

Фактический вывод:

{{'dummy_value': {'CIS_Violations': ['0.0.0'], 'CVE_ID': []}, 'i-6e0': { 'CIS_Violations': ['0.0.1', '0.0.2'], 'CVE_ID': []}}

Требуемый вывод:

{'i-6e0': {' CIS_Violations ': [' 0.0.0 ',' 0.0.1 ',' 0.0.2 '],' CVE_ID ': []}}

Это происходит потому, что значение установлено в instance переменная по

if attribute.get("key") == "INSTANCE_ID":
            instance = attribute.get("value")

является локальной по отношению к этому, если блок

, только если можно было объявить экземпляр переменной как stati c без OOPS ....

...