Opened 8 hours ago
Last modified 62 minutes ago
#36712 assigned Bug
Deferred Annotations on Template Tags lead to TypeError with Python 3.14
| Reported by: | Patrick Rauscher | Owned by: | Augusto Pontes |
|---|---|---|---|
| Component: | Template system | Version: | 5.2 |
| Severity: | Release blocker | Keywords: | typing, inspect, deferred annotations |
| Cc: | Patrick Rauscher | Triage Stage: | Accepted |
| Has patch: | no | 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 (2)
comment:1 by , 7 hours ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
comment:2 by , 62 minutes ago
| Component: | Uncategorized → Template system |
|---|---|
| Keywords: | typing inspect deferred annotations added |
| Severity: | Normal → Release blocker |
| Triage Stage: | Unreviewed → Accepted |
| Type: | Uncategorized → Bug |
Thanks for the report. We should migrate away from getfullargspec() anyway:
See also this deprecation proposal.