编程语言
首页 > 编程语言> > python – 为什么未定义的变量大于mako模板中的数字?

python – 为什么未定义的变量大于mako模板中的数字?

作者:互联网

我使用一个名为x的变量,x未定义,并使用x与mako模板中的数字进行比较:

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

为什么这句话不会导致异常或错误?但是当我想打印出来的时候:

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

它引起了例外.为什么?

这是在mako.为什么我不能在IPython中使用这句话?因为如果我在IPython中使用未定义的变量,它会告诉我变量没有突然定义.

解决方法:

这是因为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

请注意,在mako.template.Template和mako.lookup.TemplateLookup中都可以使用strict_undefined.

documentation的描述是:

Replaces the automatic usage of UNDEFINED for any undeclared variables not located in the Context with an immediate raise of NameError. The advantage is immediate reporting of missing variables which include the name. New in 0.3.6.

标签:mako,python
来源: https://codeday.me/bug/20190826/1731112.html