8000 gh-115808: Add ``is_none`` and ``is_not_none`` operators by ThexXTURBOXx · Pull Request #115814 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content
8000

gh-115808: Add is_none and is_not_none operators #115814

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Aug 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions Doc/library/operator.rst
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,20 @@ truth tests, identity tests, and boolean operations:
Return ``a is not b``. Tests object identity.


.. function:: is_none(a)

Return ``a is None``. Tests object identity.

.. versionadded:: 3.14


.. function:: is_not_none(a)

Return ``a is not None``. Tests object identity.

.. versionadded:: 3.14


The mathematical and bitwise operations are the most numerous:


Expand Down Expand Up @@ -405,6 +419,10 @@ Python syntax and the functions in the :mod:`operator` module.
+-----------------------+-------------------------+---------------------------------------+
| Identity | ``a is not b`` | ``is_not(a, b)`` |
+-----------------------+-------------------------+---------------------------------------+
| Identity | ``a is None`` | ``is_none(a)`` |
+-----------------------+-------------------------+---------------------------------------+
| Identity | ``a is not None`` | ``is_not_none(a)`` |
+-----------------------+-------------------------+---------------------------------------+
| Indexed Assignment | ``obj[k] = v`` | ``setitem(obj, k, v)`` |
+-----------------------+-------------------------+---------------------------------------+
| Indexed Deletion | ``del obj[k]`` | ``delitem(obj, k)`` |
Expand Down
9 changes: 9 additions & 0 deletions Doc/whatsnew/3.14.rst
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,15 @@ Add notes for JSON serialization errors that allow to identify the source
of the error.
(Contributed by Serhiy Storchaka in :gh:`122163`.)

operator
--------

* Two new functions ``operator.is_none`` and ``operator.is_not_none``
have been added, such that ``operator.is_none(obj)`` is equivalent
to ``obj is None`` and ``operator.is_not_none(obj)`` is equivalent
to ``obj is not None``.
(Contributed by Raymond Hettinger and Nico Mexis in :gh:`115808`.)

os
--

Expand Down
12 changes: 10 additions & 2 deletions Lib/operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand',
'iconcat', 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul',
'index', 'indexOf', 'inv', 'invert', 'ior', 'ipow', 'irshift',
'is_', 'is_not', 'isub', 'itemgetter', 'itruediv', 'ixor', 'le',
'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller', 'mod',
'is_', 'is_none', 'is_not', 'is_not_none', 'isub', 'itemgetter', 'itruediv',
'ixor', 'le', 'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller', 'mod',
'mul', 'ne', 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift',
'setitem', 'sub', 'truediv', 'truth', 'xor']

Expand Down Expand Up @@ -66,6 +66,14 @@ def is_not(a, b):
"Same as a is not b."
return a is not b

def is_none(a):
"Same as a is None."
return a is None

def is_not_none(a):
"Same as a is not None."
return a is not None

# Mathematical/Bitwise Operations *********************************************#

def abs(a):
Expand Down
20 changes: 20 additions & 0 deletions Lib/test/test_operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,26 @@ def test_is_not(self):
self.assertFalse(operator.is_not(a, b))
self.assertTrue(operator.is_not(a,c))

def test_is_none(self):
operator = self.module
a = 'xyzpdq'
b = ''
c = None
self.assertRaises(TypeError, operator.is_none)
self.assertFalse(operator.is_none(a))
self.assertFalse(operator.is_none(b))
self.assertTrue(operator.is_none(c))

def test_is_not_none(self):
operator = self.module
a = 'xyzpdq'
b = ''
c = None
self.assertRaises(TypeError, operator.is_not_none)
self.assertTrue(operator.is_not_none(a))
self.assertTrue(operator.is_not_none(b))
self.assertFalse(operator.is_not_none(c))

def test_attrgetter(self):
operator = self.module
class A:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add :func:`operator.is_none` and :func:`operator.is_not_none` functions.
30 changes: 30 additions & 0 deletions Modules/_operator.c
67ED
Original file line numberDiff line number Diff line change
Expand Up @@ -728,6 +728,34 @@ _operator_is_not_impl(PyObject *module, PyObject *a, PyObject *b)
return Py_NewRef(result);
}

/*[clinic input]
_operator.is_none = _operator.neg

Same as a is None.
[clinic start generated code]*/

static PyObject *
_operator_is_none(PyObject *module, PyObject *a)
/*[clinic end generated code: output=07159cc102261dec input=0448b38af7b8533d]*/
{
PyObject *result = Py_IsNone(a) ? Py_True : Py_False;
return Py_NewRef(result);
}

/*[clinic input]
_operator.is_not_none = _operator.neg

Same as a is not None.
[clinic start generated code]*/

static PyObject *
_operator_is_not_none(PyObject *module, PyObject *a)
/*[clinic end generated code: output=b0168a51451d9140 input=7587f38ebac51688]*/
{
PyObject *result = Py_IsNone(a) ? Py_False : Py_True;
return Py_NewRef(result);
}

/* compare_digest **********************************************************/

/*
Expand Down Expand Up @@ -916,6 +944,8 @@ static struct PyMethodDef operator_methods[] = {
_OPERATOR_COUNTOF_METHODDEF
_OPERATOR_IS__METHODDEF
_OPERATOR_IS_NOT_METHODDEF
_OPERATOR_IS_NONE_METHODDEF
_OPERATOR_IS_NOT_NONE_METHODDEF
_OPERATOR_INDEX_METHODDEF
_OPERATOR_ADD_METHODDEF
_OPERATOR_SUB_METHODDEF
Expand Down
20 changes: 19 additions & 1 deletion Modules/clinic/_operator.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
0