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 Augusto Pontes, 7 hours ago

Owner: set to Augusto Pontes
Status: newassigned

comment:2 by Jacob Walls, 62 minutes ago

Component: UncategorizedTemplate system
Keywords: typing inspect deferred annotations added
Severity: NormalRelease blocker
Triage Stage: UnreviewedAccepted
Type: UncategorizedBug

Thanks for the report. We should migrate away from getfullargspec() anyway:

Note that signature() and Signature Object provide the recommended API for callable introspection, and support additional behaviours (like positional-only arguments) that are sometimes encountered in extension module APIs. This function is retained primarily for use in code that needs to maintain compatibility with the Python 2 inspect module API.

See also this deprecation proposal.

Note: See TracTickets for help on using tickets.
Back to Top