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

发布于 2025-01-02 07:06:58 字数 377 浏览 1 评论 0原文

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

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

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

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

它引起了异常。为什么?

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

I use a variable called x,the x is not defined, and use x to compare with a number in mako template:

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

And why this sentence not cause an exception or an error? But when I want to print this out:

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

it caused an exception. Why?

This is in mako. Why can't I use this sentence in IPython? Because if I use an undefined variable in IPython, it will tell me variable is not defined suddenly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

洒一地阳光 2025-01-09 07:06:58

实现了 __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()

这是因为 mako 默认情况下使用 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_undefinedmako.template.Template 中都可用代码>和mako.lookup.TemplateLookup。

文档中的描述是:

对于任何不在上下文中的未声明变量,替换自动使用 UNDEFINED 并立即引发 NameError。优点是立即报告丢失的变量,包括名称。 0.3.6 中的新增功能。

That's because mako uses by default an Undefined object that only fails when rendered, but can be used in boolean expressions because implements the __nonzero__ method:

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()

To use an undefined value that fails even in boolean expressions, you can use strict_undefined argument as follows:

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

Note that strict_undefined is available in both mako.template.Template and mako.lookup.TemplateLookup.

The description from the documentation is:

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文