繁体   English   中英

构造多模块python程序的最pythonic方法是什么?

[英]What is the most pythonic way to structure a multi-module python program?

我已经在单个文件中构建了一个相当大的程序。 该文件的大小使其无法使用,因此我决定拆分为多个模块,但是此后一直困扰着可变范围。 我已经对其进行了很大程度的修复(在此过程中需要大量学习),但是我渴望了解良好的结构,以避免将来通过艰辛的课程学习。 有几点要点,但也欢迎提供一般性建议。

需要共享相同名称空间的模块

我有两个似乎需要共享相同名称空间的模块。 一个是程序的主要流程(用于与对象之间的数据传输,并调用UI),另一个是UI(其响应用户输入,称为主要流程)。

这些模块中的每个模块都应该导入另一个模块,然后主文件同时导入两个模块吗? 在我看来,这并不是特别优雅。

从[modulename]导入*

在此问题的答案中:

Python:在其中的模块和类之间共享全局变量

有建议,应避免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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM