Skip to content

Conversation

@ddfisher
Copy link
Collaborator

After this lands, per-file strict Optional should be straightforward. This should fix a lot of bugs around None. Introduces a small bug with partial types (where mypy is overly permissive) which will be fixed in a follow up PR.

@ddfisher ddfisher force-pushed the per-file-strict-optional branch from 06ae294 to c0350ca Compare March 19, 2017 00:44
@ddfisher ddfisher force-pushed the per-file-strict-optional branch from c0350ca to 9f73487 Compare March 19, 2017 00:49
@ddfisher ddfisher force-pushed the per-file-strict-optional branch from 9f73487 to 5c44790 Compare March 19, 2017 01:32
def g(self) -> None: pass
[out]
main:6: error: Return type of "f" incompatible with supertype "A"
main:7: error: Return type of "g" incompatible with supertype "A"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this no longer an error?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

None is a subtype of A, so this is valid.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, only without --strict-optional, or if the base class has -> Optional[A].

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, but --strict-optional is still not enabled by default.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I was confused by the PR title (and didn't read the whole thing).

Copy link
Collaborator

@JukkaL JukkaL left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! This simplifies things a lot and improves consistency.

# Lambdas are allowed to have None returns.
# Functions returning a value of type None are allowed to have a None return.
if isinstance(self.scope.top_function(), FuncExpr) or isinstance(typ, NoneTyp):
if is_lambda or isinstance(typ, NoneTyp):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is unclear.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added some comments

def ff() -> None:
x = f() # E: Need type annotation for variable
x = f()
reveal_type(x)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's no output from reveal_type. The desired behavior would probably be to require an annotation for x.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Filed issue for this instead: #3032.

def g(a: T) -> None: pass
[out]

[case testUnsolvableInferenceResult]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider enabling this test case and renaming it if the output doesn't correspond to the original intent of the test case.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a test involving void and is no longer relevant. It no longer tests anything interesting that is untested elsewhere.

a = x

for y in []: # E: Need type annotation for variable
for y in []:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the type of y here? I think that the original message was fine. At least add a reveal_type.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

y is inferred as None. Added a reveal_type.

a = y

for e, f in [[]]: # E: Need type annotation for variable
for e, f in [[]]:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to above; at least add reveal_types.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.


[case testPartiallyInitializedToNoneAndThenToIncompleteType]
[case testPartiallyInitializedToNoneAndThenToIncompleteType-skip]
# TODO(ddfisher): fix partial type bug and re-enable
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add an issue for this so that we won't lose track of it.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

def test() -> 'Generator[Any, None, None]':
yield from greet()
x = yield from greet() # Error
x = yield from greet()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For consistency, we should retain the original error message (... does not return a value).

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants