@@ -8080,78 +8080,13 @@ class Group(NamedTuple):
80808080        self .assertIs (type (a ), Group )
80818081        self .assertEqual (a , (1 , [2 ]))
80828082
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- 
81338083    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' )
81538086
8154-         NT3  =  NamedTuple ('NT2' , [])
8087+         NT1  =  NamedTuple ('NT1' , {})
8088+         NT2  =  NamedTuple ('NT2' , ())
8089+         NT3  =  NamedTuple ('NT3' , [])
81558090
81568091        class  CNT (NamedTuple ):
81578092            pass   # empty body 
@@ -8166,16 +8101,18 @@ class CNT(NamedTuple):
81668101    def  test_namedtuple_errors (self ):
81678102        with  self .assertRaises (TypeError ):
81688103            NamedTuple .__new__ ()
8104+         with  self .assertRaisesRegex (TypeError , "object is not iterable" ):
8105+             NamedTuple ('Name' , None )
81698106
81708107        with  self .assertRaisesRegex (
81718108            TypeError ,
8172-             "missing 1  required positional argument " 
8109+             "missing 2  required positional arguments " 
81738110        ):
81748111            NamedTuple ()
81758112
81768113        with  self .assertRaisesRegex (
81778114            TypeError ,
8178-             "takes from 1 to  2 positional arguments but 3 were given" 
8115+             "takes 2 positional arguments but 3 were given" 
81798116        ):
81808117            NamedTuple ('Emp' , [('name' , str )], None )
81818118
@@ -8187,10 +8124,22 @@ def test_namedtuple_errors(self):
81878124
81888125        with  self .assertRaisesRegex (
81898126            TypeError ,
8190-             "missing 1 required  positional argument: 'typename' " 
8127+             "got some  positional-only arguments passed as keyword arguments " 
81918128        ):
81928129            NamedTuple (typename = 'Emp' , name = str , id = int )
81938130
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+ 
81948143    def  test_copy_and_pickle (self ):
81958144        global  Emp   # pickle wants to reference the class by name 
81968145        Emp  =  NamedTuple ('Emp' , [('name' , str ), ('cool' , int )])
0 commit comments