Opened 4 weeks ago
Last modified 30 hours ago
#36712 assigned Bug
Deferred type annotations on template tags lead to TypeError with Python 3.14
| Reported by: | Patrick Rauscher | Owned by: | Jacob Walls |
|---|---|---|---|
| Component: | Template system | Version: | 5.2 |
| Severity: | Release blocker | Keywords: | typing, inspect, deferred annotations |
| Cc: | Patrick Rauscher | Triage Stage: | Accepted |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Similar to #36696 (which covered mainly Signals) this covers templatetags, where issues may happen when using SafeText:
from typing import TYPE_CHECKING
from django import template
from django.utils.html import escape
if TYPE_CHECKING:
from django.utils.safestring import SafeText
register = template.Library()
@register.filter("example")
def example_filter(value: str) -> SafeText:
return escape(value)
When using the templatetag, django/template/base.py line 763 (in django 5.2.8) will call inspect.getfullargspec for the filter, leading to a NameError which gets translated by inspect to a TypeError: unsupported callable. After searching a bit through the code this may also happen with views, as several parts of django use inspect directly for different checks (e.g. for templatetags it is used to check the number of arguments).
Not sure if this is a bug in python or django yet. One solution in django would be to replace direct calls to inspect.signature or inspect.getfullargspec (which uses inspect.signature internally according to python docs, but does not allow to specify an annotation_format.
Change History (10)
comment:1 by , 4 weeks ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
comment:2 by , 4 weeks ago
| Component: | Uncategorized → Template system |
|---|---|
| Keywords: | typing inspect deferred annotations added |
| Severity: | Normal → Release blocker |
| Triage Stage: | Unreviewed → Accepted |
| Type: | Uncategorized → Bug |
comment:3 by , 3 weeks ago
Hi patrick, after some looking into the problem, it seems that this more a python problem instead of a django problem, because i tested on these versions: 3.12.3, 3.13.2, and the TypeError didnt raised, only at the version 3.14 as you tested, im studying other alternatives to solve this specific problem, depending on my progress, i will open a PR to give a suggestion
comment:4 by , 3 weeks ago
| Needs tests: | set |
|---|
comment:6 by , 3 weeks ago
| Has patch: | set |
|---|
follow-up: 8 comment:7 by , 3 weeks ago
| Summary: | Deferred Annotations on Template Tags lead to TypeError with Python 3.14 → Deferred type annotations on template tags lead to TypeError with Python 3.14 |
|---|
Just renamed the ticket to avoid "deferred annotation" ambiguity with ORM language.
comment:8 by , 3 weeks ago
Replying to Simon Charette:
Just renamed the ticket to avoid "deferred annotation" ambiguity with ORM language.
Ok, thanks
comment:9 by , 10 days ago
| Has patch: | unset |
|---|---|
| Needs tests: | unset |
| Owner: | changed from to |
Thanks for the report. We should migrate away from getfullargspec() anyway:
See also this deprecation proposal.