编写干净的代码:在 Pyramid 中嵌套 For/If/Elif
Writing clean code: Nested For/If/Elif in Pyramid
目标:
尝试打印 未决结果 (Assessment.name
,例如 'Becoming a Leader'
、'Something Else'
等...——打印用户在 all_assessments
) and completed results(assessment.name
from Assessment_Results.assessment.name
, e.g. 'Becoming a Leader'
--print what a user has completed as shown in user_results
) 使用带有必要条件的干净快速的 for 循环。
问题:
当前代码未实现上述目标。
非常感谢任何建议!我还是个新手,所以真的欢迎任何指导!
Views.py
def view_assessments(request):
owner = authenticated_userid(request)
print 'login owner', owner
if owner is None:
raise HTTPForbidden()
all_assessments = api.retrieve_assessments()
print 'these are all the assessments:', all_assessments
print 'and type:', type(all_assessments)
all_results = api.retrieve_assessment_results() # all the assessment results in a list
for x in all_assessments:
alls = x.name
if alls is not None:
for x in all_results: #found user based on all results
assessment = x.assessment.name
user = x.owner.username
if user == owner:
print 'completed', assessment
elif assessment != alls: # DOES NOT WORK
alls.index(assessment)
return {'assessments': all_assessments, 'assessment_results': all_results, 'loggedin': owner, 'user_results': user_results}
api 功能的细分:
目前 all_assessments
打印出所有现有评估名称和文本的列表。
all_assessments = [<Assessment(name='Becoming a Leader', text='better decisions')>, <Assessment(name='Good work', text='working on these skills')>, <Assessment(name='Teaching NTS', text='Series 1.1')>]
while all_results
打印出列表中每个用户的所有结果。此处显示:
all_results [<Assessment_Result(owner='<User(username ='baseball', password='...', firstname ='Jenny', lastname ='Jen', email='dance@aol.com')>', assessment='<Assessment(name='Becoming a Leader', text='better decisions')>')>, <Assessment_Result(owner='<User(username ='donald', password='...', firstname ='Drew', lastname ='James', email='cool@gmail.com')>', assessment='<Assessment(name='Good work', text='working on these skills')>')>]
最后,user_results
打印通过用户名找到的结果(基于登录的人)。
retrieved by username: [<Assessment_Result(owner='<User(username ='dorisday', password='..', firstname ='Doris', lastname ='Day', email='dorisday@gmail.com')>', assessment='<Assessment(name='Becoming a Leader', text='better decisions')>')>, <Assessment_Result(owner='<User(username ='dorisday', password='..', firstname ='Doris', lastname ='Day', email='dorisday@gmail.com')>', assessment='<Assessment(name='Good work', text='working on these skills')>')>]
我会从这样的事情开始:
def view_assessments(request):
logged_in_userid = authenticated_userid(request)
if logged_in_userid is None:
raise HTTPForbidden()
all_assessments = api.retrieve_assessments()
all_results = api.retrieve_assessment_results()
completed_assessments = []
pending_assessments = []
for assessment in all_assessments:
if assessment.name is None:
continue
found_assessment_result = False
for result in all_results:
if result.owner.username == logged_in_userid and result.assessment == assessment:
found_assessment_result = True
break # no need to check further
if found_assessment_result:
compleded_assessments.append(assessment)
else:
pending_assessments.append(assessment)
return {'completed_assessments': completed_assessments, 'pending_assessments': pending_assessments, 'loggedin': owner, 'user_results': user_results}
这里的诀窍是,当遍历两个嵌套列表时,有一个 "found" 布尔值,在进入内部循环之前将其设置为 False - 内部循环完成后,您可以检查变量,并且,根据其价值,将评估推入两个列表之一。
如您所料,此代码可能效率很低,因为它必须迭代所有评估和所有结果的乘积,因此如果您有 10 个评估和 10 个结果,则需要 100 次迭代,但是如果您有 100 次评估和 100 次结果,它将是 10.000 次迭代。但它会作为一个学习练习。
目标:
尝试打印 未决结果 (Assessment.name
,例如 'Becoming a Leader'
、'Something Else'
等...——打印用户在 all_assessments
) and completed results(assessment.name
from Assessment_Results.assessment.name
, e.g. 'Becoming a Leader'
--print what a user has completed as shown in user_results
) 使用带有必要条件的干净快速的 for 循环。
问题: 当前代码未实现上述目标。
非常感谢任何建议!我还是个新手,所以真的欢迎任何指导!
Views.py
def view_assessments(request):
owner = authenticated_userid(request)
print 'login owner', owner
if owner is None:
raise HTTPForbidden()
all_assessments = api.retrieve_assessments()
print 'these are all the assessments:', all_assessments
print 'and type:', type(all_assessments)
all_results = api.retrieve_assessment_results() # all the assessment results in a list
for x in all_assessments:
alls = x.name
if alls is not None:
for x in all_results: #found user based on all results
assessment = x.assessment.name
user = x.owner.username
if user == owner:
print 'completed', assessment
elif assessment != alls: # DOES NOT WORK
alls.index(assessment)
return {'assessments': all_assessments, 'assessment_results': all_results, 'loggedin': owner, 'user_results': user_results}
api 功能的细分:
目前 all_assessments
打印出所有现有评估名称和文本的列表。
all_assessments = [<Assessment(name='Becoming a Leader', text='better decisions')>, <Assessment(name='Good work', text='working on these skills')>, <Assessment(name='Teaching NTS', text='Series 1.1')>]
while all_results
打印出列表中每个用户的所有结果。此处显示:
all_results [<Assessment_Result(owner='<User(username ='baseball', password='...', firstname ='Jenny', lastname ='Jen', email='dance@aol.com')>', assessment='<Assessment(name='Becoming a Leader', text='better decisions')>')>, <Assessment_Result(owner='<User(username ='donald', password='...', firstname ='Drew', lastname ='James', email='cool@gmail.com')>', assessment='<Assessment(name='Good work', text='working on these skills')>')>]
最后,user_results
打印通过用户名找到的结果(基于登录的人)。
retrieved by username: [<Assessment_Result(owner='<User(username ='dorisday', password='..', firstname ='Doris', lastname ='Day', email='dorisday@gmail.com')>', assessment='<Assessment(name='Becoming a Leader', text='better decisions')>')>, <Assessment_Result(owner='<User(username ='dorisday', password='..', firstname ='Doris', lastname ='Day', email='dorisday@gmail.com')>', assessment='<Assessment(name='Good work', text='working on these skills')>')>]
我会从这样的事情开始:
def view_assessments(request):
logged_in_userid = authenticated_userid(request)
if logged_in_userid is None:
raise HTTPForbidden()
all_assessments = api.retrieve_assessments()
all_results = api.retrieve_assessment_results()
completed_assessments = []
pending_assessments = []
for assessment in all_assessments:
if assessment.name is None:
continue
found_assessment_result = False
for result in all_results:
if result.owner.username == logged_in_userid and result.assessment == assessment:
found_assessment_result = True
break # no need to check further
if found_assessment_result:
compleded_assessments.append(assessment)
else:
pending_assessments.append(assessment)
return {'completed_assessments': completed_assessments, 'pending_assessments': pending_assessments, 'loggedin': owner, 'user_results': user_results}
这里的诀窍是,当遍历两个嵌套列表时,有一个 "found" 布尔值,在进入内部循环之前将其设置为 False - 内部循环完成后,您可以检查变量,并且,根据其价值,将评估推入两个列表之一。
如您所料,此代码可能效率很低,因为它必须迭代所有评估和所有结果的乘积,因此如果您有 10 个评估和 10 个结果,则需要 100 次迭代,但是如果您有 100 次评估和 100 次结果,它将是 10.000 次迭代。但它会作为一个学习练习。