Soni L. wrote:
> On 2020-04-09 8:48 a.m., Rhodri James wrote:
> > [Muchly snipped]
> > On 09/04/2020 12:27, Soni L. wrote:
> > To put it simple, unpacking raises
> > ValueError:
> > But if the iterator raises ValueError, there's no way to tell it 
> > apart from the unpacking:
> > I don't see how this is any different from any other case when you get 
> > the same exception for different errors.  If for some reason you 
> > really care, subclass ValueError to make a finer-grained exception.
> > And the workaround for this is a bit ugly. We
> > already convert e.g. 
> > StopIteration into RuntimeError in many cases, why can't we do so 
> > here too?
> > Surely the correct "workaround" is not to do the thing that raises the 
> > exception?
> > Technically, I consider it a bug that bugs can shadow API-level 
> > exceptions. Any API defining API-level exceptions must carefully control 
> > the exceptions it raises. In this case I'd like to use the ValueError 
> > from the iterator unpacking API, on my API. But since the iterator 
> > unpacking API doesn't control its exceptions, this just does a great job 
> > of masking bugs in the code instead.
> > Equally, anything doing computation in __get__ should not propagate 
> LookupError except where explicitly intended. And that's not how those 
> things are often implemented, unfortunately. There's a reason ppl 
> complain so much about certain frameworks "eating all the exceptions". 
> They use exceptions as part of their API but let user code raise those 
> API-level exceptions, which, because they're part of the API, get 
> handled somewhere.

Strictly speaking, there is any unpackaging error in your example. Your example 
raises its own ValueError before any unpackaging error is raised.

Indeed

```
x, y = foo()
```

also raises your own `ValueError` and there is any unpackaging error involved.

On the other hand, an alternative design that does not raise any exception, 
does raise the proper unpackaging exception. For instance:

```
def foo():
    yield True
    return

x = foo()
x, = foo()
x, y = foo()

```

outputs:

```
Traceback (most recent call last):
  File "...", line 7, in <module>
    x, y = foo()
ValueError: not enough values to unpack (expected 2, got 1)
```

So, IMHO, you are mixing two different things here. Am I wrong? Are you talking 
about something different? Thank you.
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/UBCF6LQCBGPMZERLOVQONEJPSCO5QGRO/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to