if块问题中的Python局部作用域

if块问题中的Python局部作用域,python,dictionary,scope,Python,Dictionary,Scope,实际产出为: {{'dummy_value':{'CIS_违规行为':['0.0.0'],'CVE_ID':[]},'i-6e0':{'CIS_违规行为':['0.0.1','0.0.2'],'CVE_ID':[]} 所需输出: {'i-6e0':{'CIS_违规行为':['0.0.0','0.0.1','0.0.2'],'CVE_ID':[]} 之所以会发生这种情况,是因为 import re def get_version_from_string(text): pattern = r

实际产出为:

{{'dummy_value':{'CIS_违规行为':['0.0.0'],'CVE_ID':[]},'i-6e0':{'CIS_违规行为':['0.0.1','0.0.2'],'CVE_ID':[]}

所需输出:

{'i-6e0':{'CIS_违规行为':['0.0.0','0.0.1','0.0.2'],'CVE_ID':[]}

之所以会发生这种情况,是因为

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)
是该if块的本地


仅当可以在没有OOPS的情况下将变量实例声明为静态时…

“是该if块的局部”代码块不会在Python中创建作用域。Python作用域是模块、类和函数。我真的不知道你在问什么。你能提供一个你所看到的、你没有预料到的行为的例子吗?这些代码中的大部分可能不必演示任何让你困惑的行为。问题恰恰相反:
实例
不是
if
语句的局部,但是如果
if
语句没有执行,
实例
从来没有定义过,period.@juanpa.arrivillaga这是任何人重现问题的最小代码。我得到了我想要的输出,这是由于代码的改进。我只想要一个能给出相同结果的逻辑需要的输出没有难看的解决方法…@chepner是的,你是对的,但正如你从发现列表变量中看到的,第一个if条件始终为true,因此实例变量被定义。有没有办法让if块内获得的值在if块外可访问…它在
if块外可用
block。但是在循环中,您将在有机会设置
实例的值之前处理
基准规则\u ID
。这不是范围问题。
if attribute.get("key") == "INSTANCE_ID":
            instance = attribute.get("value")