Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
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 18 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 9 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 12 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 20 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 30 Modules/_operator.c
Original file line number Diff 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);
Comment thread
Fidget-Spinner marked this conversation as resolved.
}

/*[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 20 Modules/clinic/_operator.c.h

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

Morty Proxy This is a proxified and sanitized view of the page, visit original site.