Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用main()是否正确,但没有';不要将所有内容都放在def main()中:?_Python_Project_Pyqt5 - Fatal编程技术网

Python 使用main()是否正确,但没有';不要将所有内容都放在def main()中:?

Python 使用main()是否正确,但没有';不要将所有内容都放在def main()中:?,python,project,pyqt5,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 * fr

基本上,我在
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

一个好的做法是有一个“测试”文件夹,每个待测试的“窗口”有一个文件。例如,“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()
最后一个条件的目的是使您的脚本能够从另一个脚本导入
,但也可以从命令行使用
python
运行。当您导入时,您不希望程序立即开始运行,因此起点取决于此

基本上你可以把你所有的东西都放在
defmain()
:里面
如果uuu name\uuuuuu=='uuu main\uuuuu':
,它的工作原理完全一样。当它不是完全琐碎的时候,最好将它封装在一个单独的函数中,这样人类读者可以更容易地理解逻辑,但就Python而言,它几乎是一样的(除了一个额外函数调用的琐碎开销)

一个重要的考虑因素是如何使您的代码模块化到可以重用的程度。如果
real\u stuff()
是一个有用的功能,您可能希望将来从其他程序调用它,那么一定要将它变成一个独立的函数,它不在
def main()
内,甚至不在
内,如果uuuu name\uuu=='\uuu main\uu'
。如果它的代码片段本身对其他程序有用,那么也可以将它们重构为单独的函数,并在需要时从其他程序调用它们


为了使这些函数在编程上有用,它们可能不应该进行任何面向用户的交互,因此可能需要将它们考虑到一个单独的函数中——同样,不一定在
main()
中,而是与代码分开,这对将来从其他程序中使用有意义。无论用户交互或启动代码以使其独立运行,请将其放入
main()
(或者,如果它非常简单,请不要为其创建单独的函数)。

实际上,在
main.py
中,只有两行
从gui导入top.main()
之前,我使用了
top.load()
,但当我看到这种可能性时,我改为
top.main()
。另外,我想知道我是否应该给文件命名为
main.py
?Python不关心文件的名称,只要它不包含对
import
有问题的字符(破折号和点是示例,您不能
import fun project
,因为在Python标识符中不允许破折号)。通常,称它为实际描述其功能的东西——如果这是一个计算器应用程序,
calculator.py
将是一个很好的名称。从gui导入top
调用
top.py
时,一般的调用方式是什么
top.load()
,而不是
top.main()
?我没有看到
def load
,因此根据您向我们展示的内容,答案是否定的。如果有一个
load()
函数,从您的角度来看,它做的事情比
main()更好
那么我当然更喜欢这样。也许我应该对这一点稍加说明,我真的不知道Qt/PyQt5或它可能添加到汤中的任何约定。