You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python 3.10中TXT文件行读取或字典使用问题排查(面向对象学习场景)

解决区域描述读取错误的问题

嘿,我一眼就看出你遇到的问题根源了——Python字典的键是唯一的,你在每个区域的字典里重复写了"desc"键,后面的键值对直接把前面的覆盖了,这就是为什么你看到的描述总是不对!

问题出在哪?

举个例子,你看代码里的区域2:

2: {1: 3, "desc": regions_description[3], 4: 1, "desc": regions_description[1]}

你先后写了两个"desc",Python处理这种情况时,只会保留最后一个"desc"的取值(也就是regions_description[1]),前面的直接被覆盖掉。其他区域里的多个"desc"键也都是同样的问题,导致你读取的描述完全不是预期的那一行。

另外,你把regions直接更新到self.__dict__里的做法也不太稳妥,容易和类的其他属性(比如player)冲突。

怎么修复?

我给你一套完整的修复方案,分几步来:

1. 重构区域的数据结构

把每个区域的描述信息可移动路径分开存,每个区域的字典只保留两个固定键:"desc"(区域专属描述)和"paths"(路径到目标区域的映射),这样就不会有键重复的问题了。修改后的regions字典应该是这样:

regions = {
    1: {"desc": regions_description[2].strip(), "paths": {1: 2}},
    2: {"desc": regions_description[1].strip(), "paths": {1: 3, 4: 1}},
    3: {"desc": regions_description[8].strip(), "paths": {1: 8, 2: 6, 3: 4, 4: 2}},
    4: {"desc": regions_description[3].strip(), "paths": {2: 3, 4: 5}},
    5: {"desc": regions_description[4].strip(), "paths": {1: 4}},
    6: {"desc": regions_description[3].strip(), "paths": {1: 7, 3: 3}},
    7: {"desc": regions_description[6].strip(), "paths": {3: 8, 4: 6}},
    8: {"desc": regions_description[3].strip(), "paths": {1: 9, 2: 7, 4: 3}},
    9: {"desc": regions_description[8].strip(), "paths": {1: 10, 4: 8}},
    10: {"desc": regions_description[9].strip(), "paths": {4: 9}}
}

我加了.strip()是为了去掉readlines()读进来的换行符,你可以根据自己的regiony.txt内容调整regions_description的下标。

2. 优化Territory类的实现

with语句打开文件,它会自动帮你关闭文件,避免忘记关文件的问题;同时把regions作为类的一个单独属性,不要直接更新到self.__dict__

class Territory(object):
    def __init__(self):
        self.player = Player()
        # 用with语句安全读写文件
        with open("regiony.txt", "r") as regions_file:
            regions_description = regions_file.readlines()
        # 上面重构后的regions字典
        self.regions = regions

3. 调整Moving类的移动逻辑

因为数据结构变了,读取描述和路径的代码也要对应修改,同时我还优化了异常处理和用户提示:

class Moving(object):
    def __init__(self):
        self.territory = Territory()
        self.regions = self.territory.regions
    def movement(self):
        region = 1
        path = 1
        POSSIBLE_PATHS = (1, 2, 3, 4, 0)
        print(f"当前区域:{region}")
        print(self.regions[region]["desc"])
        while path != 0:
            try:
                path = int(input("Which path you take? "))
                if path == 0:
                    print("退出移动")
                    break
                # 检查当前区域是否有这个路径
                if path in self.regions[region]["paths"]:
                    region = self.regions[region]["paths"][path]
                    print(f"当前区域:{region}")
                    print(self.regions[region]["desc"])
                else:
                    print("这个路径不存在,请重新输入!")
            except ValueError:
                print("请输入有效的数字(0-4)!")

额外提示

如果你想让regiony.txt的行号和区域对应更直观,比如区域1对应test1,可以把regions_description的下标改成region-1,比如区域1的描述用regions_description[0],这样更不容易搞混。

按照这个方案修改后,你就能看到每个区域显示正确的描述了!

内容的提问来源于stack exchange,提问作者Mr. Chris

火山引擎 最新活动