Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 
like image 594
ByAgenT Avatar asked Dec 30 '17 21:12

ByAgenT


People also ask

What is NoReturn in Python?

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..".

How do you write a void function in Python?

In Python, it is possible to compose a function without a return statement. Functions like this are called void, and they return None, Python's special object for "nothing". Here's an example of a void function: >>> def sayhello(who): print 'Hello,', who + '!'


1 Answers

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)..

like image 192
user2864740 Avatar answered Sep 19 '22 17:09

user2864740