未在python中定义全局名称
我得到一个名称错误:没有定义全局名称“valid\u username”,这让我很困惑。为什么会这样?我在实际调用之前声明了有效的_username函数,那么问题出在哪里 以下是代码完整代码:未在python中定义全局名称,python,Python,我得到一个名称错误:没有定义全局名称“valid\u username”,这让我很困惑。为什么会这样?我在实际调用之前声明了有效的_username函数,那么问题出在哪里 以下是代码完整代码: import webapp2 import cgi import re class WelcomeHandler(webapp2.RequestHandler): def get(self): self.response.out.write("Welcome, ") clas
import webapp2
import cgi
import re
class WelcomeHandler(webapp2.RequestHandler):
def get(self):
self.response.out.write("Welcome, ")
class MainPage(webapp2.RequestHandler):
def write_form(self, username="", username_error="", password_error="", verify_password_error="", email="",
email_error=""):
self.response.out.write(form % {
"username": username, "username_error": username_error,
"password_error": password_error,
"verify_password_error": verify_password_error,
"email": email, "email_error": email_error})
def checkEscaped(text):
return cgi.escape(text, quote="True")
def valid_username(username):
USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
return USER_RE.match(checkEscaped(username))
def valid_password(password):
PASSWORD_RE = re.compile(r"^.{3,20}$")
return PASSWORD_RE.match(checkEscaped(password))
def valid_email(email):
if len(email) > 0:
EMAIL_RE = re.compile(r"^[\S]+@[\S]+\.[\S]+$")
return EMAIL_RE.match(checkEscaped(email))
else:
return True
def password_match(password, confirmPassword):
return password == confirmPassword
def get(self):
self.write_form()
def post(self):
input_username = self.request.get('username')
input_password = self.request.get('password')
input_verify_password = self.request.get('verify_password')
input_email = self.request.get('email')
username_error = ""
is_valid_name = valid_username(input_username)
if not is_valid_name:
username_error = "That's not a valid username."
password_error = ""
is_valid_password = valid_password(input_password)
if not is_valid_password:
password_error = "That wasn't a valid password."
verify_password_error = ""
is_valid_verify_password = password_match(input_password, input_verify_password)
if not is_valid_verify_password:
verify_password_error = "the passwords don't match"
email_error = ""
is_valid_email = valid_email(input_email)
if not is_valid_email:
email_error = "that's not a valid email"
if not (is_valid_name and is_valid_password and is_valid_verify_password and is_valid_email):
self.write_form(name, username_error, password_error, verify_password_error, email, email_error)
else:
self.redirect("/welcome")
app = webapp2.WSGIApplication([
('/', MainPage), ('/welcome', WelcomeHandler)], debug=True)
您需要通过
self
对象引用实例上的方法:
is_valid_password = self.valid_password(input_password)
你在其他地方也有同样的问题checkEscaped()
应该是self.checkEscaped()
,password\u match()
应该是self.password\u match()
,等等
方法不是全局或局部
接下来,您的方法也应该接受self
引用;您自己的每个方法都缺少必需的参数:
def checkEscaped(self, text):
# ...
def valid_username(self, username):
# ...
def valid_password(self, password):
# ...
def valid_email(self, email):
# ...
def password_match(self, password, confirmPassword):
# ...
当然,您可以将这四个方法移出类,并实际使它们成为全局函数而不是方法。在这种情况下,请再次关闭
self
参数。您需要通过self
对象引用实例上的方法:
is_valid_password = self.valid_password(input_password)
你在其他地方也有同样的问题checkEscaped()
应该是self.checkEscaped()
,password\u match()
应该是self.password\u match()
,等等
方法不是全局或局部
接下来,您的方法也应该接受self
引用;您自己的每个方法都缺少必需的参数:
def checkEscaped(self, text):
# ...
def valid_username(self, username):
# ...
def valid_password(self, password):
# ...
def valid_email(self, email):
# ...
def password_match(self, password, confirmPassword):
# ...
当然,您可以将这四个方法移出类,并实际使它们成为全局函数而不是方法。在这种情况下,请再次关闭
self
参数。您需要通过self
对象引用实例上的方法:
is_valid_password = self.valid_password(input_password)
你在其他地方也有同样的问题checkEscaped()
应该是self.checkEscaped()
,password\u match()
应该是self.password\u match()
,等等
方法不是全局或局部
接下来,您的方法也应该接受self
引用;您自己的每个方法都缺少必需的参数:
def checkEscaped(self, text):
# ...
def valid_username(self, username):
# ...
def valid_password(self, password):
# ...
def valid_email(self, email):
# ...
def password_match(self, password, confirmPassword):
# ...
当然,您可以将这四个方法移出类,并实际使它们成为全局函数而不是方法。在这种情况下,请再次关闭
self
参数。您需要通过self
对象引用实例上的方法:
is_valid_password = self.valid_password(input_password)
你在其他地方也有同样的问题checkEscaped()
应该是self.checkEscaped()
,password\u match()
应该是self.password\u match()
,等等
方法不是全局或局部
接下来,您的方法也应该接受self
引用;您自己的每个方法都缺少必需的参数:
def checkEscaped(self, text):
# ...
def valid_username(self, username):
# ...
def valid_password(self, password):
# ...
def valid_email(self, email):
# ...
def password_match(self, password, confirmPassword):
# ...
当然,您可以将这四个方法移出类,并实际使它们成为全局函数而不是方法。在这种情况下,请再次关闭
self
参数。并且大多数操作代码的方法定义也缺少self
参数。@PM2Ring yes,您是对的。来自java——这些函数调用是隐式的there@nsmirosh:很公平。我们在Python中的OOP有点不同。但我相信你很快就会掌握窍门的。:)@PM2Ring为什么你需要在函数中到处传递“self”?@nsmirosh:你只需要在方法中传递这些,因为Python就是这样让你访问当前实例的。而且大多数操作代码的方法定义也缺少self
args。@PM2Ring是的,你是对的。来自java——这些函数调用是隐式的there@nsmirosh:很公平。我们在Python中的OOP有点不同。但我相信你很快就会掌握窍门的。:)@PM2Ring为什么你需要在函数中到处传递“self”?@nsmirosh:你只需要在方法中传递这些,因为Python就是这样让你访问当前实例的。而且大多数操作代码的方法定义也缺少self
args。@PM2Ring是的,你是对的。来自java——这些函数调用是隐式的there@nsmirosh:很公平。我们在Python中的OOP有点不同。但我相信你很快就会掌握窍门的。:)@PM2Ring为什么你需要在函数中到处传递“self”?@nsmirosh:你只需要在方法中传递这些,因为Python就是这样让你访问当前实例的。而且大多数操作代码的方法定义也缺少self
args。@PM2Ring是的,你是对的。来自java——这些函数调用是隐式的there@nsmirosh:很公平。我们在Python中的OOP有点不同。但我相信你很快就会掌握窍门的。:)@PM2Ring为什么你需要在函数中到处传递“self”?@nsmirosh:你只需要在方法中传递这些,因为Python就是这样让你访问当前实例的。