def create_school(school,year):
all_students = {}
achievements= {}
var = data.Files.get(school,year)
for child in var.student_info_parsed:
for gchild in var.student_info_parsed[child]:
for ggchild in var.student_info_parsed[child][gchild]:
all_students[ggchild[0]] = ggchild
for child in var.student_info:
for gchild in var.student_info[child]:
if gchild == 'localidentifier':
student = var.student_info[child][gchild]
achievements[student] = {}
achievements[student]['certificates'] = []
achievements[student]['otherachievements'] = []
if gchild == 'certificates':
for ggchild in var.student_info[child][gchild]:
cert = var.student_info[child][gchild][ggchild]
cert_year = cert[2][0:4]
if cert_year == year:
achievements[student]['certificates'].append(cert)
if gchild == 'otherachievements':
ocert = var.student_info[child][gchild]
n = 0
while n < len(ocert):
ocert_year = ocert[n][1]
if ocert_year == year:
achievements[student]['otherachievements'].append(ocert[n])
n = n+1
if gchild == 'endorsements':
ecert = var.student_info[child][gchild]
l = list()
for subj in ecert:
if ecert[subj]['courseendorsementresult'] != 'NO':
result = ecert[subj]['courseendorsementresult']
l.append([subj,result])
achievements[student]['endorsements'] = l
return achievements
所以在我添加条件之前
if gchild == 'endorsements':
ecert = var.student_info[child][gchild]
l = list()
for subj in ecert:
if ecert[subj]['courseendorsementresult'] != 'NO':
result = ecert[subj]['courseendorsementresult']
l.append([subj,result])
achievements[student]['endorsements'] = l
一切都在寻找,但现在我收到了错误
File "/Users/Teacher/Documents/Python/Standards/Data_Manipulation_3/data_man.py", line 454, in create_school
achievements[student]['endorsements'] = l
UnboundLocalError: local variable 'student' referenced before assignment
对我来说很奇怪的是,到目前为止我一直在提及“学生”。
我没有名为student的全局变量?
我真的很困惑我认为当全局变量和局部变量之间存在混淆时会发生这些错误,但“学生”变量只是本地变量?
非常感谢任何帮助。
答案 0 :(得分:1)
我认为gchild == 'endorsements'
和gchild == 'localidentifier'
是独占的 - 所以当两个代码块都运行时,不会出现这种情况。您仅在student
块中为if gchild == 'localidentifier':
分配值,因此,如果第一个gchild
值为'endorsements'
,则student
将不会被填充,你最终得到UnboundLocalError。
我不知道您的代码的具体细节,但我想您可能希望使用类似于第一个student
块的if
var填充,如下所示:
student = var.student_info[child][gchild]
或者您可以使用ecert
变量,它似乎与student
具有相同的值:
if gchild == 'endorsements':
ecert = var.student_info[child][gchild]
l = list()
for subj in ecert:
if ecert[subj]['courseendorsementresult'] != 'NO':
result = ecert[subj]['courseendorsementresult']
l.append([subj,result])
achievements[ecert]['endorsements'] = l
答案 1 :(得分:1)
您的变量student
是在前面加if gchild == 'localidentifier'
的块中创建的。如果执行该块,变量student
将可用。但是,如果前面带有if gchild == 'endorsements'
的块在之前执行另一个块(因为gchild=='endorsements'
之前的迭代比gchild=='localidentifier'
),那么变量{{1将不会被创建。
答案 2 :(得分:0)
正如您在以下条件中定义student
:
if gchild == 'localidentifier':
student = var.student_info[child][gchild]
所以在你的第二个陈述if gchild == 'endorsements':
下你没有定义student
。因为你的条件都会检查gchild
的价值,如果有其他事件发生的话,那就不行了!所以你有两个选择