Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't complain about missing return with Optional[<type>] #3974

Closed
alehander92 opened this issue Sep 20, 2017 · 4 comments
Closed

Don't complain about missing return with Optional[<type>] #3974

alehander92 opened this issue Sep 20, 2017 · 4 comments

Comments

@alehander92
Copy link

from typing import Optional

def s(e: int) -> Optional[int]:
    if e > 2:
        return 4

s(2)

Currently mypy complains about missing return here and adding return None in the end of the function fixes that. However I think that's undesirable:

  • It's not actually catching a bug: it's a false positive. False positives are bad as they lead to lost time and confusion
  • It motivates people to put a useless return None line (even return doesn't work) which is just noise in the program code in this case
  • It invalidates core Python behavior: since the dawn of time, no return, return and return None mean absolutely the same in each function, but mypy only recognizes one of those forms in this case.

Obviously that seems like a simple example, but I have a longer if/elif function where mypy just says missing return on <first line of function> which has two issues : it's not a type bug, and mypy doesn't the invalid branch

@gvanrossum
Copy link
Member

This is a style issue. There's something in PEP 8 that says you should have an explicit return None in such cases.

@MicaelJarniac
Copy link

For anyone looking at this later, I think this is what they were talking about:

PEP 8 - Programming Recommendations

Be consistent in return statements. Either all return statements in a function should return an expression, or none of them should. If any return statement returns an expression, any return statements where no value is returned should explicitly state this as return None, and an explicit return statement should be present at the end of the function (if reachable):

# Correct:

def foo(x):
    if x >= 0:
        return math.sqrt(x)
    else:
        return None

def bar(x):
    if x < 0:
        return None
    return math.sqrt(x)
# Wrong:

def foo(x):
    if x >= 0:
        return math.sqrt(x)

def bar(x):
    if x < 0:
        return
    return math.sqrt(x)

@abrahammurciano
Copy link

If this behavior is explicitly desired, then there should be a clearer error message. For example instead of Missing return statement it should say:

Add explicit return statement to all code paths

@AlexWaygood
Copy link
Member

@abrahammurciano, I think that's a fair point, but I'd advise opening a new issue to discuss the error message, rather than leaving a comment on an issue that's been closed for 5 years

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

No branches or pull requests

5 participants