我有一个结构正常的Python程序,它包含import语句,类定义,其他例程,以及一些调用类中方法的“main”语句(按此顺序)。导入后打印声明“ok”
Python 2.7.2
我在类方法中得到一个nameError。
print >> common, ...
NameError: 'common' is not defined
common
之前在同一方法中使用过,但之前的引用没有出现任何错误。
common
在许多方法中使用 - 从物理上移动此方法无效:此方法中的错误仍然在同一行。
在调用方法之前,以及在执行任何“main”语句之前发生错误。将return作为方法中的第一个可执行语句无效。这显然发生在课程定义时间。
如果我注释掉print >> common
语句,我会在同一方法中得到不同的NameError。
我不知道如何在'定义时'在方法内部获取NameError。
有什么想法吗?方法如下:
下面的x = z ** 2 假设生成一个NameError:没有z。 紧接着所有函数定义之后的print语句。
"""code below"""
@classmethod
def show_role_map(cls):
"""show jobs within roles, with total days, with percents of totals"""
return
raise ZeroDivisionError
return
print >> common, "xyzzy"
x = z ** 2
p = Performance("Traveler: show_role_map")
print "\tshow_role_map"
roles = cls.role_map.keys()
roles.sort()
header ("Qualitative Role Map")
role_totals = collections.defaultdict(float)
job_totals = collections.defaultdict(float)
for name in Traveler.roster:
trav = Traveler.roster[name]
for day in trav.roles:
frac = 1.0 / len(trav.roles[day])
for role in trav.roles[day]:
role_totals[role] += frac
for day in trav.jobs:
frac = 1.0 / len(trav.jobs[day])
for job in trav.jobs[day]:
job_totals[job] += frac
role_total = sum(role_totals.values())
job_total = sum(job_totals.values())
assert abs(role_total - job_total) <= 1e-6
print >> common, "Total Role days =", role_total
print >> common, "Total Job days =", job_total
print >> common
for role in roles:
if role_totals[role] == 0: continue
print >> common, "\t%12s %51.1f %12s %12.3f" %\
(role, role_totals[role], \
"", 100.0 * role_totals[role] / role_total)
jobs = list(cls.role_map[role])
jobs.sort (key = lambda x: (job_totals[x], x), reverse = True)
for index, job in enumerate(jobs, 1):
if job_totals[job] == 0: continue
print role, job, role_totals[role], job_totals[job]
print >> common, "\t\t%6d. %35s %12.1f % 12.3f %12.3f" % \
(index, job, job_totals[job], \
100.0 * job_totals[job] / role_totals[role],
100.0 * job_totals[job] / role_total)
print >> common
print >> common, "\n", "_" * 60, "\n" #--ERROR OCCURS FOR THIS LINE ****************
print >> common, "\nRoles in Total Tripday order\n"
roles = role_totals.keys()
roles.sort (order = lambda x: (role_totals[x], x), reverse = True)
for index, role, in enumerate(roles,1):
print >> common, "%6d. %15s %12.1f %12.3f" % \
(index, role, role_totals[role], \
100.0 * role_totals[role]/role_total)
print >> common, "\n", "_" * 60, "\n"
print >> common, "\nDetailed Trip Roles in Total Tripday order"
jobs = job_totals.keys()
jobs.sort (key = lambda x: (job_totals[x], x), reverse = True)
for index, job in jobs:
print >> common, "%6d. %35s %12.1f %12.3f" % \
(index, job, job_totals[job], 100.0 * job_totals[job] / job_total)
p.close()
答案 0 :(得分:1)
首先是第一件事。定义函数时,不执行该函数。命名空间中只记录名称。只有当函数被调用(也称为调用)时,它是否实际执行函数内的代码(假设您没有语法错误,这是正确的。)
所以解释器处理你的导入等(在文件的顶部),然后注意到你有一个函数(所以它注明了它的名字)并继续执行其余的代码(函数定义之后的东西) 。在这一点上,它看到了print >> common
。由于common
不在内存堆栈上(之前从未定义过),因此解释器不知道它的值是什么,因此会引发NameError
。
请注意,调用函数时仍会发生这种情况,因为它在定义之前也会使用common
。
希望这有帮助
答案 1 :(得分:0)
缩进错误。问题陈述没有在其函数中缩进,因此似乎是Python作为在类定义时执行的语句。
感谢所有试图提供帮助的人。