Skip to content

Ternary expression of context managers is inferred as object #16055

Description

@ringohoffman

Related: #7738

A ternary expression of context managers is inferred as object, leading to an erroneous attr-defined errors about object not defining __enter__ and __exit__.

To Reproduce

class A:
    def __enter__(self) -> 'A':
        return self

    def __exit__(self, *args) -> None:
        pass

class B:
    def __enter__(self) -> 'B':
        return self

    def __exit__(self, *args) -> None:
        pass

def foo() -> bool:
    return True

a_or_b = A() if foo() else B()

reveal_type(a_or_b)  # Revealed type is "builtins.object"

with a_or_b:  # "object" has no attribute "__enter__" & "object" has no attribute "__exit__"
    ...

Gist URL: https://gist.github.com/mypy-play/8e363dcee24e9fab1c3abd89d1539635
Playground URL: https://mypy-play.net/?mypy=master&python=3.11&gist=8e363dcee24e9fab1c3abd89d1539635

Expected Behavior

I would expect that the type of "a_or_b" to be "A | B" and not raise an attr-defined error.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrongtopic-join-v-unionUsing join vs. using unions

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions