Python:如何重构循环导入

2022-03-01 00:00:00 python refactoring

问题描述

我有一件您可以做的事情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)

解决方案

在看不到代码的情况下,最有意义的是合并这两个文件。如果它们如此紧密地交织在一起,你可能会把它们放在一起,而不会有任何奇怪的错位。

相关文章