如果你是初学者 可能你现在唯一需要的答案就是此代码没有必要简单脚本的简单脚本。它只有在您想要能够import
您的脚本 (或)unpickle
等; 等; 参见关于其他一些非初始情景的其他答案 。
以略微不同的措辞,if __name__
警卫是隐藏代码的机制, 用于隐藏其它代码 。 如果您没有特定的理由隐藏某些信息, 不要: 如果您不需要隐藏一些代码 。import
,不要把它背后的警卫, 如果你这样做, 隐藏尽可能少的隐藏。
更详细一点,假设你有一个简单的脚本fib.py
(改编回答本答案):
# XXX FIXME: useless (see below)
if __name__ == "__main__":
n = int(input('Write a number: '))
a, b = 0, 1
while b < n:
a, b = b, a+b
print('Fibonacci number %i: %i' % (n, b))
现在,如果你只是跑跑python fib.py
效果不错,但是...__name__
将永远"__main__"
在此情况下, 条件其实是不必要的。 脚本可以简化为
n = int(input('Write a number: '))
a, b = 0, 1
while b < n:
a, b = b, a+b
print('Fibonacci number %i: %i' % (n, b))
现在,你不能import fib
新版本的版本, 但如果你一开始不打算这样做, 这个版本其实更好, 因为它简单明了。
如果你(如果)do do do 做想要能够import fib
,第一个版本也是没用的,因为有用的代码是在一个区域中,当您import
此文件( 在哪个情况下)__name__
将不为"__main__"
))。在这种情况下,适当的设计将是重新设定代码,以便有用的部分在函数中发挥作用,在您想要运行时,可以运行import
Ed it. Ed. Ed it. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. Ed. 编辑。 编辑 编辑。 编辑。 编辑 编辑。 编辑。
def main():
n = int(input('Write a number: '))
a, b = 0, 1
while b < n:
a, b = b, a+b
print('Fibonacci number %i: %i' % (n, b))
if __name__ == "__main__":
main()
如果你现在import fib
,呼吁main()
将不会被执行;但当您运行时python fib.py
会的
实际上,更好的设计仍然是将可重复使用部分(实际计算)与用户可看到的投入/产出分开:
def fibn(n: int) -> int:
a, b = 0, 1
while b < n:
a, b = b, a+b
return b
def main() -> None:
n = int(input('Write a number: '))
print('Fibonacci number %i: %i' % (n, fibn(n)))
if __name__ == "__main__":
main()
现在,你可以from fib import fibn
然后喊叫,fibn()
运行此功能的代码的函数import
.
(我调用函数)fibn()
只是为了让这个例子更清楚什么是这个例子。在现实生活中,你可以把它称为fib()
并且确实from fib import fib
.)
同样,你也可以import
然后喊叫,main
函数。
在回到问题中的代码时,我同样将代码从if
功能中也包含一个功能,因此呼叫者如果愿意,可以援引该功能。
def main():
lock = thread.allocate_lock()
thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
if __name__ == "__main__":
main()
这改变了lock
变量;如果周围代码需要访问它,您需要将其global
(或,也许,更好的是,重构main
至return lock
,并让调用者在自己的本地变量中捕捉到值。)
(不同于C类语言中的名称)main
Python 对 Python 没有具体意义; 但使用它作为将要运行的事物的名称, 是一个常见的公约 。 您仍然必须实际明确称呼它, 比如 :main()
,不同于C.)