Add docs for as_function and apply (#38730)

Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com>
This commit is contained in:
David Poll 2025-05-26 11:23:00 -07:00 committed by GitHub
parent 639c7cd8e3
commit 8ddf4baee1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -63,7 +63,8 @@ Jinja supports a set of language extensions that add new functionality to the la
To improve the experience of writing Jinja templates, we have enabled the following To improve the experience of writing Jinja templates, we have enabled the following
extensions: extensions:
- [Loop Controls](https://jinja.palletsprojects.com/en/3.0.x/extensions/#loop-controls) (`break` and `continue`) - [Loop Controls](https://jinja.palletsprojects.com/en/stable/extensions/#loop-controls) (`break` and `continue`)
- [Expression Statement](https://jinja.palletsprojects.com/en/stable/extensions/#expression-statement) (`do`)
### Reusing templates ### Reusing templates
@ -79,7 +80,7 @@ For example, you might define a macro in a template in `config/custom_templates/
{% raw %} {% raw %}
```text ```jinja
{% macro format_entity(entity_id) %} {% macro format_entity(entity_id) %}
{{ state_attr(entity_id, 'friendly_name') }} - {{ states(entity_id) }} {{ state_attr(entity_id, 'friendly_name') }} - {{ states(entity_id) }}
{% endmacro %} {% endmacro %}
@ -91,13 +92,32 @@ In your automations, you could then reuse this macro by importing it:
{% raw %} {% raw %}
```text ```jinja
{% from 'formatter.jinja' import format_entity %} {% from 'formatter.jinja' import format_entity %}
{{ format_entity('sensor.temperature') }} {{ format_entity('sensor.temperature') }}
``` ```
{$ endraw %}
Home Assistant also allows you to write macros with non-string return values by
taking a named argument called `returns` and calling it with a return value. Once created,
pass the macro into the `as_function` filter to use the returned value:
{% raw %}
```jinja
{%- macro macro_is_switch(entity_name, returns) -%}
{%- do returns(entity_name.startswith('switch.')) -%}
{%- endmacro -%}
{%- set is_switch = macro_is_switch | as_function -%}
{{ "It's a switch!" if is_switch("switch.my_switch") else "Not a switch!" }}
```
{% endraw %} {% endraw %}
In this way, you can export utility functions that return scalar or complex values rather than
just macros that render to strings.
## Home Assistant template extensions ## Home Assistant template extensions
Extensions allow templates to access all of the Home Assistant specific states and adds other convenience functions and filters. Extensions allow templates to access all of the Home Assistant specific states and adds other convenience functions and filters.
@ -1361,6 +1381,26 @@ Some examples:
{% endraw %} {% endraw %}
### Working with macros
Home Assistant provides two additional functions that make macros much more powerful.
{% raw %}
- `apply` is both a filter and a test that allows you to use any callable (macros or functions) wherever
you can use other filters and tests. `apply` also passes along any additional parameters to the function.
For example, if you had a function called `double`, you could call
`{{ [1, 2, 3, 4] | map('apply', double) | list }}`, which would render as `[2, 4, 6, 8]`.
Alternatively, if you had a function called `is_multiple_of`, you could call
`{{ [1, 2, 3, 4] | select('apply', is_multiple_of, 2) | list }}`, which would render as `[2, 4]`.
- `as_function` is a filter that takes a macro that has a named parameter called `returns`. The macro can
then call `{%- do returns(return_value) -%}`. After passing this macro into `as_function`, the resulting
function returns your return value directly, preserving the underlying data type rather than rendering
a string. You can return dictionaries, numbers, `True`/`False` (allowing you to write your own tests when
used with `apply`), or any other value your code might produce.
{% endraw %}
## Merge action responses ## Merge action responses
Using action responses we can collect information from various entities at the same time. Using action responses we can collect information from various entities at the same time.