@@ -8080,78 +8080,13 @@ class Group(NamedTuple):
8080
8080
self .assertIs (type (a ), Group )
8081
8081
self .assertEqual (a , (1 , [2 ]))
8082
8082
8083
- def test_namedtuple_keyword_usage (self ):
8084
- with self .assertWarnsRegex (
8085
- DeprecationWarning ,
8086
- "Creating NamedTuple classes using keyword arguments is deprecated"
8087
- ):
8088
- LocalEmployee = NamedTuple ("LocalEmployee" , name = str , age = int )
8089
-
8090
- nick = LocalEmployee ('Nick' , 25 )
8091
- self .assertIsInstance (nick , tuple )
8092
- self .assertEqual (nick .name , 'Nick' )
8093
- self .assertEqual (LocalEmployee .__name__ , 'LocalEmployee' )
8094
- self .assertEqual (LocalEmployee ._fields , ('name' , 'age' ))
8095
- self .assertEqual (LocalEmployee .__annotations__ , dict (name = str , age = int ))
8096
-
8097
- with self .assertRaisesRegex (
8098
- TypeError ,
8099
- "Either list of fields or keywords can be provided to NamedTuple, not both"
8100
- ):
8101
- NamedTuple ('Name' , [('x' , int )], y = str )
8102
-
8103
- with self .assertRaisesRegex (
8104
- TypeError ,
8105
- "Either list of fields or keywords can be provided to NamedTuple, not both"
8106
- ):
8107
- NamedTuple ('Name' , [], y = str )
8108
-
8109
- with self .assertRaisesRegex (
8110
- TypeError ,
8111
- (
8112
- r"Cannot pass `None` as the 'fields' parameter "
8113
- r"and also specify fields using keyword arguments"
8114
- )
8115
- ):
8116
- NamedTuple ('Name' , None , x = int )
8117
-
8118
- def test_namedtuple_special_keyword_names (self ):
8119
- with self .assertWarnsRegex (
8120
- DeprecationWarning ,
8121
- "Creating NamedTuple classes using keyword arguments is deprecated"
8122
- ):
8123
- NT = NamedTuple ("NT" , cls = type , self = object , typename = str , fields = list )
8124
-
8125
- self .assertEqual (NT .__name__ , 'NT' )
8126
- self .assertEqual (NT ._fields , ('cls' , 'self' , 'typename' , 'fields' ))
8127
- a = NT (cls = str , self = 42 , typename = 'foo' , fields = [('bar' , tuple )])
8128
- self .assertEqual (a .cls , str )
8129
- self .assertEqual (a .self , 42 )
8130
- self .assertEqual (a .typename , 'foo' )
8131
- self .assertEqual (a .fields , [('bar' , tuple )])
8132
-
8133
8083
def test_empty_namedtuple (self ):
8134
- expected_warning = re .escape (
8135
- "Failing to pass a value for the 'fields' parameter is deprecated "
8136
- "and will be disallowed in Python 3.15. "
8137
- "To create a NamedTuple class with 0 fields "
8138
- "using the functional syntax, "
8139
- "pass an empty list, e.g. `NT1 = NamedTuple('NT1', [])`."
8140
- )
8141
- with self .assertWarnsRegex (DeprecationWarning , fr"^{ expected_warning } $" ):
8142
- NT1 = NamedTuple ('NT1' )
8143
-
8144
- expected_warning = re .escape (
8145
- "Passing `None` as the 'fields' parameter is deprecated "
8146
- "and will be disallowed in Python 3.15. "
8147
- "To create a NamedTuple class with 0 fields "
8148
- "using the functional syntax, "
8149
- "pass an empty list, e.g. `NT2 = NamedTuple('NT2', [])`."
8150
- )
8151
- with self .assertWarnsRegex (DeprecationWarning , fr"^{ expected_warning } $" ):
8152
- NT2 = NamedTuple ('NT2' , None )
8084
+ with self .assertRaisesRegex (TypeError , "missing.*required.*argument" ):
8085
+ BAD = NamedTuple ('BAD' )
8153
8086
8154
- NT3 = NamedTuple ('NT2' , [])
8087
+ NT1 = NamedTuple ('NT1' , {})
8088
+ NT2 = NamedTuple ('NT2' , ())
8089
+ NT3 = NamedTuple ('NT3' , [])
8155
8090
8156
8091
class CNT (NamedTuple ):
8157
8092
pass # empty body
@@ -8166,16 +8101,18 @@ class CNT(NamedTuple):
8166
8101
def test_namedtuple_errors (self ):
8167
8102
with self .assertRaises (TypeError ):
8168
8103
NamedTuple .__new__ ()
8104
+ with self .assertRaisesRegex (TypeError , "object is not iterable" ):
8105
+ NamedTuple ('Name' , None )
8169
8106
8170
8107
with self .assertRaisesRegex (
8171
8108
TypeError ,
8172
- "missing 1 required positional argument "
8109
+ "missing 2 required positional arguments "
8173
8110
):
8174
8111
NamedTuple ()
8175
8112
8176
8113
with self .assertRaisesRegex (
8177
8114
TypeError ,
8178
- "takes from 1 to 2 positional arguments but 3 were given"
8115
+ "takes 2 positional arguments but 3 were given"
8179
8116
):
8180
8117
NamedTuple ('Emp' , [('name' , str )], None )
8181
8118
@@ -8187,10 +8124,22 @@ def test_namedtuple_errors(self):
8187
8124
8188
8125
with self .assertRaisesRegex (
8189
8126
TypeError ,
8190
- "missing 1 required positional argument: 'typename' "
8127
+ "got some positional-only arguments passed as keyword arguments "
8191
8128
):
8192
8129
NamedTuple (typename = 'Emp' , name = str , id = int )
8193
8130
8131
+ with self .assertRaisesRegex (
8132
+ TypeError ,
8133
+ "got an unexpected keyword argument"
8134
+ ):
8135
+ NamedTuple ('Name' , [('x' , int )], y = str )
8136
+
8137
+ with self .assertRaisesRegex (
8138
+ TypeError ,
8139
+ "got an unexpected keyword argument"
8140
+ ):
8141
+ NamedTuple ('Name' , [], y = str )
8142
+
8194
8143
def test_copy_and_pickle (self ):
8195
8144
global Emp # pickle wants to reference the class by name
8196
8145
Emp = NamedTuple ('Emp' , [('name' , str ), ('cool' , int )])
0 commit comments