Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

from __future__ import annotations

Python doc __future__

In python doc about __future__ there is a table below where it shows that annotations "optional in" 3.7.0b1 and "mandatory in" 4.0 but i am still able to use annotations in 3.8.2 without importing annotations then what is the use of it.

>>> def add_int(a:int, b:int) -> int:
...     return a + b
>>> add_int.__annotations__
{'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}

I doubt I don't clearly understand the meaning of "optional in" and "mandatory in" here

like image 270
CrazyPythonProgrammer Avatar asked May 01 '20 14:05

CrazyPythonProgrammer


People also ask

What does from future import annotations do?

For files with from __future__ import annotations it automatically unquotes stringified type hints.

What is import __ future __ in Python?

__future__ module is a built-in module in Python that is used to inherit new features that will be available in the new Python versions.. This module includes all the latest functions which were not present in the previous version in Python. And we can use this by importing the __future__ module.

What is from __ future __ import Print_function?

The main function of from __future__ import print_function is to bring the print function from Python 3 into Python 2.

What is from future import division?

The future division statement, spelled from __future__ import division , will change the / operator to mean true division throughout the module. A command line option will enable run-time warnings for classic division applied to int or long arguments; another command line option will make true division the default.


2 Answers

Mandatory is an interesting word choice. I guess it means that it's by default in the language. You don't have to enable it with from __future__ import annotations

The annotations feature are referring to the PEP 563: Postponed evaluation of annotations. It's an enhancement to the existing annotations feature which was initially introduced in python 3.0 and redefined as type hints in python 3.5, that's why your code works under python 3.8.

Here's what optional from __future__ import annotations changes in python 3.7+:

class A:
    def f(self) -> A: # NameError: name 'A' is not defined
        pass

but this works

from __future__ import annotations

class A:
    def f(self) -> A:
        pass

See this chapter in python 3.7 what's new about postponed annotations:

Since this change breaks compatibility, the new behavior needs to be enabled on a per-module basis in Python 3.7 using a __future__ import:

from __future__ import annotations

It will become the default in Python 3.10*.

* it was announced to be default in 3.10 (when python3.7 was released), but it was now moved to a later release

like image 101
RafalS Avatar answered Oct 27 '22 05:10

RafalS


Mandatory as in coming by default. Optional as in needed to be "activated" from an from __future__ import annotations statement

like image 14
theX Avatar answered Oct 27 '22 04:10

theX