这是一种构造模块的Python方式吗?
假设我正在编写一个应用程序,它使用了许多GUI控件,我正在为这些控件编写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
的模块中。作为一名经验丰富的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。