【问题标题】:Attribute Error Python from a new file来自新文件的属性错误 Python
【发布时间】:2017-08-26 15:43:35
【问题描述】:

我在 python 中遇到一个属性错误,但我已经导入了我需要的所有内容。这很令人困惑,因为这似乎是合乎逻辑的,没有任何问题或秩序,我不认为我说的是来自 java 背景。

这是在一个名为 utils.py 的文件中

import runMain


def isUser(credentialsInput):
    return credentialsInput in runMain.users


def isReserved(names):
    for strings in runMain.roomName:
        if names in strings:
            return True
        else:
            return False


def getIndex(e, check):
    return e.index(check)


def findInArray(e, searchName):
    runMain.i = 0
    while runMain.i < len(e):
        test = e[runMain.i]
        if searchName in test:
            break
    return runMain.i


def registerUser(creds):
    runMain.users.__add__(len(runMain.users), creds)


def runCredentialCheck():
    runMain.username = input("admin$ -u>>> ")
    runMain.password = input("admin$ -p>>> ")
    runMain.credentials = runMain.username + ":" + runMain.password
    return isUser(runMain.credentials)

我有另一个名为 runMain 的文件,其中有以下代码:

import utils
import sys


TOTAL_ROOMS = 500
rooms = []
suite = []
reservations = []
reservationParts = []
roomNum = 0
suiteOut = ""
suiteF = ""
name = ""
userInput = ""
suiteT = " and is a suite"
utils.users.append("foo:hello")


userInput = input(">>> ")
while True:
        if userInput == "new -r":
                utils.username = input("admin$ -u>>> ")
                utils.password = input("admin$ -p>>> ")
                utils.credentials = utils.username + ":" + utils.password
                if utils.isUser(credentialsInput=utils.credentials):
                        userInput = input("rsr# -n ")
                        reservationParts = userInput.split()
                        roomNum = reservationParts[0]
                        name = reservationParts[1]
                        if name in rooms:
                                print(">>> Room is occupied")
                        elif name in utils.roomName:
                                print(">>> Room is occupied")
                        rooms.append(roomNum)
                        utils.roomName.append(name)
                        utils.loopCount = 0
                        if "--suite" in userInput:
                                suite.append(True)
                                suiteOut = suiteT
                        else:
                                suite.append(False)
                                suiteOut = suiteF
                        reservations.append("Room " + roomNum + " is filled by " +
                                            utils.roomName.__getitem__(utils.loopCount) + suiteOut)
                        for ints in rooms:
                                if suite.__getitem__(utils.loopCount):
                                        suiteOut = suiteT
                                else:
                                        suiteOut = suiteF
                                sys.stdout.write("Room " + ints + " is filled by " +
                                                 utils.roomName.__getitem__(utils.loopCount) + suiteOut)
                                print()
                                utils.loopCount += 1
                        userInput = input(">>> ")
                        if userInput == "quit()":
                                break
                else:
                        print("Invalid Credentials")
        elif userInput == "new -u":
                if utils.runCredentialCheck():
                    utils.username = input("new -u -u>>> ")
                    utils.password = input("new -u -p>>> ")
                    utils.registerUser(creds=(utils.username + ":" + utils.password))
                else:
                    print("Invalid Credentials")
                userInput = input(">>> ")

我不确定我做错了什么。我收到错误: AttributeError: 模块 'utils' 没有属性 'runCredentialCheck'。

【问题讨论】:

  • utils 是从哪里导入的?
  • utils是在runMain文件中导入的文件
  • 你的问题不在于runMain 导入,而是utils 导入。可以发一下utils的内容吗?
  • utils 内容贴在问题中
  • 我认为您的主要问题之一是您有循环导入。 runMain 正在导入 utils 正在导入 runMain 正在导入 utils 等。尝试将这些脚本分开一点(将相关数据交给 utils 中的函数并返回所有必要的内容)。这肯定会有所帮助。

标签: python python-3.x


【解决方案1】:

你的代码有

  • 循环导入循环(runMain 导入 utils 导入 runMain 导入...)
  • 一个包含(非定义)代码的模块,该模块在导入时运行

这两种做法都是不好的做法,部分原因是它们结合起来会破坏。循环模块依赖通常不是问题,因为 Python 只运行每个模块中的代码一次。但是,在一种情况下 Python 可能会运行它两次:在命令行上命名模块时。

# foo.py
import bar
print("in foo")
# bar.py
import foo
print("in bar")
$ python3 foo.py
in foo
in bar
in foo

要解决此问题,您应该打破依赖关系:如果您需要 utils 访问 runMain 中的项目,请将它们移动到 utils 或将它们放入 @987654330 包含的第三个模块中@和runMain;并使用 if 语句保护 runMain.py 中的代码,该语句仅在文件直接从命令行运行时运行:

if __name__ == "__main__":
    # code here will be executed only when the module is run directly

这是一个常见的 Python 习语。

顺便说一句,我并没有试图理解你所有的代码,但是utils 中的一些赋值语句可能不会做你想要的,因为它们会影响“内部”runMain 模块而不是“外”层(以__main__ 而不是runMain 运行)。解决这个问题最好的办法是不要有循环的模块依赖,但是如果有,千万不要直接执行循环中的任何模块。

【讨论】:

    猜你喜欢
    • 2018-03-01
    • 2015-05-17
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多