summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-03-06 15:01:06 (GMT)
committerGitHub <noreply@github.com>2017-03-06 15:01:06 (GMT)
commit2e5642422f6234fd8d0c082142b27340e588f96e (patch)
tree8279099d6fc0b034aaeb0be40a1d30d9246afc81
parentb76ad5121e2cfa89d6476d700cbcb65b7ffc39ac (diff)
downloadcpython-2e5642422f6234fd8d0c082142b27340e588f96e.zip
cpython-2e5642422f6234fd8d0c082142b27340e588f96e.tar.gz
cpython-2e5642422f6234fd8d0c082142b27340e588f96e.tar.bz2
bpo-29695: Remove bad keyword parameters in int(), bool(), float(), list() and tuple(). (#518)
-rw-r--r--Doc/whatsnew/3.7.rst9
-rw-r--r--Lib/test/test_bool.py4
-rw-r--r--Lib/test/test_float.py4
-rw-r--r--Lib/test/test_int.py8
-rw-r--r--Lib/test/test_list.py5
-rw-r--r--Lib/test/test_tuple.py5
-rw-r--r--Misc/NEWS5
-rw-r--r--Objects/boolobject.c11
-rw-r--r--Objects/floatobject.c11
-rw-r--r--Objects/listobject.c11
-rw-r--r--Objects/longobject.c8
-rw-r--r--Objects/tupleobject.c11
12 files changed, 31 insertions, 61 deletions
diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst
index 5c5ca14..0749d35 100644
--- a/Doc/whatsnew/3.7.rst
+++ b/Doc/whatsnew/3.7.rst
@@ -169,11 +169,6 @@ Deprecated
both deprecated in Python 3.4 now emit :exc:`DeprecationWarning`. (Contributed
by Matthias Bussonnier in :issue:`29576`)
-- Using *x* as a keyword argument in :func:`int`, :func:`bool` and
- :func:`float` and using *sequence* as a keyword argument in :func:`list`
- and :func:`tuple` are deprecated. Specify the value as a positional argument
- instead. (Contributed by Serhiy Storchaka in :issue:`29695`.)
-
Removed
=======
@@ -192,6 +187,10 @@ API and Feature Removals
Python 3.1, and has now been removed. Use the :func:`~os.path.splitdrive`
function instead.
+* Functions :func:`bool`, :func:`float`, :func:`list` and :func:`tuple` no
+ longer take keyword arguments. The first argument of :func:`int` can now
+ be passes only as positional argument.
+
Porting to Python 3.7
=====================
diff --git a/Lib/test/test_bool.py b/Lib/test/test_bool.py
index 1e6ec19..c5a1f1f 100644
--- a/Lib/test/test_bool.py
+++ b/Lib/test/test_bool.py
@@ -171,8 +171,8 @@ class BoolTest(unittest.TestCase):
self.assertIs(bool(), False)
def test_keyword_args(self):
- with self.assertWarns(DeprecationWarning):
- self.assertIs(bool(x=10), True)
+ with self.assertRaisesRegex(TypeError, 'keyword argument'):
+ bool(x=10)
def test_format(self):
self.assertEqual("%d" % False, "0")
diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py
index 91e3b7a..238fdf7 100644
--- a/Lib/test/test_float.py
+++ b/Lib/test/test_float.py
@@ -209,8 +209,8 @@ class GeneralFloatCases(unittest.TestCase):
self.assertIs(type(FloatSubclass(F())), FloatSubclass)
def test_keyword_args(self):
- with self.assertWarns(DeprecationWarning):
- self.assertEqual(float(x='3.14'), 3.14)
+ with self.assertRaisesRegex(TypeError, 'keyword argument'):
+ float(x='3.14')
def test_is_integer(self):
self.assertFalse((1.1).is_integer())
diff --git a/Lib/test/test_int.py b/Lib/test/test_int.py
index db96967..854117e 100644
--- a/Lib/test/test_int.py
+++ b/Lib/test/test_int.py
@@ -246,11 +246,11 @@ class IntTestCases(unittest.TestCase):
def test_keyword_args(self):
# Test invoking int() using keyword arguments.
- with self.assertWarns(DeprecationWarning):
- self.assertEqual(int(x=1.2), 1)
self.assertEqual(int('100', base=2), 4)
- with self.assertWarns(DeprecationWarning):
- self.assertEqual(int(x='100', base=2), 4)
+ with self.assertRaisesRegex(TypeError, 'keyword argument'):
+ int(x=1.2)
+ with self.assertRaisesRegex(TypeError, 'keyword argument'):
+ int(x='100', base=2)
self.assertRaises(TypeError, int, base=10)
self.assertRaises(TypeError, int, base=0)
diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py
index 48c3691..def4bad 100644
--- a/Lib/test/test_list.py
+++ b/Lib/test/test_list.py
@@ -42,9 +42,8 @@ class ListTest(list_tests.CommonTest):
self.assertEqual(x, [])
def test_keyword_args(self):
- with self.assertWarns(DeprecationWarning):
- self.assertEqual(list(sequence=(x for x in range(10) if x % 2)),
- [1, 3, 5, 7, 9])
+ with self.assertRaisesRegex(TypeError, 'keyword argument'):
+ list(sequence=[])
def test_truth(self):
super().test_truth()
diff --git a/Lib/test/test_tuple.py b/Lib/test/test_tuple.py
index d3663ac..84c064f 100644
--- a/Lib/test/test_tuple.py
+++ b/Lib/test/test_tuple.py
@@ -27,9 +27,8 @@ class TupleTest(seq_tests.CommonTest):
(1, 3, 5, 7, 9))
def test_keyword_args(self):
- with self.assertWarns(DeprecationWarning):
- self.assertEqual(tuple(sequence=(x for x in range(10) if x % 2)),
- (1, 3, 5, 7, 9))
+ with self.assertRaisesRegex(TypeError, 'keyword argument'):
+ tuple(sequence=())
def test_truth(self):
super().test_truth()
diff --git a/Misc/NEWS b/Misc/NEWS
index 81b02fd..bcd0496 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,9 +13,8 @@ Core and Builtins
- bpo-29714: Fix a regression that bytes format may fail when containing zero
bytes inside.
-- bpo-29695: Using "x" as a keyword argument in int(), bool() and float() and
- using "sequence" as a keyword argument in list() and tuple() are deprecated.
- Specify the value as a positional argument instead.
+- bpo-29695: bool(), float(), list() and tuple() no longer take keyword arguments.
+ The first argument of int() can now be passes only as positional argument.
- bpo-28893: Set correct __cause__ for errors about invalid awaitables
returned from __aiter__ and __anext__.
diff --git a/Objects/boolobject.c b/Objects/boolobject.c
index b54b052..becdfcb 100644
--- a/Objects/boolobject.c
+++ b/Objects/boolobject.c
@@ -42,18 +42,13 @@ PyObject *PyBool_FromLong(long ok)
static PyObject *
bool_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- static char *kwlist[] = {"x", 0};
PyObject *x = Py_False;
long ok;
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:bool", kwlist, &x))
+ if (!_PyArg_NoKeywords("bool()", kwds))
+ return NULL;
+ if (!PyArg_UnpackTuple(args, "bool", 0, 1, &x))
return NULL;
- if (kwds != NULL && PyDict_GET_SIZE(kwds) != 0) {
- if (PyErr_Warn(PyExc_DeprecationWarning,
- "Using 'x' as a keyword argument is deprecated; "
- "specify the value as a positional argument instead") < 0)
- return NULL;
- }
ok = PyObject_IsTrue(x);
if (ok < 0)
return NULL;
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index 3a881c3..9267b9f 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -1563,18 +1563,13 @@ static PyObject *
float_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *x = Py_False; /* Integer zero */
- static char *kwlist[] = {"x", 0};
if (type != &PyFloat_Type)
return float_subtype_new(type, args, kwds); /* Wimp out */
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:float", kwlist, &x))
+ if (!_PyArg_NoKeywords("float()", kwds))
+ return NULL;
+ if (!PyArg_UnpackTuple(args, "float", 0, 1, &x))
return NULL;
- if (kwds != NULL && PyDict_GET_SIZE(kwds) != 0) {
- if (PyErr_Warn(PyExc_DeprecationWarning,
- "Using 'x' as a keyword argument is deprecated; "
- "specify the value as a positional argument instead") < 0)
- return NULL;
- }
/* If it's a string, but not a string subclass, use
PyFloat_FromString. */
if (PyUnicode_CheckExact(x))
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 59f6881..473bd20 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -2293,16 +2293,11 @@ static int
list_init(PyListObject *self, PyObject *args, PyObject *kw)
{
PyObject *arg = NULL;
- static char *kwlist[] = {"sequence", 0};
- if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
+ if (!_PyArg_NoKeywords("list()", kw))
+ return -1;
+ if (!PyArg_UnpackTuple(args, "list", 0, 1, &arg))
return -1;
- if (arg != NULL && PyTuple_GET_SIZE(args) == 0) {
- if (PyErr_Warn(PyExc_DeprecationWarning,
- "Using 'sequence' as a keyword argument is deprecated; "
- "specify the value as a positional argument instead") < 0)
- return -1;
- }
/* Verify list invariants established by PyType_GenericAlloc() */
assert(0 <= Py_SIZE(self));
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 6a5bc47..cfb4a3e 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -4796,7 +4796,7 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *obase = NULL, *x = NULL;
Py_ssize_t base;
- static char *kwlist[] = {"x", "base", 0};
+ static char *kwlist[] = {"", "base", 0};
if (type != &PyLong_Type)
return long_subtype_new(type, args, kwds); /* Wimp out */
@@ -4811,12 +4811,6 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
return PyLong_FromLong(0L);
}
- if (PyTuple_GET_SIZE(args) == 0) {
- if (PyErr_Warn(PyExc_DeprecationWarning,
- "Using 'x' as a keyword argument is deprecated; "
- "specify the value as a positional argument instead") < 0)
- return NULL;
- }
if (obase == NULL)
return PyNumber_Long(x);
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index c2696c7..64db806 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -648,18 +648,13 @@ static PyObject *
tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *arg = NULL;
- static char *kwlist[] = {"sequence", 0};
if (type != &PyTuple_Type)
return tuple_subtype_new(type, args, kwds);
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
+ if (!_PyArg_NoKeywords("tuple()", kwds))
+ return NULL;
+ if (!PyArg_UnpackTuple(args, "tuple", 0, 1, &arg))
return NULL;
- if (arg != NULL && PyTuple_GET_SIZE(args) == 0) {
- if (PyErr_Warn(PyExc_DeprecationWarning,
- "Using 'sequence' as a keyword argument is deprecated; "
- "specify the value as a positional argument instead") < 0)
- return NULL;
- }
if (arg == NULL)
return PyTuple_New(0);