diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2019-09-18 06:08:01 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-18 06:08:01 (GMT) |
commit | 2adcd79bf90415147691a51a4cb046d5920f6ce7 (patch) | |
tree | 81b3c912998ca4285133ad0e36fefc39872f6c8a | |
parent | 31af1cce9d799475ba8c3dec3e239b4a75ce268f (diff) | |
download | cpython-2adcd79bf90415147691a51a4cb046d5920f6ce7.zip cpython-2adcd79bf90415147691a51a4cb046d5920f6ce7.tar.gz cpython-2adcd79bf90415147691a51a4cb046d5920f6ce7.tar.bz2 |
bpo-38191: Use positional-only parameters in TypedDict(). (GH-16240)
-rw-r--r-- | Lib/test/test_typing.py | 14 | ||||
-rw-r--r-- | Lib/typing.py | 39 |
2 files changed, 7 insertions, 46 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 5914f31..3013f8e 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3653,16 +3653,10 @@ class TypedDictTests(BaseTestCase): TypedDict() with self.assertRaises(TypeError): TypedDict('Emp', [('name', str)], None) - - with self.assertWarns(DeprecationWarning): - Emp = TypedDict(_typename='Emp', name=str, id=int) - self.assertEqual(Emp.__name__, 'Emp') - self.assertEqual(Emp.__annotations__, {'name': str, 'id': int}) - - with self.assertWarns(DeprecationWarning): - Emp = TypedDict('Emp', _fields={'name': str, 'id': int}) - self.assertEqual(Emp.__name__, 'Emp') - self.assertEqual(Emp.__annotations__, {'name': str, 'id': int}) + with self.assertRaises(TypeError): + TypedDict(_typename='Emp', name=str, id=int) + with self.assertRaises(TypeError): + TypedDict('Emp', _fields={'name': str, 'id': int}) def test_typeddict_errors(self): Emp = TypedDict('Emp', {'name': str, 'id': int}) diff --git a/Lib/typing.py b/Lib/typing.py index 43486a7..048db31 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1691,43 +1691,11 @@ class NamedTuple(metaclass=NamedTupleMeta): __new__.__text_signature__ = '($cls, typename, fields=None, /, **kwargs)' -def _dict_new(*args, **kwargs): - if not args: - raise TypeError('TypedDict.__new__(): not enough arguments') - cls, *args = args # allow the "cls" keyword be passed +def _dict_new(cls, /, *args, **kwargs): return dict(*args, **kwargs) -_dict_new.__text_signature__ = '($cls, _typename, _fields=None, /, **kwargs)' - - -def _typeddict_new(*args, total=True, **kwargs): - if not args: - raise TypeError('TypedDict.__new__(): not enough arguments') - cls, *args = args # allow the "cls" keyword be passed - if args: - typename, *args = args # allow the "_typename" keyword be passed - elif '_typename' in kwargs: - typename = kwargs.pop('_typename') - import warnings - warnings.warn("Passing '_typename' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError("TypedDict.__new__() missing 1 required positional " - "argument: '_typename'") - if args: - try: - fields, = args # allow the "_fields" keyword be passed - except ValueError: - raise TypeError(f'TypedDict.__new__() takes from 2 to 3 ' - f'positional arguments but {len(args) + 2} ' - f'were given') from None - elif '_fields' in kwargs and len(kwargs) == 1: - fields = kwargs.pop('_fields') - import warnings - warnings.warn("Passing '_fields' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - fields = None + +def _typeddict_new(cls, typename, fields=None, /, *, total=True, **kwargs): if fields is None: fields = kwargs elif kwargs: @@ -1742,7 +1710,6 @@ def _typeddict_new(*args, total=True, **kwargs): pass return _TypedDictMeta(typename, (), ns) -_typeddict_new.__text_signature__ = '($cls, _typename, _fields=None, /, *, total=True, **kwargs)' def _check_fails(cls, other): |