15

在 Python 指南关于项目结构的章节中,“顶级语句”一词被多次提及。我不确定这到底指的是什么。我的猜测是,在加载模块后立即触发的任何函数或类方法之外发生的任何变量声明。这个对吗?它是否还包括模块的import语句?

4

3 回答 3

32

这不仅仅是变量声明(无论如何也没有任何变量声明)。它几乎是任何从缩进级别 0 开始的东西。

import sys         # top-level

3 + 4              # top-level

x = 0              # top-level

def f():           # top-level
    import os      # not top-level!
    return 3       # not top-level

if x:              # top-level
    print 3        # not top-level
else:
    print 4        # not top-level, but executes as part of an if statement
                   # that is top-level

class TopLevel(object): # top-level
    x = 3          # not top-level, but executes as part of the class statement
    def foo(self): # not top-level, but executes as part of the class statement
        print 5    # not top-level
于 2013-08-09T00:04:30.587 回答
3

这是第一次提到“顶级声明”:

一旦找到 modu.py,Python 解释器将在隔离范围内执行该模块。将执行 modu.py 中的任何顶级语句,包括其他导入(如果有)。函数和类定义存储在模块的字典中。

这清楚地表明它们的真正含义是“在import时间上被解释的事物”。

虽然它直接没有太大帮助,但Python 文档本身也使用了“顶级”一词(组件,在此上下文中表示“语句”)。

请注意,此模块:

"""a python module, spam.py"""

def spam():
    return "spam"

class Spam(object):
    pass

其中有两个语句, thedef和 the class。这些都是在导入时执行的。这些定义是复合语句(见defclass描述)。如果有装饰器附加到顶级def,那将添加更多顶级的东西来运行。(另请参阅user2357112 的回答:运行class语句会调用更多内部工作。)

在顶部添加一个import sys,您就添加了第三条语句,即导入sys. 但是,如果你添加这个:

def ham(eggs):
    import os
    return os.path.basename(eggs)

您仍然只向def ham顶级内容添加了一个语句, the , 。它将在ham其自身被执行(调用)import os时运行。

于 2013-08-09T00:06:45.403 回答
0

在python中,不缩进的语句称为顶级语句。在内部,python 为顶级语句 s 赋予了一个特殊的名称 as __main__

于 2020-01-01T13:19:28.400 回答