summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2019-09-18 06:08:01 (GMT)
committerGitHub <noreply@github.com>2019-09-18 06:08:01 (GMT)
commit2adcd79bf90415147691a51a4cb046d5920f6ce7 (patch)
tree81b3c912998ca4285133ad0e36fefc39872f6c8a
parent31af1cce9d799475ba8c3dec3e239b4a75ce268f (diff)
downloadcpython-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.py14
-rw-r--r--Lib/typing.py39
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):