Deprecate unusual ways of creating typing.NamedTuple
classes · Issue #105566 · python/cpython (original) (raw)
Feature or enhancement
I propose that we deprecate in Python 3.13 the following unusual ways of constructing a typing.NamedTuple
:
from typing import NamedTuple
Foo = NamedTuple("Foo", x=int, y=int) # NamedTuple with "x" and "y" fields Bar = NamedTuple("Bar") # empty NamedTuple Baz = NamedTuple("Baz", None) # empty NamedTuple Eggs = NamedTuple("Eggs", fields=None) # empty NamedTuple
Pitch
typing.NamedTuple
has been around for quite a while now, but none of the above methods of constructing NamedTuple
s are supported by type checkers. If they're still unsupported by type checkers after all this time, they're unlikely to ever be supported by type checkers.
Deprecating, and eventually removing, these ways of constructing NamedTuple
s will allow us to simplify the code at runtime. It will also be less confusing for users. Every way in which the runtime and type checkers differ in behaviour is a potential point of confusion for users; in general, we should work to keep these points of difference to a minimum.
These methods of constructing NamedTuple
s are not commonly seen in the wild. They're also pretty redundant -- if you want to construct a NamedTuple
in one line, in a single function call, you can do it like this, which is supported by type checkers:
Foo = NamedTuple("Foo", [("x", int), ("y", int)])
If you want to construct an empty NamedTuple
, meanwhile, you can do it in one of the following two ways, which are both supported by type checkers:
Bar = NamedTuple("Bar", []) class Baz(NamedTuple): ...
Previous discussion
For very similar reasons, we previously deprecated and removed the keyword-argument syntax for creating TypedDicts. This was deprecated in 3.11, and removed in 3.13:
- Deprecate keyword args syntax for TypedDict definition #90224
- Remove kwargs-based TypedDict creation #104786