Я выполняю всю мою проверку формы в классе и хотел бы получить ошибки от класса до отображаемого html. Один из подходов, о котором я думал, - создать глобальную переменную "c", которая сохранит все ошибки и установит их из класса, поскольку я все же хочу, чтобы отдельные методы возвращали false, когда они терпят неудачу. Вот пример кода:
class User():
def add(self):
#Check that e-mail has been completed
try:
#Validate e-mail address
if (isAddressValid(self.email)):
c.error = 'Invalid e-mail address'
return 0
except NameError:
c.error = 'No e-mail address specified'
return 0
Есть ли лучший или предпочтительный способ сделать это?
Спасибо.
Мне нравится использовать словарь для хранения ошибок и предупреждений. Затем я могу либо показать все ошибки в верхней части формы, либо в строке. Я также определяю переменные error
и warning
, поэтому я могу легко разделить их на две части.
class User(object):
def __init__(self):
self.messages = {}
def add(self):
error = False
warning = False
#Check that name has a space
try:
if (self.name.find(' ') == -1):
warning = True
self.messages['email'] = {'type': 'warning',
'msg': 'Your name has no space.'}
except NameError:
error = True
self.messages['email'] = {'type': 'error',
'msg': 'You have no name.'}
#Check that e-mail has been completed
try:
#Validate e-mail address
if (isAddressValid(self.email)):
error = True
self.messages['email'] = {'type': 'error',
'msg': 'Invalid e-mail address'}
except NameError:
error = True
self.messages['email'] = {'type': 'error',
'msg': 'No e-mail address specified'}
return error, warning
Да, определенно, и мое предложение состоит в том, чтобы вообще не возвращать коды статуса.
Вообще говоря, существует много литературы против использования кодов состояния и глобальных переменных для хранения деталей для обработки ошибок в среде высокого уровня, такой как Python.
Ned Batchelder написал очень хорошую статью по этому вопросу; Я настоятельно рекомендую вам прочитать эту страницу для сквозных списков причин, почему обработка исключений обычно считается превосходным методом.
Но, поскольку мы говорим о Python, официальный способ обмениваться исключениями и ошибками - это обработка исключений. Период.
Используя любой другой способ, вы сделаете свой код против общих ожиданий для кода Python, то есть его будет труднее читать и поддерживать.
В контексте веб-приложения вы можете просто заполнить tmpl_context
.
from pylons import tmpl_context as c
from yourproject.lib.base import BaseController, render
class MyController(BaseController):
def index(self):
c.error = 'Invalid e-mail address'
return render('/mytemplate.mako')
Где 'mytemplate.mako'
содержимое файла:
% if c.error:
error: ${c.error}
% endif
В общем коде python вы можете:
Вы можете вернуть кортеж из своей функции (это не предпочтительный путь):
class Error(Exception):
pass
def isvalid(something):
return False, Error("'%s' is invalid" % (something,))
Пример:
ok, err = isvalid(object())
if not ok:
print err
Если непосредственный вызывающий объект не должен обрабатывать ошибку из вашей функции, тогда исключение может использоваться для передачи информации об ошибке в стек.
def do_stuff(something):
if not something.isready():
raise Error("'%s' is not ready to do stuff" % (something,))
Пример:
class C(object):
def isready(self):
return False
def run():
# no error handling here
do_stuff(C())
# do something else
try: run()
except Error, e:
print e
def do_stuff(something, onerror=lambda err: None):
if not something.isready():
onerror(Error("'%s' is not ready to do stuff" % (something,)))
Пример:
do = lambda: do_stuff(C(), onerror=repeat)
def repeat(err):
"""Repeat until success."""
print err
time.sleep(5)
do() # possible infinite loop
do()
validate
декоратора , как описано в wiki.pylonshq.com/display/pylonsdocs/...