如何修复自定义模块中的“未定义变量”

时间:2019-08-21 15:20:46

标签: python function class input python-module

我目前仍在学习python,但到目前为止效果很好,所以我决定承担一个更大的项目,在这个项目中,我构建一个基于文本的简短游戏,并使用自定义模块来分隔我的代码。不幸的是,我遇到了许多麻烦,并通过使用一些google和耐心地解决了这些问题,但是这一点让我很沮丧。

问题本身就是我有两个正在使用的文件:main.py和roomsClass.py。在main.py中,有输入请求和将输入调低的命令,但是随后我尝试将输入转移到gameRooms.py中的函数中,但这根本行不通。

我们非常感谢您的帮助,如果我在这篇文章中做错了任何事情,请告诉我。我是stackoverflow的新手,可以使用我能得到的任何指针。

我试图在单个模块中全局分配它,但是我不得不再次定义输入变量,这会使我的代码弹出一个无用的输入点。

还尝试将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"\n{self.name}")
            print(f"\n\t{self.desc}")

那只是模块的一小部分,只是我要解决的问题。主要只是lookRoom(self)中的gameInput:。

我希望它实际上可以让我使用来自main.py的用户输入,但是输出仅显示gameInput未定义。

1 个答案:

答案 0 :(得分:0)

首先,您应该对代码进行一些更改,这些更改将使您的代码听起来更像是 Pythonic

main.py中的更改,将您的代码放入带有return的函数中:

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"\n{self.name}")
            print(f"\n\t{self.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"\n{self.name}")
            print(f"\n\t{self.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()
相关问题