Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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方式吗?_Python_Module - Fatal编程技术网

这是一种构造模块的Python方式吗?

这是一种构造模块的Python方式吗?,python,module,Python,Module,假设我正在编写一个应用程序,它使用了许多GUI控件,我正在为这些控件编写Python代码。每个控件都由一个类描述,我想将所有这些类聚合到一个名为gui的模块中。作为一名经验丰富的C/C++开发人员,我认为按文件分离类实现最有意义,如下所示: gui/MainWindow.py gui/Widget1.py gui/Widget2.py 其中,MainWindow类的规范在MainWindow.py中。但是,如果我以这种方式布置文件,那么这些类的语法如下所示: import gui w = gu

假设我正在编写一个应用程序,它使用了许多GUI控件,我正在为这些控件编写Python代码。每个控件都由一个类描述,我想将所有这些类聚合到一个名为
gui
的模块中。作为一名经验丰富的C/C++开发人员,我认为按文件分离类实现最有意义,如下所示:

gui/MainWindow.py
gui/Widget1.py
gui/Widget2.py
其中,
MainWindow
类的规范在
MainWindow.py
中。但是,如果我以这种方式布置文件,那么这些类的语法如下所示:

import gui
w = gui.MainWindow.MainWindow()
这似乎是多余的。绕过此限制的一种方法是编辑
gui/\uuuu init\uuuu.py
,即:

from gui.MainWindow import *
from gui.Widget1 import *
from gui.Widget2 import *
这将类带入
gui
模块名称空间。然后,我可以按如下方式访问它们:

w = gui.MainWindow()
这是典型的做法吗?它是否有足够的Pythonicity在社区中被认为是合适的?我可以看到的一个缺点是,在向
gui
模块添加新的子模块时,我需要确保保持
gui/\uuu init\uuuuuuuuuy.py
;我不喜欢那样的手工步骤


关于如何更好地解决这一问题的想法和/或建议将非常好。

不要导入
*
(除非您确定不会有冲突;此规则可能适用于软件包作者),但这当然是一个可接受的解决方案。

您可能已经注意到这些PEP和文档站点:

因此,我唯一可以补充的是不要使用
import*
。一个例子:

>>> from pylab import *
>>> any(False for i in range(5))
True
当你有效地争辩说你知道自己在做什么的时候。您不能假设从您的包中导入*的所有潜在重新用户都知道他们在隐藏什么,同时他们拆除了他们和您的代码之间的最终名称空间屏障。 这会产生严重的错误。另见:

现在,当用户从sound.effects import*写入
时会发生什么?在理想情况下,我们希望它以某种方式进入文件系统,找到包中存在哪些子模块,然后将它们全部导入。这可能需要很长时间,并且导入子模块可能会产生不必要的副作用,这些副作用只有在显式导入子模块时才会发生

(导入*不是选项;-)

名称空间是一个非常好的主意——让我们做更多的工作吧


但这些只是指导方针/建议/个人偏好,当这些不适用时,肯定存在边缘案例

你在征求意见和建议——这不是一个建设性的问题。基本上,除了在
\uuu init\uuuu.py
中使用
*
而不是显式之外,您已经找到了通常的方法。同意这与指导原则背道而驰。我认为这是合适的,因为社区中似乎对被认为是Pythonic的编程技术和那些不是Pythonic的编程技术有着普遍的客观共识。你可能是指包而不是模块,假设我可以控制整个
gui
模块,我应该能够确认不会有任何冲突。
import*
只将符号带入模块级名称空间(除非有我看不到的内容)。此外,在每个子模块中设置
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。