2017-08-26 16 views
0

我在python中得到一個屬性錯誤,但我已經導入了我需要的所有東西。這是令人困惑的,因爲這似乎合乎邏輯,這將工作沒有任何事情或秩序,我不認爲,雖然我是說來自java背景。屬性錯誤來自一個新文件的Python

這是在一個叫做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'。

+0

從何處導入'utils'? – AetherUnbound

+0

utils是一個文件,它被導入到runMain文件 –

+0

那麼你的問題不是'runMain'導入,而是'utils'導入。你可以發佈'utils'的內容嗎? – AetherUnbound

回答

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或把他們的第三模塊在包括在utilsrunMain中;衛裏面runMain.py的代碼,只有當文件被直接在命令行中運行運行的if聲明:

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

這是一個普通的Python的成語。順便說一下,我沒有試圖理解你的所有代碼,但utils中的一些賦值語句可能不會做你想做的事情,因爲它們影響「內部」runMain模塊而不是「外部「層(其運行爲__main__而不是runMain)。這個問題的最佳解決方案是不具有循環模塊依賴性,但如果這樣做,則不應直接在循環中執行任何模塊。