如果您是初学者,那么您现在唯一需要的答案可能是该代码对于简单的脚本来说是不必要的。仅当您希望能够使用import
您的脚本(或unpickle
等等;请参阅此处的其他答案以了解其他一些非初学者场景)时,它才有用。
稍微详细一点,假设您有一个简单的脚本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
用新版本,但如果你一开始不打算这样做,这个版本实际上更好,因为它更简单、更清晰。
如果您确实希望能够,那么第一个版本也是无用的,因为有用的代码位于当您使用此文件import fib
时不会运行的部分中(在这种情况下不会运行)。在这种情况下,正确的设计是重构代码,以便有用的部分位于一个函数中,您可以在编辑后随时运行。import
__name__
"__main__"
import
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()
现在,您可以从执行 this 的代码中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
,并让调用者在它自己的局部变量中捕获值)。