summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorTim Hoffmann <2836374+timhoffm@users.noreply.github.com>2023-05-03 07:00:42 (GMT)
committerGitHub <noreply@github.com>2023-05-03 07:00:42 (GMT)
commitfdb3ef8c0f94c7e55870a585dc6499aca46f9f90 (patch)
tree8a2c2ce856fe00afc77a99049f3bfa331068069d /Objects
parent5b05b013ff13032ffc4db07108a507c08b3a604d (diff)
downloadcpython-fdb3ef8c0f94c7e55870a585dc6499aca46f9f90.zip
cpython-fdb3ef8c0f94c7e55870a585dc6499aca46f9f90.tar.gz
cpython-fdb3ef8c0f94c7e55870a585dc6499aca46f9f90.tar.bz2
gh-82012: Deprecate bitwise inversion (~) of bool (#103487)
The bitwise inversion operator on bool returns the bitwise inversion of the underlying int value; i.e. `~True == -2` such that `bool(~True) == True`. It's a common pitfall that users mistake `~` as negation operator and actually want `not`. Supporting `~` is an artifact of bool inheriting from int. Since there is no real use-case for the current behavior, let's deprecate `~` on bool and later raise an error. This removes a potential source errors for users. Full reasoning: https://github.com/python/cpython/issues/82012#issuecomment-1258705971 Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com> Co-authored-by: Shantanu <12621235+hauntsaninja@users.noreply.github.com>
Diffstat (limited to 'Objects')
-rw-r--r--Objects/boolobject.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/Objects/boolobject.c b/Objects/boolobject.c
index 597a76f..0300f7b 100644
--- a/Objects/boolobject.c
+++ b/Objects/boolobject.c
@@ -74,6 +74,22 @@ bool_vectorcall(PyObject *type, PyObject * const*args,
/* Arithmetic operations redefined to return bool if both args are bool. */
static PyObject *
+bool_invert(PyObject *v)
+{
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "Bitwise inversion '~' on bool is deprecated. This "
+ "returns the bitwise inversion of the underlying int "
+ "object and is usually not what you expect from negating "
+ "a bool. Use the 'not' operator for boolean negation or "
+ "~int(x) if you really want the bitwise inversion of the "
+ "underlying int.",
+ 1) < 0) {
+ return NULL;
+ }
+ return PyLong_Type.tp_as_number->nb_invert(v);
+}
+
+static PyObject *
bool_and(PyObject *a, PyObject *b)
{
if (!PyBool_Check(a) || !PyBool_Check(b))
@@ -119,7 +135,7 @@ static PyNumberMethods bool_as_number = {
0, /* nb_positive */
0, /* nb_absolute */
0, /* nb_bool */
- 0, /* nb_invert */
+ (unaryfunc)bool_invert, /* nb_invert */
0, /* nb_lshift */
0, /* nb_rshift */
bool_and, /* nb_and */