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

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 中的“未定义变量:子任务”

如何从colab中的另一个python模块调用自定义模块

如何在自定义模块(Joomla 1.7)中使用自定义组件中的函数?

如何从自定义模块中正确导入函数

尝试调用函数提交到 MySQL 时如何修复“未定义变量”

如何在 divi 博客模块中显示自定义字段?