如何修复自定义模块中的“未定义变量”
Posted
技术标签:
【中文标题】如何修复自定义模块中的“未定义变量”【英文标题】:How to fix 'Variable not defined' in custom modules 【发布时间】:2019-12-26 22:05:49 【问题描述】:我目前仍在学习 python,但到目前为止做得很好,所以我决定承担一个更大的项目,在该项目中我构建一个基于短文本的游戏并使用自定义模块来分隔我的代码。不幸的是,我遇到了许多复杂情况,并通过一些谷歌和耐心的大力应用解决了这些问题,但这个问题让我很难过。
问题本身是我正在处理两个文件:main.py 和 roomsClass.py。在 main.py 中有输入请求和将输入调低的命令,但是我尝试将该输入传输到 gameRooms.py 中的函数,但它不起作用。
非常感谢任何帮助,如果我在这篇文章中做错了什么,请告诉我。我是 *** 的新手,可以接受任何我能得到的指针。
我尝试在单个模块中全局分配它,但我必须再次定义输入变量,这会导致我的代码弹出一个无用的输入点。
还尝试将 main 导入文件,但这会在 gameRooms 和 main 之间创建太多依赖关系。
main.py
userInput = input('\nWhat shall you do? :> ')
gameInput = userInput.lower()
gameRooms.py
class Rooms():
def __init__(self, pos, name, desc, exits, status, nLock, sLock, eLock, wLock):
self.pos = pos
self.name = name
self.desc = desc
self.exits = exits
self.status = status
self.nLock = nLock
self.sLock = sLock
self.eLock = eLock
self.wLock = wLock
def lookRoom(self):
global userInput
global gameInput
if gameInput in cfg.lookList and self.pos == cfg.xyMap:
print(f"\nself.name")
print(f"\n\tself.desc")
这只是模块的一小部分,但正是我想要修复的。主要是lookRoom(self)中的gameInput:。
我希望它实际上可以让我使用来自 main.py 的用户输入,但输出只是说 gameInput 没有定义。
【问题讨论】:
在哪里以及如何调用lookRoom()
方法?
"我尝试将该输入传输到 gameRooms.py 中的函数" 请显示应该执行此操作的代码。
【参考方案1】:
首先,你应该对你的代码做一些改动,这些改动会让你的代码听起来更Pythonic。
main.py
的变化,把你的代码放在一个有返回的函数中:
def game_input():
userInput = input('\nWhat shall you do? :> ')
gameInput = userInput.lower()
return gameInput
gameRooms.py
的变化:
gameInput
。
对你的函数lookRoom()
做一些改动。
导入您的模块main.py
。
import main
class Rooms():
def __init__(self, pos, name, desc, exits, status, nLock, sLock, eLock, wLock, gameInput):
self.pos = pos
self.name = name
self.desc = desc
self.exits = exits
self.status = status
self.nLock = nLock
self.sLock = sLock
self.eLock = eLock
self.wLock = wLock
self.gameInput = gameInput
def lookRoom(self):
if self.gameInput in cfg.lookList and self.pos == cfg.xyMap:
print(f"\nself.name")
print(f"\n\tself.desc")
现在,当您创建一个新对象 Rooms()
时,您必须通知所有参数,包括参数 gameInput
看看:
if __name__ == '__main__':
gameInput = main.game_input()
r1 = Rooms("a", "b", "c", "d", "e", "f", "g", "h", "i", gameInput)
#r1.lookRoom()
您甚至可以使用while
语句强制用户通知gameInput
,这是一个示例:
if __name__ == '__main__':
while True:
gameInput = main.game_input()
if gameInput == "":
print("Type your name correctly!")
else:
break
r1 = Rooms("a", "b", "c", "d", "e", "f", "g", "h", "i", gameInput)
#r1.lookRoom()
编辑 1:
gameRooms.py
:
class Rooms():
def __init__(self, pos, name, desc, exits, status, nLock, sLock, eLock, wLock, gameInput):
self.pos = pos
self.name = name
self.desc = desc
self.exits = exits
self.status = status
self.nLock = nLock
self.sLock = sLock
self.eLock = eLock
self.wLock = wLock
self.gameInput = gameInput
def lookRoom(self):
if self.gameInput in cfg.lookList and self.pos == cfg.xyMap:
print(f"\nself.name")
print(f"\n\tself.desc")
main.py
:
from gameRooms import *
def game_input():
userInput = input('\nWhat shall you do? :> ')
gameInput = userInput.lower()
return gameInput
if __name__ == '__main__':
gameInput = game_input()
r1 = Rooms("a", "b", "c", "d", "e", "f", "g", "h", "i", gameInput)
#r1.lookRoom()
【讨论】:
非常感谢您为我解决了很多问题。另一个问题是我如何处理 main.py 和 gameRooms.py 之间的相互依赖关系,因为它们相互导入并导致问题? 在本例中,只有gameRooms.py
导入main.py
,但您可以使用main.py
作为主类并将gameRooms.py
导入到它。您还可以创建另一个类并将所有内容导入其中并运行其中的所有内容。在我看来,您应该使用main.py
作为主类并将所有内容导入其中,如果您这样做,则不需要将main.py
导入到gameRooms.py
。我将编辑帖子并向您展示一个示例。以上是关于如何修复自定义模块中的“未定义变量”的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 Laravel 5.2 中的“未定义变量:子任务”