summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRupert Tombs <rupert.tombs@gmail.com>2021-07-07 13:28:09 (GMT)
committerGitHub <noreply@github.com>2021-07-07 13:28:09 (GMT)
commit6bd3ecfc272b122b55a6adec50dd7a7c868f262f (patch)
treead92100dff9d7506a6499f0e8fb18b74111a3e80
parent8363c53369a582ff9ae4e797a80cdce12624a278 (diff)
downloadcpython-6bd3ecfc272b122b55a6adec50dd7a7c868f262f.zip
cpython-6bd3ecfc272b122b55a6adec50dd7a7c868f262f.tar.gz
cpython-6bd3ecfc272b122b55a6adec50dd7a7c868f262f.tar.bz2
bpo-44558: Match countOf `is`/`==` treatment to c (GH-27007)
-rw-r--r--Lib/operator.py4
-rw-r--r--Lib/test/test_operator.py5
-rw-r--r--Misc/NEWS.d/next/Documentation/2021-07-03-18-25-17.bpo-44558.0pTknl.rst2
-rw-r--r--Modules/_operator.c4
-rw-r--r--Modules/clinic/_operator.c.h4
5 files changed, 13 insertions, 6 deletions
diff --git a/Lib/operator.py b/Lib/operator.py
index 6782703..241fdbb 100644
--- a/Lib/operator.py
+++ b/Lib/operator.py
@@ -155,10 +155,10 @@ def contains(a, b):
return b in a
def countOf(a, b):
- "Return the number of times b occurs in a."
+ "Return the number of items in a which are, or which equal, b."
count = 0
for i in a:
- if i == b:
+ if i is b or i == b:
count += 1
return count
diff --git a/Lib/test/test_operator.py b/Lib/test/test_operator.py
index d50306b..b9b8f15 100644
--- a/Lib/test/test_operator.py
+++ b/Lib/test/test_operator.py
@@ -153,6 +153,11 @@ class OperatorTestCase:
self.assertRaises(ZeroDivisionError, operator.countOf, BadIterable(), 1)
self.assertEqual(operator.countOf([1, 2, 1, 3, 1, 4], 3), 1)
self.assertEqual(operator.countOf([1, 2, 1, 3, 1, 4], 5), 0)
+ # is but not ==
+ nan = float("nan")
+ self.assertEqual(operator.countOf([nan, nan, 21], nan), 2)
+ # == but not is
+ self.assertEqual(operator.countOf([{}, 1, {}, 2], {}), 2)
def test_delitem(self):
operator = self.module
diff --git a/Misc/NEWS.d/next/Documentation/2021-07-03-18-25-17.bpo-44558.0pTknl.rst b/Misc/NEWS.d/next/Documentation/2021-07-03-18-25-17.bpo-44558.0pTknl.rst
new file mode 100644
index 0000000..a12a49c
--- /dev/null
+++ b/Misc/NEWS.d/next/Documentation/2021-07-03-18-25-17.bpo-44558.0pTknl.rst
@@ -0,0 +1,2 @@
+Match the docstring and python implementation of :func:`~operator.countOf` to the behavior
+of its c implementation.
diff --git a/Modules/_operator.c b/Modules/_operator.c
index d5e092e..f051513 100644
--- a/Modules/_operator.c
+++ b/Modules/_operator.c
@@ -507,12 +507,12 @@ _operator_indexOf_impl(PyObject *module, PyObject *a, PyObject *b)
/*[clinic input]
_operator.countOf = _operator.indexOf
-Return the number of times b occurs in a.
+Return the number of items in a which are, or which equal, b.
[clinic start generated code]*/
static Py_ssize_t
_operator_countOf_impl(PyObject *module, PyObject *a, PyObject *b)
-/*[clinic end generated code: output=9e1623197daf3382 input=0c3a2656add252db]*/
+/*[clinic end generated code: output=9e1623197daf3382 input=93ea57f170f3f0bb]*/
{
return PySequence_Count(a, b);
}
diff --git a/Modules/clinic/_operator.c.h b/Modules/clinic/_operator.c.h
index 34b6fda..bda2eba 100644
--- a/Modules/clinic/_operator.c.h
+++ b/Modules/clinic/_operator.c.h
@@ -957,7 +957,7 @@ PyDoc_STRVAR(_operator_countOf__doc__,
"countOf($module, a, b, /)\n"
"--\n"
"\n"
-"Return the number of times b occurs in a.");
+"Return the number of items in a which are, or which equal, b.");
#define _OPERATOR_COUNTOF_METHODDEF \
{"countOf", (PyCFunction)(void(*)(void))_operator_countOf, METH_FASTCALL, _operator_countOf__doc__},
@@ -1486,4 +1486,4 @@ _operator__compare_digest(PyObject *module, PyObject *const *args, Py_ssize_t na
exit:
return return_value;
}
-/*[clinic end generated code: output=eae5d08f971a65fd input=a9049054013a1b77]*/
+/*[clinic end generated code: output=16749e11fda51785 input=a9049054013a1b77]*/