changeset: 99960:65e0e06b70b6 user: Serhiy Storchaka date: Mon Jan 18 18:49:57 2016 +0200 files: Doc/library/grp.rst Lib/test/test_grp.py Misc/NEWS Modules/grpmodule.c description: Issue #26129: Deprecated accepting non-integers in grp.getgrgid(). diff -r ac6d33317eda -r 65e0e06b70b6 Doc/library/grp.rst --- a/Doc/library/grp.rst Mon Jan 18 12:15:08 2016 +0100 +++ b/Doc/library/grp.rst Mon Jan 18 18:49:57 2016 +0200 @@ -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 -r ac6d33317eda -r 65e0e06b70b6 Lib/test/test_grp.py --- a/Lib/test/test_grp.py Mon Jan 18 12:15:08 2016 +0100 +++ b/Lib/test/test_grp.py Mon Jan 18 18:49:57 2016 +0200 @@ -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 -r ac6d33317eda -r 65e0e06b70b6 Misc/NEWS --- a/Misc/NEWS Mon Jan 18 12:15:08 2016 +0100 +++ b/Misc/NEWS Mon Jan 18 18:49:57 2016 +0200 @@ -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 -r ac6d33317eda -r 65e0e06b70b6 Modules/grpmodule.c --- a/Modules/grpmodule.c Mon Jan 18 12:15:08 2016 +0100 +++ b/Modules/grpmodule.c Mon Jan 18 18:49:57 2016 +0200 @@ -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; + } + PyErr_Clear(); + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "group id must be int, not %.200", + id->ob_type->tp_name) < 0) { return NULL; - if (!_Py_Gid_Converter(py_int_id, &gid)) { + } + 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);