@@ -69,6 +69,17 @@ class CodeStyleChecker(BaseChecker):
69
69
"default_enabled" : False ,
70
70
},
71
71
),
72
+ "R6105" : (
73
+ "Prefer 'typing.NamedTuple' over 'collections.namedtuple'" ,
74
+ "prefer-typing-namedtuple" ,
75
+ "'typing.NamedTuple' uses the well-known 'class' keyword "
76
+ "with type-hints for readability (it's also faster as it avoids "
77
+ "an internal exec call).\n "
78
+ "Disabled by default!" ,
79
+ {
80
+ "default_enabled" : False ,
81
+ },
82
+ ),
72
83
}
73
84
options = (
74
85
(
@@ -89,12 +100,22 @@ class CodeStyleChecker(BaseChecker):
89
100
90
101
def open (self ) -> None :
91
102
py_version = self .linter .config .py_version
103
+ self ._py36_plus = py_version >= (3 , 6 )
92
104
self ._py38_plus = py_version >= (3 , 8 )
93
105
self ._max_length : int = (
94
106
self .linter .config .max_line_length_suggestions
95
107
or self .linter .config .max_line_length
96
108
)
97
109
110
+ @only_required_for_messages ("prefer-typing-namedtuple" )
111
+ def visit_call (self , node : nodes .Call ) -> None :
112
+ if self ._py36_plus :
113
+ called = safe_infer (node .func )
114
+ if called and called .qname () == "collections.namedtuple" :
115
+ self .add_message (
116
+ "prefer-typing-namedtuple" , node = node , confidence = INFERENCE
117
+ )
118
+
98
119
@only_required_for_messages ("consider-using-namedtuple-or-dataclass" )
99
120
def visit_dict (self , node : nodes .Dict ) -> None :
100
121
self ._check_dict_consider_namedtuple_dataclass (node )
0 commit comments