python - 从其他函数和模块调用字典
问题描述
很抱歉问了一个新手问题,但我正在学习函数、模块和字典,并且在结合这三个概念时遇到了麻烦。基本上我的问题是,有没有办法在另一个模块的函数中创建字典并像在当前模块的函数中一样使用它?
我失败的尝试是在我的文本 RPG 中:
对于 main.py:
import monsters # At top of program
monsters.monster_list # In the middle of the program
# Command loop during combat
def combat_loop():
in_town = False
monster_appear = True
combat_active = True
while monster_appear == True:
# Pull a random monster from the appropriate level pool.
monsters.monster_list(hero)
print(f"A {monster['name']} appears!")
print(f"You have {hero['current_health']} / {hero['max_health']} health remaining.")
monster_appear = False
monsters.py 模块超过 700 行,但我将尝试发布所有相关代码:
def monster_list(hero):
# Monster List
# Seed stats
monster = {
'name': "None",
'health': 0,
# Monster strength is used in figuring out how much damage will be done to you.
'strength' : 0,
# Monster agility is used in figuring out how much damage will be reduced for the enemy.
'agility' : 0,
'gold': 0,
'exp': 0,
}
# Slime stats
slime = {
'name': "Slime",
'health': 3,
'strength' : 5,
'agility' : 3,
'gold': 1,
'exp': 1
# Slime has a 1/64 chance to Dodge
}
# Monster sets per level (edited for length).
monsters = ['slime', etc]
# The following makes a list slice out of monsters from position 0
# up to but not including 2 and so on.
tier1_monsters = monsters[0:2]
if hero['tier'] == 1:
current_monster = random.choice(tier1_monsters)
#Omitted the rest for length
# Monster stats list - attached base slime stats to the current monster in combat
if current_monster == 'slime':
monster['name'] = slime['name']
monster['health'] = slime['health']
monster['strength'] = slime['strength']
monster['agility'] = slime['agility']
monster['gold'] = slime['gold']
monster['exp'] = slime['exp']
# Omitted for length
return monster
当程序第一次尝试加载战斗循环时,此代码会崩溃:
Traceback (most recent call last):
File "my_rpg_modules.py", line 781, in <module>
combat_loop()
File "my_rpg_modules.py", line 717, in combat_loop
print(f"A {monster['name']} appears!")
NameError: name 'monster' is not defined
同样,我只是在学习这些概念,所以我什至不确定我想要做的事情是否可行。在我添加函数和模块之前,代码就可以工作了。任何建议表示赞赏。谢谢!
此外,如果我将种子怪物列表粘贴到 main.py 中,则此代码有效,但它显示“A None 出现!”。主程序似乎无法从其他模块的函数中提取字典。
解决方案
您只是忘记捕获 的返回值monsters.monster_list
:
monster = monsters.monster_list(hero)
print(f"A {monster['name']} appears!")
看起来你很困惑,因为你最初有monster
一个全局变量,每个循环都被修改(这是一个非常糟糕的设计 - 一个新手错误),并且你没有完全切换到返回它。同样的,monster['name'] = slime['name']
也是同样糟糕的设计的一部分。相反,monsters.monster_list
只需返回current_monster
:
if hero['tier'] == 1:
return random.choice(tier1_monsters)
推荐阅读
- mysql - 我可以优化这个 UNION 查询吗?
- spring-boot - @MockBean 与 Junit Jupiter 并发模式
- amazon-web-services - 如何在 SAM 上开发 lambda 但在没有 api 网关的情况下部署
- c# - 使用 Lambda 实体框架的对象列表中的多个 OR 语句
- java - 在多个 docker 实例上运行应用程序时如何处理代码同步(Spring JPA @Lock、Java 同步、计划作业等)?
- logstash - 在 Log stash 中创建自定义 GROK 模式
- git - 用于 Git 的 PhpStorm 中的“管理遥控器”问题
- jvm - 如何监控 Websphere 应用程序的 JVM 使用情况?
- c - 使用 fscanf *after* fgetc 问题
- docker - docker-compose - 多个项目之间的共享网络