8000 Consider allowing assertIsNotNone() to constitute a None check · Issue #2007 · microsoft/pyright · GitHub
[go: up one dir, main page]

Skip to content
Consider allowing assertIsNotNone() to constitute a None check #2007
@jparise

Description

@jparise

Is your feature request related to a problem? Please describe.

It's common for unit tests (based on unittest) to assert that an object is non-None and then verify some of its attributes.

def test_object(self):
    obj = load_object_by_name('name')  # type: Optional[Object]
    self.assertIsNotNone(obj)
    self.assertEqual('name', obj.name)

Pyright will flag that last line for reportOptionalMemberAccess, even though we've performed an (implied) "is not None" check via assertIsNotNone.

There are three workarounds:

Somewhat redundant

def test_object(self):
    obj = load_object_by_name('name')  # type: Optional[Object]
    self.assertIsNotNone(obj)
    if obj is not None:
        self.assertEqual('name', obj.name)

Very redundant

def test_object(self):
    obj = load_object_by_name('name')  # type: Optional[Object]
    self.assertIsNotNone(obj)
    assert is not None
    self.assertEqual('name', obj.name)

Tricky but concise

def test_object(self):
    obj = load_object_by_name('name')  # type: Optional[Object]
    self.assertIsNotNone(obj)
    self.assertEqual('name', obj and obj.name)

Describe the solution you'd like

Because unittest is part of the standard library, it would be convenient if calling assertIsNotNone (and assertIsNone) would be constitute a None check from the type checker's perspective.

Additional context

It might be too magical to apply special treatment to these methods. Perhaps there should (eventually) be a generalized typing facility that assertIsNone/assertIsNotNone could adopt, a la TypeGuard.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0