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:如何重构循环导入
基础教程推荐
- 尝试制作WhatsApp机器人 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
