8000 Do not allow class-level keywords for `NamedTuple`, refs #16521 · python/mypy@16411e3 · GitHub
[go: up one dir, main page]

Skip to content

Commit 16411e3

Browse files
committed
Do not allow class-level keywords for NamedTuple, refs #16521
1 parent a3e488d commit 16411e3

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

mypy/semanal_namedtuple.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,10 @@ def check_namedtuple_classdef(
204204
)
205205
else:
206206
default_items[name] = stmt.rvalue
207+
if defn.keywords:
208+
for_function = ' for "__init_subclass__" of "NamedTuple"'
209+
for key in defn.keywords:
210+
self.api.msg.unexpected_keyword_argument_for_function(for_function, key, defn)
207211
return items, types, default_items, statements
208212

209213
def check_namedtuple(

mypy/semanal_typeddict.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ def analyze_typeddict_classdef_fields(
325325
total = require_bool_literal_argument(self.api, defn.keywords["total"], "total", True)
326326
if defn.keywords and defn.keywords.keys() != {"total"}:
327327
for_function = ' for "__init_subclass__" of "TypedDict"'
328-
for key in defn.keywords.keys():
328+
for key in defn.keywords:
329329
if key == "total":
330330
continue
331331
self.msg.unexpected_keyword_argument_for_function(for_function, key, defn)

test-data/unit/check-namedtuple.test

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,3 +1354,20 @@ class Test:
13541354
self.item: self.Item # E: Name "self.Item" is not defined
13551355
[builtins fixtures/tuple.pyi]
13561356
[typing fixtures/typing-namedtuple.pyi]
1357+
1358+
[case testNoClassKeywordsForNamedTuple]
1359+
from typing import NamedTuple
1360+
class Test1(NamedTuple, x=1, y=2): # E: Unexpected keyword argument "x" for "__init_subclass__" of "NamedTuple" \
1361+
# E: Unexpected keyword argument "y" for "__init_subclass__" of "NamedTuple"
1362+
...
1363+
1364+
class Meta(type): ...
1365+
1366+
class Test2(NamedTuple, metaclass=Meta): # E: Unexpected keyword argument "metaclass" for "__init_subclass__" of "NamedTuple"
1367+
...
1368+
1369+
# Technically this would work, but it is just easier for the implementation:
1370+
class Test3(NamedTuple, metaclass=type): # E: Unexpected keyword argument "metaclass" for "__init_subclass__" of "NamedTuple"
1371+
...
1372+
[builtins fixtures/tuple.pyi]
1373+
[typing fixtures/typing-namedtuple.pyi]

0 commit comments

Comments
 (0)
0