使用 main() 但没有将所有内容都放在 def main(): 中是否正确?
Is it correct to use main() but didn't put everything in def main():?
基本上,我在top.py
中的代码是这样的。我正在尝试创建一个 PyQt5 项目,并能够分别测试每个对话框/windows。
import sys, os
if __name__ == '__main__':
os.chdir('../')
sys.path.insert(0,'.')
#import *
else:
pass
#from . import *
#from common import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
def main():
global window
window = MainWindow()
window.showUI()
class MainWindow(QWidget):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
def showUI(self):
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
main()
sys.exit(app.exec_())
这是一种不好的做法吗?
项目结构:
main.py
gui/
__init__.py
top.py
common/
__init__.py
common.py
一个好的做法是有一个 "test" 文件夹,其中每个要测试的 "window" 一个文件。例如,一个 "toy_test.py" 文件,您可以在其中导入所有需要的内容,例如 "toy.py"。并剪切并粘贴此测试文件中的主块。
但是您的做法是正确的,因为 "if main" 块只有在脚本是被直接调用的脚本时才会被调用。
一种在技术上完全可选的常见设计类似于
def real_stuff():
# ... your actual code ...
def main():
# some setup when invoked from the command line
# maybe print a hostile welcome message? (No, don't.)
real_stuff()
if __name__ == '__main__':
main()
最终条件的目的是使您的脚本可以从另一个脚本 import
,但也可以从命令行 运行 和 python
。当您 import
不希望程序立即启动 运行ning 时,因此起点是有条件的。
你基本上可以把你所有的东西都放在 def main()
: 里面 if __name__ == '__main__':
而它会完全一样。当它不是 完全 微不足道时,最好将它封装在一个单独的函数中,这样人类 reader 就可以更轻松地遵循逻辑,但就 Python 而言,它几乎是一样的(除了一个额外的函数调用的微不足道的开销)。
切线考虑是如何使您的代码足够模块化以可重用。如果 real_stuff()
是一个有用的功能,您将来可能希望从其他程序中调用它,那么一定要把它变成一个不在 def main()
甚至 if __name__ == '__main__'
内的单独函数。如果它的代码片段本身可能对其他程序有用,那么也将它们重构为单独的函数,并在您需要时从其他程序中调用它们。
为了使这些函数在编程上有用,它们可能不应该进行任何面向用户的交互,因此可能将它们分解为一个单独的函数——同样,不一定在 main()
中,但与代码分开将来从其他程序中使用是有意义的。 运行 独立代码的用户交互或启动的任何剩余部分,放入 main()
(或者,如果它完全微不足道,甚至不要为其创建单独的函数)。
基本上,我在top.py
中的代码是这样的。我正在尝试创建一个 PyQt5 项目,并能够分别测试每个对话框/windows。
import sys, os
if __name__ == '__main__':
os.chdir('../')
sys.path.insert(0,'.')
#import *
else:
pass
#from . import *
#from common import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
def main():
global window
window = MainWindow()
window.showUI()
class MainWindow(QWidget):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
def showUI(self):
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
main()
sys.exit(app.exec_())
这是一种不好的做法吗?
项目结构:
main.py
gui/
__init__.py
top.py
common/
__init__.py
common.py
一个好的做法是有一个 "test" 文件夹,其中每个要测试的 "window" 一个文件。例如,一个 "toy_test.py" 文件,您可以在其中导入所有需要的内容,例如 "toy.py"。并剪切并粘贴此测试文件中的主块。
但是您的做法是正确的,因为 "if main" 块只有在脚本是被直接调用的脚本时才会被调用。
一种在技术上完全可选的常见设计类似于
def real_stuff():
# ... your actual code ...
def main():
# some setup when invoked from the command line
# maybe print a hostile welcome message? (No, don't.)
real_stuff()
if __name__ == '__main__':
main()
最终条件的目的是使您的脚本可以从另一个脚本 import
,但也可以从命令行 运行 和 python
。当您 import
不希望程序立即启动 运行ning 时,因此起点是有条件的。
你基本上可以把你所有的东西都放在 def main()
: 里面 if __name__ == '__main__':
而它会完全一样。当它不是 完全 微不足道时,最好将它封装在一个单独的函数中,这样人类 reader 就可以更轻松地遵循逻辑,但就 Python 而言,它几乎是一样的(除了一个额外的函数调用的微不足道的开销)。
切线考虑是如何使您的代码足够模块化以可重用。如果 real_stuff()
是一个有用的功能,您将来可能希望从其他程序中调用它,那么一定要把它变成一个不在 def main()
甚至 if __name__ == '__main__'
内的单独函数。如果它的代码片段本身可能对其他程序有用,那么也将它们重构为单独的函数,并在您需要时从其他程序中调用它们。
为了使这些函数在编程上有用,它们可能不应该进行任何面向用户的交互,因此可能将它们分解为一个单独的函数——同样,不一定在 main()
中,但与代码分开将来从其他程序中使用是有意义的。 运行 独立代码的用户交互或启动的任何剩余部分,放入 main()
(或者,如果它完全微不足道,甚至不要为其创建单独的函数)。