Commit 9543b340 authored by Raymond Hettinger's avatar Raymond Hettinger

SF patch #670423: Add missing identity tests to operator.c

parent 18acea7c
...@@ -48,7 +48,7 @@ for more informations about rich comparisons. ...@@ -48,7 +48,7 @@ for more informations about rich comparisons.
The logical operations are also generally applicable to all objects, The logical operations are also generally applicable to all objects,
and support truth tests and Boolean operations: and support truth tests, identity tests, and Boolean operations:
\begin{funcdesc}{not_}{o} \begin{funcdesc}{not_}{o}
\funcline{__not__}{o} \funcline{__not__}{o}
...@@ -64,6 +64,14 @@ otherwise. This is equivalent to using the \class{bool} ...@@ -64,6 +64,14 @@ otherwise. This is equivalent to using the \class{bool}
constructor. constructor.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{is_}{a, b}
Return \code{\var{a} is \var{b}}. Tests object identity.
\end{funcdesc}
\begin{funcdesc}{is_not}{a, b}
Return \code{\var{a} is not \var{b}}. Tests object identity.
\end{funcdesc}
The mathematical and bitwise operations are the most numerous: The mathematical and bitwise operations are the most numerous:
......
...@@ -215,6 +215,17 @@ class OperatorTestCase(unittest.TestCase): ...@@ -215,6 +215,17 @@ class OperatorTestCase(unittest.TestCase):
def test_bitwise_xor(self): def test_bitwise_xor(self):
self.failUnless(operator.xor(0xb, 0xc) == 0x7) self.failUnless(operator.xor(0xb, 0xc) == 0x7)
def test_is(self):
a = b = 'xyzpdq'
c = a[:3] + b[3:]
self.failUnless(operator.is_(a, b))
self.failIf(operator.is_(a,c))
def test_is_not(self):
a = b = 'xyzpdq'
c = a[:3] + b[3:]
self.failIf(operator.is_not(a, b))
self.failUnless(operator.is_not(a,c))
def test_main(): def test_main():
test_support.run_unittest(OperatorTestCase) test_support.run_unittest(OperatorTestCase)
......
...@@ -517,6 +517,11 @@ Core and builtins ...@@ -517,6 +517,11 @@ Core and builtins
Extension modules Extension modules
----------------- -----------------
- Added three operators to the operator module:
operator.pow(a,b) which is equivalent to: a**b.
operator.is_(a,b) which is equivalent to: a is b.
operator.is_not(a,b) which is equivalent to: a is not b.
- posix.openpty now works on all systems that have /dev/ptmx. - posix.openpty now works on all systems that have /dev/ptmx.
- A module zipimport exists to support importing code from zip - A module zipimport exists to support importing code from zip
...@@ -733,8 +738,6 @@ Library ...@@ -733,8 +738,6 @@ Library
or when you need to use sets as dict keys, and a class BaseSet which or when you need to use sets as dict keys, and a class BaseSet which
is the base class of the two. is the base class of the two.
- Added operator.pow(a,b) which is equivalent to a**b.
- Added random.sample(population,k) for random sampling without replacement. - Added random.sample(population,k) for random sampling without replacement.
Returns a k length list of unique elements chosen from the population. Returns a k length list of unique elements chosen from the population.
......
...@@ -107,6 +107,28 @@ op_pow(PyObject *s, PyObject *a) ...@@ -107,6 +107,28 @@ op_pow(PyObject *s, PyObject *a)
return NULL; return NULL;
} }
static PyObject*
is_(PyObject *s, PyObject *a)
{
PyObject *a1, *a2, *result = NULL;
if (PyArg_UnpackTuple(a,"is_", 2, 2, &a1, &a2)) {
result = (a1 == a2) ? Py_True : Py_False;
Py_INCREF(result);
}
return result;
}
static PyObject*
is_not(PyObject *s, PyObject *a)
{
PyObject *a1, *a2, *result = NULL;
if (PyArg_UnpackTuple(a,"is_not", 2, 2, &a1, &a2)) {
result = (a1 != a2) ? Py_True : Py_False;
Py_INCREF(result);
}
return result;
}
static PyObject* static PyObject*
op_getslice(PyObject *s, PyObject *a) op_getslice(PyObject *s, PyObject *a)
{ {
...@@ -182,6 +204,8 @@ spam1(countOf, ...@@ -182,6 +204,8 @@ spam1(countOf,
spam1o(isMappingType, spam1o(isMappingType,
"isMappingType(a) -- Return True if a has a mapping type, False otherwise.") "isMappingType(a) -- Return True if a has a mapping type, False otherwise.")
spam1(is_, "is_(a, b) -- Same as a is b.")
spam1(is_not, "is_not(a, b) -- Same as a is not b.")
spam2(add,__add__, "add(a, b) -- Same as a + b.") spam2(add,__add__, "add(a, b) -- Same as a + b.")
spam2(sub,__sub__, "sub(a, b) -- Same as a - b.") spam2(sub,__sub__, "sub(a, b) -- Same as a - b.")
spam2(mul,__mul__, "mul(a, b) -- Same as a * b.") spam2(mul,__mul__, "mul(a, b) -- Same as a * b.")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment