-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Description
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
.