使用main()是否正确但是没有把所有东西都放在def main()中?

时间:2018-01-24 06:28:40

标签: python project pyqt5

基本上,top.py中的代码就像这样。我正在尝试创建一个PyQt5项目,并能够分别测试每个对话框/窗口。

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

2 个答案:

答案 0 :(得分:2)

但是技术上完全可选的常见设计类似于

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你不希望程序立即开始运行时,所以起点是有条件的。

你基本上可以将你拥有的所有内容放在def main()if __name__ == '__main__':内,而它的工作方式完全相同。当它不是完全琐碎时,将它封装在一个单独的函数中是很好的,这样人类读者可以更容易地遵循逻辑,但就Python而言,它几乎是相同的(分开)从一个额外的函数调用的微不足道的开销。)

切向考虑是如何使您的代码足够模块化以便可重用。如果real_stuff()是您将来可能希望从其他程序调用的有用功能,请务必将其设置为不在def main()内或甚至在if __name__ == '__main__'内的单独函数。如果它有可能对其他程序本身有用的片段,也可以将它们重构为单独的函数,并在需要时从其他程序中调用它们。

为了使这些函数在编程上有用,它们可能不应该进行任何面向用户的交互,因此可能将它们分解为一个单独的函数 - 再次,不一定在main()内,而是与有意义的代码分开将来可以从其他程序中使用。无论用户交互或启动是什么,代码都可以单独运行,请放入main()(或者,如果它完全无关紧要,甚至不为它创建单独的函数)。

答案 1 :(得分:0)

一个好的做法是拥有一个“test”文件夹,每个“窗口”有一个文件供测试。例如,“toy_test.py”文件,您可以在其中导入所需的所有内容,例如“toy.py”。并在此测试文件中剪切并粘贴主块。

但是你所做的方式是正确的,因为只有当脚本是直接调用的脚本时才会调用“if main”块。