[Python-checkins] cpython: Issue #26129: Deprecated accepting non-integers in grp.getgrgid().

serhiy.storchaka python-checkins at python.org
Mon Jan 18 11:51:17 EST 2016


https://hg.python.org/cpython/rev/65e0e06b70b6
changeset:   99960:65e0e06b70b6
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Mon Jan 18 18:49:57 2016 +0200
summary:
  Issue #26129: Deprecated accepting non-integers in grp.getgrgid().

files:
  Doc/library/grp.rst  |   3 +++
  Lib/test/test_grp.py |  10 ++++++++++
  Misc/NEWS            |   2 ++
  Modules/grpmodule.c  |  21 ++++++++++++++++-----
  4 files changed, 31 insertions(+), 5 deletions(-)


diff --git a/Doc/library/grp.rst b/Doc/library/grp.rst
--- a/Doc/library/grp.rst
+++ b/Doc/library/grp.rst
@@ -42,6 +42,9 @@
    Return the group database entry for the given numeric group ID. :exc:`KeyError`
    is raised if the entry asked for cannot be found.
 
+   .. deprecated:: 3.6
+      Since Python 3.6 the support of non-integer arguments like floats or
+      strings in :func:`getgrgid` is deprecated.
 
 .. function:: getgrnam(name)
 
diff --git a/Lib/test/test_grp.py b/Lib/test/test_grp.py
--- a/Lib/test/test_grp.py
+++ b/Lib/test/test_grp.py
@@ -92,5 +92,15 @@
 
         self.assertRaises(KeyError, grp.getgrgid, fakegid)
 
+    def test_noninteger_gid(self):
+        entries = grp.getgrall()
+        if not entries:
+            self.skipTest('no groups')
+        # Choose an existent gid.
+        gid = entries[0][2]
+        self.assertWarns(DeprecationWarning, grp.getgrgid, float(gid))
+        self.assertWarns(DeprecationWarning, grp.getgrgid, str(gid))
+
+
 if __name__ == "__main__":
     unittest.main()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -131,6 +131,8 @@
 Library
 -------
 
+- Issue #26129: Deprecated accepting non-integers in grp.getgrgid().
+
 - Issue #25850: Use cross-compilation by default for 64-bit Windows.
 
 - Issue #25822: Add docstrings to the fields of urllib.parse results.
diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c
--- a/Modules/grpmodule.c
+++ b/Modules/grpmodule.c
@@ -100,14 +100,25 @@
     gid_t gid;
     struct group *p;
 
-    py_int_id = PyNumber_Long(id);
-    if (!py_int_id)
+    if (!_Py_Gid_Converter(id, &gid)) {
+        if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
             return NULL;
-    if (!_Py_Gid_Converter(py_int_id, &gid)) {
+        }
+        PyErr_Clear();
+        if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
+                             "group id must be int, not %.200",
+                             id->ob_type->tp_name) < 0) {
+            return NULL;
+        }
+        py_int_id = PyNumber_Long(id);
+        if (!py_int_id)
+            return NULL;
+        if (!_Py_Gid_Converter(py_int_id, &gid)) {
+            Py_DECREF(py_int_id);
+            return NULL;
+        }
         Py_DECREF(py_int_id);
-        return NULL;
     }
-    Py_DECREF(py_int_id);
 
     if ((p = getgrgid(gid)) == NULL) {
         PyObject *gid_obj = _PyLong_FromGid(gid);

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list