use*_*783 7 python coding-style
在诸如C和C++之类的语言中,通常在其调用者之上定义被调用函数,以避免需要前向声明.例如:
void g() { ... }
void f() { g(); ... }
int main() { f(); ... }
Run Code Online (Sandbox Code Playgroud)
在Python中,如果
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
idiom用在源文件的末尾,前向声明是不必要的,函数的顺序无关紧要.
Python源文件中的函数顺序是否有任何约定?调用函数仍然通常写在调用者之上,反之亦然?
编辑:答案是关于功能顺序没有约定(例如,PEP 8中没有任何内容).甚至标准库中的模块也不一致.
对于静态类型语言,查找其定义以确定对象的类型就足够了.但是,如果定义在使用后出现,则需要两次传递:1)确定此类对象的类型,2)使用当时已知的类型进行编译.如果定义在另一个文件中,那么在传递之前也必须对其进行解析.这是通过要求在使用之前声明对象/类型(告诉编译器存在及其类型)来规避的.这足以编译.实际的定义只是为对象保留空间,并不需要生成实际的代码(大多数) - 这就是声明的用途.(请记住:大多数此类语言允许在适当的地方合并).
在Python中,作为动态类型语言,名称引用的对象(值和类型)(!)可以在控制流实际使用之前随时更改,因此在实际使用之前对其进行验证是没有用的.
考虑以下:
def f():
g()
def g():
pass
f()
Run Code Online (Sandbox Code Playgroud)
这可能看起来像是"定义第一"政策的争议.但它实际上并没有,因为g()只有在f()实际执行时才需要.这不是在执行最后一行(f())之前,g()已经很好地定义了这一点.