gpt4 book ai didi

python - 构建多模块 Python 程序最 Pythonic 的方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 18:57:48 25 4
gpt4 key购买 nike

我在一个文件中构建了一个相当大的程序。文件的大小使其无法工作,因此我决定拆分为多个模块,但此后一直对变量范围感到头疼。我已经基本上修复了它(一路上进行了相当多的学习),但我热衷于了解良好的结构,以避免将来吸取教训。有几个具体要点,但也欢迎提供一般性建议。

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

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

这些模块中的每一个都应该导入另一个,然后主文件都导入它们吗?这对我来说似乎不是特别优雅。

从[模块名称]导入*

在这个问题的答案中:

Python: Sharing global variables between modules and classes therein

有人建议应避免 from [modulename] import *

可以使用 from [modulename] import * 来构建一组仅具有类定义的模块吗?什么是“安全”用例?

最佳答案

需要访问彼此命名空间的模块与需要共享相同命名空间的模块不同。我想不出有什么可以用 from modulename import * 做而不能用 import modulename 做的事情。您只需在许多名称前添加 modulename 即可。这是一件好事,而不是坏事。它使您的代码 self 记录,这就是为什么要避免 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 仅被解释为时,您会在 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 更复杂。 我认为你不想过度重新设计,除非你有特定的原因。

关于python - 构建多模块 Python 程序最 Pythonic 的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16885915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com