New submission from Julien Palard <julien+pyt...@palard.fr>:

In the following snippet:

    >>> class Ror:
    ...     def __ror__(self, other):
    ...         return set()
    ...
    >>> {}.keys() | Ror()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'Ror' object is not iterable

I expect the __or__ implementation of dict_keys to return NotImplemented when 
given a non-interesting thing, so my __ror__ can run and get an empty set 
instead of a TypeError.

Strangely enough, it worked in Python 2.7, I'm not fluent enough en 2.7 object 
nor C implementation to know why, the dictviews_or looks the same for me.

It looks easy to fix without breaking the tests in dictobject.c like:

    --- a/Objects/dictobject.c
    +++ b/Objects/dictobject.c
    @@ -4284,7 +4284,8 @@ dictviews_or(PyObject* self, PyObject *other)
         tmp = _PyObject_CallMethodIdOneArg(result, &PyId_update, other);
         if (tmp == NULL) {
             Py_DECREF(result);
    -        return NULL;
    +        PyErr_Clear();
    +        Py_RETURN_NOTIMPLEMENTED;
         }

the question is more: should we? I think so but am I missing something?

----------
messages: 355007
nosy: mdk
priority: normal
severity: normal
status: open
title: dictobject dictviews don't return NotImplemented for unrecognized types.
type: behavior
versions: Python 3.5, Python 3.6, Python 3.7, Python 3.8, Python 3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue38538>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to