使用 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()(或者,如果它完全微不足道,甚至不要为其创建单独的函数)。