2014-03-26 3 views
-2
def taskCompletionCheck(self, jsonFile): 

     json_data=open(jsonFile) 
     data = json.load(json_data) 
     json_data.close() 
     wsTaskStatus = {} 
     taskstatus = {} 
     mydict = {} 

     ''' Assuming the json file structure is similar to 
     {"tasks": 
      [{"name":"SA","result":"PASS"}, 
      {"name":"CR","result":"PASS"}, 
      {"name":"UT","result":"fail"}], 
     "masks":{"id":"valore"}, 
     "om_points":"value", 
     "parameters":{"id":"valore"}} 
     ''' 
     for item in data: 
      keyExists = data[item].get("auto-approve-plugin-status") 

      if keyExists != None: 
       for elem in data[item]["auto-approve-plugin-status"] : 
        mylist = elem["auto-approve-enclosure-names"] 

        mydict["status"] = elem["auto-approve-status"] 
        mydict["enclosure-names"] = mylist 
        taskid = elem["auto-approve-plugin-name"]+"_"+item 
        taskstatus[taskid] = mydict 
     print taskstatus 
     return taskstatus 

전역 범위 (for 루프 외부)에서 mydict를 선언하면 taskstatus에는 mylist 값이 포함되지 않고 enclosure-names에는 o 만 포함됩니다. 나중에 루프 내에서 mydict를 움직 였고 정상적으로 작동했습니다. 아무도 나에게 여기서 일어난 일을 설명 할 수 있니?파이썬에서 사전의 범위

원래 버전에서
{"CR" : {"status" : "fail" , "enclosure-names" : [a,b,c]}, 
    "UT" : {"status" : "pass" , "enclosure-names" : [d,e]}} 
+0

이 코드는 유효하지 않습니다. return 문은 있지만 작동하지 않습니다. 나는 당신에게 문제를주는 정확한 코드를 별도의 파일에 복사하고 코드의 나머지 부분과 독립적으로 실행되도록하는 것이 좋습니다. 실행되면 질문에 다시 복사하십시오. –

답변

2

,이 코드 :

if keyExists != None: 
        for elem in data[item]["auto-approve-plugin-status"] : 
         mydict = {} 
         mylist = elem["auto-approve-enclosure-names"] 

         mydict["status"] = elem["auto-approve-status"] 
         mydict["enclosure-names"] = mylist 
         taskid = elem["auto-approve-plugin-name"]+"_"+item 
         taskstatus[taskid] = mydict 

이 taskstatus의 모습 어떻게

mydict["status"] = elem["auto-approve-status"] 
mydict["enclosure-names"] = mylist 

루프를 때마다, 당신은 같은를 재사용하는 mydict, 매번 이전 루프에 넣은 내용을 덮어 씁니다.

루프 내에 mydict = {}을 추가하면 루프를 통과 할 때마다 새로운 별도의 사전이 만들어지고 다시 사용하거나 덮어 쓰지 않고 제대로 작동합니다.

+0

예, 바깥 쪽을 선언하는 것이 버그라는 것을 알지만, 정당한 가치를 부여해야합니다. 왜 나에게 모두 0을주는거야? – user892871

+0

@ user892871 오, 알겠습니다. 나는 말할 수 없다. taskstatus가 어떻게 보일지에 대한 견적에 오타가 있습니다 : ""enclosre-names "'. 오, 어디 있었 니? 어떻게 인쇄/열람 했습니까? 얼마나 많이 있었고, 어떤 패턴 이었습니까? – TessellatingHeckler

+0

흠. 승인. 내 코드를 편집했습니다. 나는 그것을 반환하기 바로 전에 taskstatus를 인쇄하고있었습니다. 이 방법으로 인쇄합니다. { "CR": { "status": "fail", "enclosure-names": [0]}, "UT": { "status": "pass", "enclosure- names ": [0]}} – user892871

관련 문제