В контексте веб-приложения вы можете просто заполнить 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()