почему неопределенная переменная больше, чем число в шаблоне mako? - PullRequest
3 голосов
/ 02 февраля 2012

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

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

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

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

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

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

1 Ответ

6 голосов
/ 02 февраля 2012

Это потому, что 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.

Описание из документации :

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

...