尽管xxx是全局定义的,但预期NameError:name'xxx'未定义

时间:2017-10-26 20:17:32

标签: python-3.x compiler-errors global-variables undefined global

  

我成了这个错误:

     

文件“xx.py”,第60行,在模块

中      
    

Kontrolle.Check()

  
     

文件“xx.py”,第55行,检查

     
    

如果isSigned == True:

  
     

NameError:未定义名称'isSigned'

import hashlib  
global security 
class Sicherheit:
    global isSigned
    global passwordFile
    def Signup(self):
        passwordFile = 'usercreds.tmp'  
        security = False
        isSigned = False #!
        print("Sie müssen sich erst anmelden!\n")

        usernameInput = input("Bitte geben Sie Ihren Nutzername ein... \n") 
        passwordInput = input("Bitte geben Sie Ihr Passwort ein... \n")

        usernameInputHashed = hashlib.sha512(usernameInput.encode()) 
        passwordInputHashed = hashlib.sha512(passwordInput.encode())

        with open(passwordFile, 'w') as f:
            f.write(str(usernameInputHashed.hexdigest()))
            f.write('\n')
            f.write(str(passwordInputHashed.hexdigest()))
            f.close()  
        self.Login()  # Moves onto the login def
        isSigned = True

    def Login(self):
        security = False
        print("Sie müssen sich einloggen!\n")

        usernameEntry = input("Bitte geben Sie Ihren Nutzername ein... \n")  
        passwordEntry = input("Bitte geben Sie Ihr Passwort ein... \n")

        usernameEntry = hashlib.sha512(usernameEntry.encode())  
        passwordEntry = hashlib.sha512(passwordEntry.encode())

        usernameEntryHashed = usernameEntry.hexdigest() 
        passwordEntryHashed = passwordEntry.hexdigest()

        with open(passwordFile) as r:
            info = r.readlines()
            usernameInFile = info[0].rstrip()
            passwordInFile = info[1].rstrip() 

        if usernameEntryHashed == usernameInFile and passwordEntryHashed == passwordInFile:  
            print("Anmeldung war erfolgreich!\n")
            security = True

        else:
            print("Anmeldung war nicht erfolgreich!!!\n")
            security = False

    def Check(self):
        if isSigned == True:
            self.Login()
        else:
            self.Signup()
Kontrolle = Sicherheit()
Kontrolle.Check()
while security :
  

我已定义它(作为全局),它仍然会出现此错误。

     

我在等待你的帮助

     

非常感谢提前

1 个答案:

答案 0 :(得分:0)

请参阅有关global的python文档 https://docs.python.org/release/2.4/ref/global.html

它说,“全局声明是一个声明,它适用于整个当前的代码块。”因此,您必须在要访问它的代码块中创建变量global。请尝试以下代码:

import hashlib
security = False
isSigned = False
passwordFile = 'usercreds.tmp'
class Sicherheit:

    def Signup(self):
        global isSigned
        print("sign up Sie müssen sich erst anmelden!\n")
        usernameInput = input("Bitte geben Sie Ihren Nutzername ein... \n") 
        passwordInput = input("Bitte geben Sie Ihr Passwort ein... \n")

        usernameInputHashed = hashlib.sha512(usernameInput.encode()) 
        passwordInputHashed = hashlib.sha512(passwordInput.encode())

        with open(passwordFile, 'w') as f:
            f.write(str(usernameInputHashed.hexdigest()))
            f.write('\n')
            f.write(str(passwordInputHashed.hexdigest()))
            f.close()  
        self.Login()  # Moves onto the login def
        isSigned = True

    def Login(self):
        global security
        security = False
        print("Sie müssen sich einloggen!\n")

        usernameEntry = input("Bitte geben Sie Ihren Nutzername ein... \n")  
        passwordEntry = input("Bitte geben Sie Ihr Passwort ein... \n")

        usernameEntry = hashlib.sha512(usernameEntry.encode())  
        passwordEntry = hashlib.sha512(passwordEntry.encode())

        usernameEntryHashed = usernameEntry.hexdigest() 
        passwordEntryHashed = passwordEntry.hexdigest()

        with open(passwordFile) as r:
            info = r.readlines()
            usernameInFile = info[0].rstrip()
            passwordInFile = info[1].rstrip() 

        if usernameEntryHashed == usernameInFile and passwordEntryHashed == passwordInFile:  
            print("Anmeldung war erfolgreich!\n")
            security = True

        else:
            print("Anmeldung war nicht erfolgreich!!!\n")
            security = False

    def Check(self):
        global isSigned
        if isSigned == True:
            self.Login()
        else:
            self.Signup()
Kontrolle = Sicherheit()
Kontrolle.Check()

实际上你根本不需要全局变量。将这些变量声明为类的成员变量并使用self进行访问。请尝试以下代码:

import hashlib  
class Sicherheit:
    security = False
    isSigned = False
    passwordFile = 'usercreds.tmp'
    def Signup(self):
        print("Sie müssen sich erst anmelden!\n")
        usernameInput = input("Bitte geben Sie Ihren Nutzername ein... \n") 
        passwordInput = input("Bitte geben Sie Ihr Passwort ein... \n")

        usernameInputHashed = hashlib.sha512(usernameInput.encode()) 
        passwordInputHashed = hashlib.sha512(passwordInput.encode())

        with open(self.passwordFile, 'w') as f:
            f.write(str(usernameInputHashed.hexdigest()))
            f.write('\n')
            f.write(str(passwordInputHashed.hexdigest()))
            f.close()  
        self.Login()  # Moves onto the login def
        self.isSigned = True

    def Login(self):
        self.security = False
        print("Sie müssen sich einloggen!\n")

        usernameEntry = input("Bitte geben Sie Ihren Nutzername ein... \n")  
        passwordEntry = input("Bitte geben Sie Ihr Passwort ein... \n")

        usernameEntry = hashlib.sha512(usernameEntry.encode())  
        passwordEntry = hashlib.sha512(passwordEntry.encode())

        usernameEntryHashed = usernameEntry.hexdigest() 
        passwordEntryHashed = passwordEntry.hexdigest()

        with open(self.passwordFile) as r:
            info = r.readlines()
            usernameInFile = info[0].rstrip()
            passwordInFile = info[1].rstrip() 

        if usernameEntryHashed == usernameInFile and passwordEntryHashed == passwordInFile:  
            print("Anmeldung war erfolgreich!\n")
            self.security = True

        else:
            print("Anmeldung war nicht erfolgreich!!!\n")
            self.security = False

    def Check(self):
        if self.isSigned == True:
            self.Login()
        else:
            self.Signup()
Kontrolle = Sicherheit()
Kontrolle.Check()