Python的等效"public static void main"

Dev*_*ted 15 python java

什么是Python的"public static void main(String [] args){...}"?我记得过去曾经使用它然后忘记了.

我基本上想要记住的是一个功能,我认为包括一些下划线(__)...

谢谢

San*_*nta 23

#!/usr/bin/env python

import sys

def main(args):
    print args

if __name__ == '__main__':
    main(sys.argv)
Run Code Online (Sandbox Code Playgroud)

编辑:模拟void退货.

  • 在这里有一个名为`main(args)`的方法有点令人困惑,因为没有什么特别之处导致它被python运行时调用.这是对`__name __ =='__ main __'的检查 (2认同)

Ben*_*ein 10

if __name__ == "__main__":
    ....do your thing
Run Code Online (Sandbox Code Playgroud)


Pau*_*McG 9

这是一种常用的习语,但它并不等同于Java public static void main(String args[]). 所有 Python模块在模块范围内从上到下执行所有语句.对于大多数导入的模块,这些语句通常仅限于类和方法定义,它们在模块的命名空间中设置值,但实际上并不执行函数的代码.但是,如果你把一个声明在模块范围内像SPECIAL_CONSTANT = 42,那么这将立即在模块的进口或独立运行运行-无需main()__main__什么的.尝试print在简单模块的顶部放置一个语句.无论是导入该模块还是从命令行单独运行该模块,该print语句将始终执行.

这个习惯用法的优点在于它允许您将一些简单的测试或演示代码嵌入到一个库中,该库通常由客户编写的某个模块导入.也许是这样的:

# special_super_duper_module.py

# this next statements will run, even though not in main() or set off
# with "__name__ ==" tests or any such thing
print "You are using special_super_duper_module.py, written by Felix the Cat"
SPECIAL_CONSTANT = 42

def super_duper_function1():
    pass

def super_duper_function2():
    pass

if __name__ == "__main__":
    print "You are running special_super_duper_module.py interactively"
    assert super_duper_function1() == None, "expected None, got non-None result"
    assert super_duper_function2() == None, "expected None, got non-None result"
    # doctests or unittests could also go here, or just a simple demo
Run Code Online (Sandbox Code Playgroud)

当某些代码想要使用你的超级duper函数导入模块时,顶部的小横幅将被打印,但条件化的代码if __name__ etc.... 将无法运行.但是如果您的用户使用python命令直接运行模块,那么嵌入式测试或演示代码将会运行.

相比之下,public static void main(String args[])是一种特殊的方法签名,它告诉Java VM什么类的方法以什么方式开始.Python只是从命名模块的顶部开始,然后从那里开始运行.这就是为什么你只需要写:

print "Hello, World!"
Run Code Online (Sandbox Code Playgroud)

在一个模块中,所有人都可以编写你的第一个Python程序.

  • @John - 我今天学到了一个新词.(我从未见过Gadarene,我从不希望......等等.)我讨厌`public static void main(String [] args)`的事情是它是第一次这样一个神秘的障碍开发人员,并且总是,教师对那些提出问题的人的回答是"不要担心它意味着什么,只需输入".我认为这是一个必须学习的语言设计缺陷1.主要作为入口点,2.公共方法保护,3.静态方法定义,4.void表示没有返回的函数,和5.数组声明,只是让程序打印你的名字! (3认同)