top | item 46343227

(no title)

wdroz | 2 months ago

In the improved error message [0] how are they able to tell nested attributes without having a big impact in performance? Or maybe this has a big impact on performance, then using exceptions for control flow is deprecated?

    ...
    print(container.area)
> AttributeError: 'Container' object has no attribute 'area'. Did you mean: 'inner.area'?

[0] -- https://docs.python.org/3.15/whatsnew/3.15.html#improved-err...

discuss

order

dotancohen|2 months ago

  > using exceptions for control flow is deprecated?
Exceptions are for the exceptional cases - the ones that mean normal operations are being suspended and error messages are being generated. Don't use them for control flow.

mort96|2 months ago

In Python, an iterator raises a StopIteration exception to indicate to the for loop that the iterator is done iterating.

In Python, the VM raises a KeyboardInterrupt exception when the user hits ctrl+c in order to unwind the stack, run cleanup code and eventually exit the program.

Python is a quite heavy user of exceptions for control flow.

Hendrikto|2 months ago

Typically yes, but not in Python. In Python it is quite common and accepted, and sometimes even recommended as Pythonic to use exceptions for control flow. See iterators, for example.

I really dislike this too, but that’s how it is.

IshKebab|2 months ago

Using exceptions for flow control has always been a bad idea, despite what they might have said. Perhaps they are generating that message lazily though?

On the other hand it's not like Python really cares about performance....

formerly_proven|2 months ago

All iterators in Python use exceptions for flow control, as do all context managers for the abort/rollback case, and it is generally considered Pythonic to use single-indexing (EAFP) instead of check-then-get (LBYL) - generally with indexing and KeyError though and less commonly with attribute access and AttributeError.

[heavy green check mark]

    try:
        data = collection['key']
    except KeyError:
        data = ..try something else..
[red x]

    if 'key' in collection:
         data = collection['key']
    else:
         data = ..try something else..
The latter form also has the genuine disadvantage that nothing ensures the two keys are the same. I've seen typos there somewhat often in code reviews.

amluto|2 months ago

I would like to introduce you to StopIteration.