#2269·jinja

在为 `UserDict` 生成字符串时发生了错误

作者: Q7xM4创建于 2026年9月10日更新于 2026年9月16日

当我尝试为 UserDict 生成字符串时,结果是不正确的。为了便于重现,这里有一个测试。

from collections import UserDict
from jinja2 import Environment
model = Environment().from_string('{{ q|urlencode }}')
myUser = UserDict({"Aa": "[email protected]", "Bb": "[email protected]"})
print(model.render(q=myUser))

我期望得到的结果是:

Aa=PersonA%40123.com&Bb=PersonB%40123.com

实际上,我得到的结果是:

A=a&B=b

然后,我对代码做了一些修改。我将 UserDict({"Aa": "[email protected]", "Bb": "[email protected]"}) 修改为 UserDict({"A": "[email protected]", "B": "[email protected]"}) 这次,会直接报告错误。

Traceback (most recent call last):
  File "/home/test.py", line 19, in <module>
    print(model.render(q=myUser))
          ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jinja/src/jinja2/environment.py", line 1292, in render
    self.environment.handle_exception()
  File "/home/jinja/src/jinja2/environment.py", line 941, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/home/jinja/src/jinja2/filters.py", line 173, in do_urlencode
    return "&".join(
           ^^^^^^^^^
  File "/home/jinja/src/jinja2/filters.py", line 174, in <genexpr>
    f"{url_quote(k, for_qs=True)}={url_quote(v, for_qs=True)}" for k, v in items
                                                                   ^^^^
ValueError: not enough values to unpack (expected 2, got 1)