Python:如何重构循环导入

Nam*_*nge 8 python refactoring

我有一个你可以做的事情,engine.setState(<state class>)它将实例化你给它的类类型并开始运行新状态.

SelectFileState有一个按钮可以转到NewFileState,然后NewFileState有一个按钮可以返回SelectFileState.

现在,在开始时SelectFileState,我正在导入NewFileState(所以我可以在课堂上做engine.setState(NewFileState).在开始时NewFileState,我也在导入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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

pyd*_*ner 4

在看不到代码的情况下,最有意义的是合并两个文件。如果它们如此紧密地交织在一起,你可能可以将它们放在一起,而不会出现任何真正奇怪的不合适的地方。