[英]What is the most pythonic way to structure a multi-module python program?
我已经在单个文件中构建了一个相当大的程序。 该文件的大小使其无法使用,因此我决定拆分为多个模块,但是此后一直困扰着可变范围。 我已经对其进行了很大程度的修复(在此过程中需要大量学习),但是我渴望了解良好的结构,以避免将来通过艰辛的课程学习。 有几点要点,但也欢迎提供一般性建议。
需要共享相同名称空间的模块
我有两个似乎需要共享相同名称空间的模块。 一个是程序的主要流程(用于与对象之间的数据传输,并调用UI),另一个是UI(其响应用户输入,称为主要流程)。
这些模块中的每个模块都应该导入另一个模块,然后主文件同时导入两个模块吗? 在我看来,这并不是特别优雅。
从[modulename]导入*
在此问题的答案中:
有建议,应避免from [modulename] import *
。
是否可以使用from [modulename] import *
来构建仅具有类定义的模块负载? 什么是“安全”用例?
需要访问彼此名称空间的模块与需要共享相同名称空间的模块不同。 我想不出任何东西,你可以用做from modulename import *
,你不能用做import modulename
。 您只需要在许多名称前加上modulename.
那是好事,不是坏事。 它使您的代码可以自我记录,这就是为什么要避免from modulename import *
原因。
您可以使UI和主流模块相互导入。 遇到问题的唯一方法是在函数范围之外引用它们之间的名称。 例如
# mainflow.py
import ui # interpreter stops reading mainflow and starts reading ui
class Foo:
...
theUI = ui.UI()
# ui.py
import mainflow # mainflow already being loaded; interpretation of ui continues uninterrupted
def dosomething():
myfoo = mainflow.Foo() # so far so good, not interpreted until the function is called
class Bar(mainflow.Foo): # mainflow.Foo not reached yet, error here
...
class UI:
...
另一方面,如果ui碰巧先被导入,那么当所有主流都已被解释但ui仅被解释为import mainflow
时,您将在theUI = ui.UI()
处得到错误。 但是,只要将所有引用相互放在函数内部,就可以相处得很好。 例如
# mainflow.py
import ui
...
theUI = None
def initialize():
global theUI
theUI = ui.UI()
类之间的依赖关系仍然存在问题。 我建议您不要那样做。 但是,如果您这样做了,则可以使用这种奇怪的方法使整个工作正常进行:
# mainflow.py
...
theUI = None
def initialize():
global theUI
theUI = ui.UI()
import ui # Waht!? Crazy! Import at the bottom of a file. Now all of mainflow's names are guaranteed to exist and ui can access them.
现在有了ui.py的第一个版本和mainflow.py的最后一个版本,该程序将编译并运行。 我真的不推荐上述内容; 更好地组织您的代码,以便您没有此类依赖项。 但是,如果您只是在模块中的函数之间来回调用,则不必诉诸此类技巧。
还有更多面向对象的设计方法,可以使UI和程序流不直接相互依赖,但是这样的重新设计将涉及更多的工作,而不仅仅是将其复制和粘贴到文件中以及使用module.
作为前缀module.
除非有特定原因,否则我认为您不希望过度设计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.