NoReturn vs. None in "void" functions - type annotations in Python 3.6

10,367

NoReturn means the function never returns a value.

The function either does not terminate or always throws an exception: "The typing module provides a special type NoReturn to annotate functions that never return normally. For example, a function that unconditionally raises an exception..".

from typing import NoReturn

def stop() -> NoReturn:
    raise RuntimeError('no way')

That is, x = foo_None() is type-valid but suspect while x = foo_NoReturn() is invalid.

Besides never having an assignable result, NoReturn also has other implications in branch analysis: foo_NoReturn(); unreachable... There is further discussion in the 'A NoReturn type is needed #165' ticket.

In order to perform branch analysis, it is necessary to know which calls will never return normally. Examples are sys.exit (which always returns via exception) and os.exit (which never returns)..

Share:
10,367
ByAgenT
Author by

ByAgenT

Updated on June 07, 2022

Comments

  • ByAgenT
    ByAgenT about 2 years

    Python 3.6 supports type annotation, like:

    def foo() -> int:
        return 42
    

    But what is expected to use when a function hasn't return anything? PEP484 examples mostly use None as a return type, but there is also NoReturn type from typing package.

    So, the question is what is preferable to use and what is considered a best practice:

    def foo() -> None:
        #do smth
    

    or

    from typing import NoReturn
    
    def foo() -> NoReturn:
        #do smth