0

I was wondering what does if __name__ == "__main__": really do in python, I have the following code in python3:

def main():
    test();

def test():
    print("hello world " + __name__);

if __name__ == "__main__":
    main();

we know that we have to declare a function before we use it, so function call inside of if part works fine, the main() is defined before it is called inside of if statement, but what about the test() function, it is defined after it is called and there is no errors:

def main():
    test();

def test():
    print("hello world " + __name__);

so how could it works if the test() function is defined after it is called?

4

4 回答 4

5

调用后未定义测试。顺序是:

  1. 定义main. 这引用了一个(尚未定义)test,但实际上并未使用(调用)它。Python 没问题。
  2. 定义test.
  3. 打电话main
  4. main来电test。没问题,因为它已经定义了。
于 2013-11-12T21:51:36.430 回答
1

这里的问题真的与if __name__ == 'main'. 考虑以下代码:

def do_something():
    do_something_else()

以上是一个有效的函数声明。 即使我还没有写do_something_else()。随意在您的交互式解释器中尝试一下。现在,当我真正打电话 do_something()时:

do_something()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-21-3d57cd7a951b> in <module>()
----> 1 do_something()

<ipython-input-20-5d71722aad44> in do_something()
      1 def do_something():
----> 2     do_something_else()
      3 

NameError: global name 'do_something_else' is not defined

它出错了。如果在调用 之前的某个时间点do_something(),我已经定义了我的do_something_else函数,则不会。

那么这是什么意思?Python 确实从上到下解释。但是当达到一个函数定义时,它只是编译该函数,而不是执行它。

于 2013-11-12T21:52:08.423 回答
0

我们知道我们必须在使用它之前声明一个函数

听起来您来自 C 家族中的一门语言。这些语言在两个方面有所不同。

首先,Python 没有“声明”任何东西。这在像 C 这样的语言中是有意义的,其中变量是存储值的类型化内存位置。但在 Python 中,值有自己独立的类型和位置,变量只是这些值的名称,所以没有什么要声明的。

现在,Python 要求您在使用它之前定义一个函数,就像 C 一样。

但是只有 C要求您在编译一个函数体使用它的函数之前定义或至少声明一个函数。区别与上面相同——C 需要声明函数、获取类型、指向函数实际代码的指针等;在 Python 中,函数只是函数对象值的名称。要编译一个函数,它只需要知道在哪里查找名称即可。这很简单:它编译函数,以便在运行时在模块全局变量中查找名称。由于不需要其他信息,因此无需申报。

例如,在 C 中,这是合法的:

void foo() {}
void bar() { foo(); }

这是这样的:

void foo();
void bar() { foo(); }
void foo() {}

但这不是:

void bar() { foo(); }
void foo();

在 Python 中,因为没有声明,所以第二个和第三个是相同的,因此都完全有效:

def bar():
    foo()
def foo():
    pass
于 2013-11-12T22:04:14.117 回答
0

Python 按照它看到的顺序执行代码。

您输入def main():它会将其作为稍后运行的函数定义。

if __name__ == "__main__":检查当前文件是否是应该运行的文件(而不是包含的文件)。在这种情况下,它将执行下面的内容(通常main

你可以这样写:

print "here"
def main():
  print "in main"

if __name__ == "__main__"
  main()

你应该会看到类似的输出

here
in main

这是因为 python 本质上是一种脚本语言,并且函数是可选的。话虽如此,对于任何不打算在接下来的 10 分钟内丢弃的代码,您都应该使用函数和类。它们使代码更易于理解和调试。

您的特定代码有效(在 main 之后定义测试)的原因是您在定义所有内容之后运行它。除非您运行 main,否则Python 不会尝试检查是否有test要调用的 a。当你运行时maintest已经定义好了。

于 2013-11-12T21:50:54.563 回答