未定义类型

这些类可以用作未定义类型。 Environment 的构造函数接受一个可以是那些类或一个 Undefined 的自定义子类的 undefined 参数。无论何时,这些对象创建或返回时,模板引擎都不能查出其名称或访问其属性。未定义值上的某些操作之后是允许的,而其它的会失败。

最接近常规 Python 行为的是 StrictUndefined ,如果它是一个未定义对象,它不允许除了测试之外的一切操作。

  • _class _jinja2.Undefined
  • The default undefined type. This undefined type can be printed anditerated over, but every other access will raise an UndefinedError:
  1. >>> foo = Undefined(name='foo')
  2. >>> str(foo)
  3. ''
  4. >>> not foo
  5. True
  6. >>> foo + 42
  7. Traceback (most recent call last):
  8. ...
  9. UndefinedError: 'foo' is undefined
  • _undefined_hint
  • None 或给未定义对象的错误消息 unicode 字符串。

  • _undefined_obj

  • None 或引起未定义对象创建的对象(例如一个属性不存在)。

  • _undefined_name

  • 未定义变量/属性的名称,如果没有此类信息,留为 None

  • _undefined_exception

  • 未定义对象想要抛出的异常。这通常是 UndefinedError 或SecurityError 之一。

  • fail_with_undefined_error(args, *kwargs_)

  • 参数任意,调用这个方法时会抛出带有由未定义对象上存储的未定义hint 生成的错误信息的 _undefined_exception 异常。
  • _class _jinja2.DebugUndefined
  • An undefined that returns the debug info when printed.
  1. >>> foo = DebugUndefined(name='foo')
  2. >>> str(foo)
  3. '{{ foo }}'
  4. >>> not foo
  5. True
  6. >>> foo + 42
  7. Traceback (most recent call last):
  8. ...
  9. UndefinedError: 'foo' is undefined
  • _class _jinja2.StrictUndefined
  • An undefined that barks on print and iteration as well as booleantests and all kinds of comparisons. In other words: you can do nothingwith it except checking if it’s defined using the defined test.
  1. >>> foo = StrictUndefined(name='foo')
  2. >>> str(foo)
  3. Traceback (most recent call last):
  4. ...
  5. UndefinedError: 'foo' is undefined
  6. >>> not foo
  7. Traceback (most recent call last):
  8. ...
  9. UndefinedError: 'foo' is undefined
  10. >>> foo + 42
  11. Traceback (most recent call last):
  12. ...
  13. UndefinedError: 'foo' is undefined

未定义对象由调用 undefined 创建。

实现

Undefined 对象通过重载特殊的 underscore 方法实现。例如默认的 Undefined 类实现 unicode 为返回一个空字符串,但int 和其它会始终抛出异常。你可以自己通过返回 0 实现转换为int:

  1. class NullUndefined(Undefined):
  2. def __int__(self):
  3. return 0
  4. def __float__(self):
  5. return 0.0

要禁用一个方法,重载它并抛出 _undefined_exception 。因为这在未定义对象中非常常用,未定义对象有辅助方法_fail_with_undefined_error() 自动抛出错误。这里的一个类工作类似正规的 Undefined ,但它在迭代时阻塞:

class NonIterableUndefined(Undefined):
iter = Undefined._fail_with_undefined_error