]> granicus.if.org Git - python/commitdiff
bpo-29695: Remove bad keyword parameters in int(), bool(), float(), list() and tuple...
authorSerhiy Storchaka <storchaka@gmail.com>
Mon, 6 Mar 2017 15:01:06 +0000 (17:01 +0200)
committerGitHub <noreply@github.com>
Mon, 6 Mar 2017 15:01:06 +0000 (17:01 +0200)
12 files changed:
Doc/whatsnew/3.7.rst
Lib/test/test_bool.py
Lib/test/test_float.py
Lib/test/test_int.py
Lib/test/test_list.py
Lib/test/test_tuple.py
Misc/NEWS
Objects/boolobject.c
Objects/floatobject.c
Objects/listobject.c
Objects/longobject.c
Objects/tupleobject.c

index 5c5ca147e3adf5147cdd524e66e897e3d8aca743..0749d3517d4299f0368e7646a27c0e43aad2a0d5 100644 (file)
@@ -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
 =====================
index 1e6ec1983758b638c5a45235a4e62d7ffd8d7012..c5a1f1f2c2b29f93611349023d03ebaece212a21 100644 (file)
@@ -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")
index 91e3b7ab49d4d27d0fec421021417ea09ef9edd5..238fdf7402c953f713e7ede67df30c614563a042 100644 (file)
@@ -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())
index db969672e49257abd56b5302aa35823751c8962c..854117efd743c2ec32a40723e945460f2a7d64c8 100644 (file)
@@ -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)
 
index 48c36913c0c0825ebe2ebbbfe7a6109e348db610..def4badbf5578e85b0facd46bc516e3219f34c1c 100644 (file)
@@ -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()
index d3663acfd49cf443a0dc41252e2218c4d533950f..84c064f19f2ec247302c2ae4e8e5f994731a8526 100644 (file)
@@ -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()
index 81b02fdd4a48b3f82aa3056fb1eb0ba59de98df8..bcd049661edb1f2d3f2800e7e6f5a57823faa247 100644 (file)
--- 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__.
index b54b0525dfc8e7dfad53b52376dfe70204d3f8f4..becdfcbbb477230c33d5f5603cb2408c2c1417c3 100644 (file)
@@ -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;
index 3a881c3358b47feabd222a5f55d95bce44f9bbd4..9267b9f27bf9b035713e451815641d7bf64b0dd6 100644 (file)
@@ -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))
index 59f68819d4905316c6a58ce9bc0b0e0141ed5614..473bd20874d0ff4845c99842ceb5e110251acafa 100644 (file)
@@ -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));
index 6a5bc47ebc94970bcbccc8d1ddf7c0a27557c910..cfb4a3e7c0d3b3ce87aec194ab50c5893954fc4a 100644 (file)
@@ -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);
 
index c2696c7dfb799aae71ad2e75e97e81dfeb1c85bd..64db80692f07a9ce9ca2f969ee51ae900f23119a 100644 (file)
@@ -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);