2012-02-02 2 views
3

Я использую переменную x, то x не определен, и использовать x для сравнения с номером в мако шаблона:Почему неопределенная переменная больше числа в шаблоне mako?

%if x>5: 
    <h1>helloworld</h1> 
%endif 

И почему это предложение не вызовет исключение или ошибку? Но когда я хочу распечатать это сообщение:

%if x>5: 
    <h1>${x}</h1> 
%endif 

это вызвало исключение. Зачем?

Это в мако. Почему я не могу использовать это предложение в IPython? Потому что, если я использую неопределенную переменную в IPython, она скажет мне, что переменная не определена внезапно.

+1

Не могли бы вы высказать исключение, которое это дает? –

ответ

6

Это потому, что mako использует по умолчанию Undefined объекта, которая не только тогда, когда оказывается, но может быть использован в логических выражениях, поскольку реализует __nonzero__ метод:

class Undefined(object): 
    """Represents an undefined value in a template. 

    All template modules have a constant value 
    ``UNDEFINED`` present which is an instance of this 
    object. 

    """ 
    def __str__(self): 
     raise NameError("Undefined") 
    def __nonzero__(self): 
     return False 

UNDEFINED = Undefined() 

Чтобы использовать неопределенное значение, которое не удается даже в логических выражениях , вы можете использовать strict_undefined аргумент следующим образом:

>>> from mako.template import Template 
>>> mytemplate = Template("""%if x>5: 
...  <h1>helloworld</h1> 
... %endif""", strict_undefined=True) 
>>> mytemplate.render() 
... 
NameError: 'x' is not defined 

strict_undefined Обратите внимание, что имеется в обоих mako.template.Template и mako.lookup.TemplateLookup.

Описание от documentation является:

Заменяет автоматическое использование неопределенных для любых необъявленных переменных не находятся в контексте с немедленным повышением NameError. Преимуществом является немедленная отчетность о недостающих переменных, которые включают имя. Новое в 0.3.6.

+0

+1 Хороший ответ, полный и с большим количеством пример кода. –

+0

@RaymondHettinger Спасибо, я ценю это. – jcollado

+0

thanx alot, ваш ответ мне очень помогает – yudun1989