← Back to context

Comment by JimDabell

19 hours ago

It also inherits the unfortunate attitude of Pyright that it will warn against idiomatic Python (EAFP) in favour of non-idiomatic Python (LBYL):

https://github.com/microsoft/pyright/issues/1739

https://docs.python.org/3/glossary.html#term-EAFP

https://docs.python.org/3/glossary.html#term-LBYL

Sometimes dynamic Python idioms are incompatible with typed Python. I personally think that's fine, since I consider static typing a significant improvement overall.

  • This isn’t. They actually fixed that bug. Then they changed their minds and backed the fix back out again because they don’t think you should write Python that way:

    > I think EAFP is a very unfortunate and ill-advised practice.

    They want you to not write the idiomatic Python:

        try:
            foo = bar["baz"]["qux"]
            ...
        except KeyError:
            ...
    

    …and instead write the non-idiomatic version:

        if "baz" in bar and "qux" in bar["baz"]:
            foo = bar["baz"]["qux"]
            ...
        else:
            ...
    

    If this were a linter then I would accept that it is going to be opinionated. But this is not a linter, it’s a type checker. Their opinions about EAFP are irrelevant. That’s idiomatic Python.

    • Well I agree with them. The second code is clearly better. Exceptions should be used for error handling and if those keys are actually optional then you should explicitly check if they exist (or use something like `bar.get("baz")`).

      2 replies →

Eww, what? I hadn’t seen that before. Yikes, I hope the situation’s improved. I’d be butting into that continually.