簡體   English   中英

我不斷獲得未定義的全局名稱“用戶名”嗎?

[英]I keep getting Global name 'username' not defined?

我的問題是,我在此腳本中不斷收到未定義的全局名稱錯誤:

import time
def cls():
    print(("\n")*100)
#Registers the Username and Password for the user.
def registerPro():
    cls()
    username=str(input("Enter your Username here: "))
    password=str(input("Enter your Password here: "))
    confirm=str(input("Please confirm your Password: "))
    if password==confirm:
        cls()
        print("Thank you for registering at Apex Industries!")
        time.sleep(3)
        loggingIn()
    else:
        cls()
        print("Your passwords do not match, please re-register.")
        time.sleep(3)
        registerPro()
    return username, password
#Is called by getUsername. If the user entered the password correctly then the login is successful.
def getPass(password):
    cls()
    confirmPass=str(input("Enter your password: "))
    if confirmPass==password:
        cls()
        print("You have logged in successfully.")
    else:
        cls()
        print("Wrong Password. Try again")
        getPass()
#Makes sure the username is in the database.
def getUsername(username):
    cls()
    confirmUser=str(input("Enter your username: "))
    if confirmUser==username:
        getPass(password)
    else:
        cls()
        print("No username with that name in the database.")
        time.sleep(3)
        loggingIn()
#The login for the main program.
def loggingIn():
    cls()
    print("Hello and welcome to the Apex Industries login/register page.")
    print("      Please choose to either Login or Register.")
    print()
    regLog=str(input("Type Login or Register for your choice: "))
    if regLog=='Login':
        getUsername(username)
    elif regLog=='Register':
        registerPro()
    else:
        cls()
        print("That is not a valid option. Try again.")
        time.sleep(3)
        loggingIn()

loggingIn()

我的回溯給了我這個:

Traceback (most recent call last):
  File "C:/Users/Evu/Desktop/Python/testforLogin", line 59, in <module>
    loggingIn()
  File "C:/Users/Evu/Desktop/Python/testforLogin", line 13, in loggingIn
    registerPro()
  File "C:/Users/Evu/Desktop/Python/testforLogin", line 29, in registerPro
    loggingIn()
  File "C:/Users/Evu/Desktop/Python/testforLogin", line 11, in loggingIn
    getUsername(username)
NameError: global name 'username' is not defined

我究竟做錯了什么? 我想將用戶名導入到我創建的getUsername()函數中。 請記住,我是腳本新手,只是想自己學習,這只是一個測試腳本。 任何建議都很棒。

您正在使用名為username的變量作為參數調用getUsername函數,該變量當時尚未定義。 實際上,它是在getUsername函數中定義的,但也不是username 相反,最終包含實際用戶名的變量是confirmUser 在這種情況下,這種方式很有意義,但是username應包含有效/已注冊的用戶名。 反過來,實際上應該是某種類型的列表,其中包含多個用戶名,為此可能需要專用功能。

有趣的是:您在一開始就使用regLog-thing正確地做到了。 在那里,您可以通過輸入定義regLog,然后檢查其值。

您絕對應該再看一下有關變量,函數(及其參數)以及基本知識的文檔。 哦,應該是raw_input()而不是input() 至少在這種情況下。

這將是我的快速和骯臟(且不完整)的方法:

registeredusers = ['john.doe', 'peter.parker', 'bruce.banner']

def getUsername():
    global registeredusers
    loginname = str(raw_input("Enter username: "))
    if loginname in registeredusers:
        return True
    else:
        return False

def loggingIn():
    regLog = str(raw_input("Login or Register? "))
    if regLog == 'Login':
        if getUsername():
            print "Yay! Logged in"
        else:
            print "Login failed"
    elif regLog == 'Register':
        # do stuff
        pass
    else:
        # do stuff
        pass

loggingIn()

loggingIn()調用getUsername(username)時,您尚未初始化用戶getUsername(username) -您要驗證的用戶名是什么,它來自哪里? 由於它找不到本地username因此它會在全局名稱空間中查找,並且無法在本地username空間中找到-因此出現錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM