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)
解决方案
在看不到代码的情况下,最有意义的是合并这两个文件。如果它们如此紧密地交织在一起,你可能会把它们放在一起,而不会有任何奇怪的错位。
相关文章