如何向Jinja宏传递额外参数(*args和**kwargs)?
source link: https://greyli.com/use-kwargs-args-in-jinja-macro/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
如何向Jinja宏传递额外参数(*args和**kwargs)?
这段时间有多个读者问关于Jinja宏定义时的参数接受问题。这一点在《Flask Web开发实战》里没有介绍,这篇文章作为一个补充。
一个不符合直觉的设定
在某个晴朗的早晨,你打开电脑,想在你的项目Jinja模板里编写一个宏来简化操作。按照直觉,你可能会像定义Python函数那样来定义宏,传入**kwargs来让它接收任意数量的关键字参数,比如:
或是传入*args让它接收任意数量的位置参数:
遗憾的是,上面的调用会分别获得下面的错误信息:
在Jinja宏里接收额外的关键字参数和位置参数
在Jinja中,宏默认会自动接收额外的关键字参数和位置参数,并在宏内部提供kwargs和varargs特殊变量来获取它们。具体来说,在定义宏的时候,不需要进行任何声明。在宏的内部,你可以直接使用kwargs字典来获取额外的关键字参数;同样的,你可以使用varargs元组来获取额外传入的位置参数。
下面是使用kwargs的示例:
你可以把这个字典传递给其他函数,比如url_for():
下面是使用varargs的示例:
提示 在宏内部,如果kwargs字典里没有对应的键,那么会返回空字符串,而不是抛出KeyError异常;如果向varargs元组索引一个超出范围的下标值,也会返回空值,而不会抛出IndexError异常。
隐藏的陷阱
虽然宏自动处理额外传入的关键字参数和位置参数,但是这里有一个隐藏的小陷阱。如果你在调用一个宏的时候传入了额外的关键字参数和位置参数,但是宏的内部并没有使用它们,这时就会出错。比如下面使用kwargs的示例:
调用宏的时候传入了name参数,但是宏内部并没有使用它,这时Jinja会抛出下面的异常:
类似的是位置参数,你会获得下面的异常:
所以,如果你想让某个宏接收额外的关键字参数或位置参数,你就分别需要在这个宏内部至少调用一次(access)kwargs字典或是varargs元组。一般情况下,你并不需要担心这个问题。
本文隶属于《Flask Web开发实战》番外文章系列。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK