Python: How to refactor circular imports(Python:如何重构循环导入)
问题描述
我有一件您可以做的事情engine.setState(<state class>)
,它将实例化您指定的类类型并开始在新状态下运行。
在SelectFileState
中有一个可转到NewFileState
的按钮,在NewFileState
上有一个可返回到SelectFileState
的按钮。
现在,在SelectFileState
的开头,我正在导入NewFileState
(这样我可以在稍后的课程中执行engine.setState(NewFileState)
。在NewFileState
的开头,我还导入了SelectFileState
(以便稍后可以返回到SelectFileState
)。
我知道在我需要使用SelectFileState
之前导入SelectFileState
就可以解决这个问题,但我更愿意以正确的方式处理问题并重构它。
现在我想知道..您将如何对其进行重构?
谢谢。
编辑: Pydsigner建议我将这两个文件合并为一个文件,因为它们都非常相关。但是,我不能将具有循环依赖关系的每个状态都放入一个文件中,因此必须有更好的方法来实现这一点。有什么想法吗?
2编辑:
现在我不使用from x import y
语法,而只使用import x
来绕过这个问题。这不是一个更好的解决方案,我想知道解决这类问题的"Pythonic"方法。仅仅将文件合并在一起不能永远解决问题。
代码:
SelectFileState
from states.state import State
from states.newfilestate import NewFileState
from elements.poster import Poster
from elements.label import Label
from elements.button import Button
from elements.trifader import TriFader
import glob
import os
class SelectFileState(State):
def __init__(self, engine):
super().__init__(engine)
def create(self):
self.engine.createElement((0, 0), Poster(self.engine.getImage('gui_loadsave')), 1)
self.engine.createElement((168, 30), Label("Load a game", 40), 2)
self.engine.createElement((400, 470), Button("New save", code=self.engine.createElement, args=((0, 0), TriFader(NewFileState, False), -240)), 3)
ycounter = 150
globs = glob.glob("save\*.mcw")
for file in globs:
self.engine.createElement((200, ycounter), Button(os.path.basename(file)[:-4]), 2)
ycounter += 50
NewFileState
from states.state import State
from states.selectfilestate import SelectFileState
from elements.poster import Poster
from elements.label import Label
from elements.button import Button
from elements.inputbox import InputBox
from elements.trifader import TriFader
class NewFileState(State):
def __init__(self, engine):
super().__init__(engine)
def create(self):
self.engine.createElement((0, 0), Poster(self.engine.getImage('gui_loadsave')), 1)
self.engine.createElement((135, 30), Label("Make a new save", 40), 2)
self.lvlname = self.engine.createElement((180, 212), InputBox(length=25, text="World name"), 2)
self.engine.createElement((200, 240), Button(text="Ok", code=self.createSave, args=()), 2)
def createSave(self):
open("save\" + self.lvlname.getText() + ".mcw", 'w')
self.engine.createElement((0, 0), TriFader(SelectFileState), -240)
推荐答案
在看不到代码的情况下,最有意义的是合并这两个文件。如果它们如此紧密地交织在一起,你可能会把它们放在一起,而不会有任何奇怪的错位。
这篇关于Python:如何重构循环导入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Python:如何重构循环导入


- python check_output 失败,退出状态为 1,但 Popen 适用于相同的命令 2022-01-01
- 如何在 python3 中将 OrderedDict 转换为常规字典 2022-01-01
- 使用Heroku上托管的Selenium登录Instagram时,找不到元素';用户名'; 2022-01-01
- padding='same' 转换为 PyTorch padding=# 2022-01-01
- 如何将一个类的函数分成多个文件? 2022-01-01
- 分析异常:路径不存在:dbfs:/databricks/python/lib/python3.7/site-packages/sampleFolder/data; 2022-01-01
- 沿轴计算直方图 2022-01-01
- python-m http.server 443--使用SSL? 2022-01-01
- pytorch 中的自适应池是如何工作的? 2022-07-12
- 如何在 Python 的元组列表中对每个元组中的第一个值求和? 2022-01-01