Python模块执行顺序

时间:2013-05-23 14:14:58

标签: python methods nameerror

我有一个结构正常的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()

2 个答案:

答案 0 :(得分:1)

首先是第一件事。定义函数时,不执行该函数。命名空间中只记录名称。只有当函数被调用(也称为调用)时,它是否实际执行函数内的代码(假设您没有语法错误,这是正确的。)

所以解释器处理你的导入等(在文件的顶部),然后注意到你有一个函数(所以它注明了它的名字)并继续执行其余的代码(函数定义之后的东西) 。在这一点上,它看到了print >> common。由于common不在内存堆栈上(之前从未定义过),因此解释器不知道它的值是什么,因此会引发NameError

请注意,调用函数时仍会发生这种情况,因为它在定义之前也会使用common

希望这有帮助

答案 1 :(得分:0)

缩进错误。问题陈述没有在其函数中缩进,因此似乎是Python作为在类定义时执行的语句。

感谢所有试图提供帮助的人。