Python 3.6

Novidades da versão

Me
A full screenshot of the changes in Python 3.6
Vamos por partes
Neat.
My opinion

Underscores em números

>>> 1_000_000_000 == 1000000000
True
>>> 1_00_00_00_00_0
>>> '{:_}'.format(1000000)
'1_000_000'

String literals

>>> name = 'Julio'
>>> f'My name is {name}'
My name is Julio
>>> def f():
...     name = 'Julio'
...     print('My name is {name}'.format(**locals()))

all(list(print(f'{i} bottle{"s" if i != 1 else ""} of '
f'beer on the wall, {str(i).lower()} '
f'bottle{"s" if i != 1 else ""} of beer.\n{"Take one '
f'down pass it around" if str(i).lower() == str(i) '
f'else "Go to the store and buy some more"}, '
f'{i-1 if i not in [1, "No more"] else "no more" '
f'if i == 1 else 99} bottles of beer on the wall.\n') \
for i in list(range(99, 0, -1))+['No more'])) \
or ""
                        

Type annotations

Só pra lembrar...

>>> def(name: str) -> str:
...     return 'Hello ' + name

Não signfica que o CPython valida o parâmetro ou o retorno.

>>> captain: str    # mas continua como undefined
>>> values: List[int] = [1, 2, 4]

Essas informações podem ser extraídas de __annotations__ (assim como docstrings podem ser extraídas de __doc__).

secrets

Nova biblioteca para geração de números randômicos "fortes", utilizados para criptografia.

>>> token_hex(16)  
'f9bf78b9a18ce6d46a0cd2b0b86df9da'

enum

Novo tipo auto para gerar número automaticamente.

>>> from enum import Enum, auto
>>> class Color(Enum):
...     red = auto()
...     blue = auto()
...     green = auto()
...
>>> list(Color)
[<<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]

importlib

Ao tentar importar um módulo que não existe, será gerado ModuleNotFoundError ao invés de ImportError.

Pathlib

Representação de um caminho qualquer no sistema de arquivos.

>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
...     contents = f.read()
...      
>>> import os.path
>>> os.path.splitext(pat)
('some_file', '.txt')

Nova função para tornar objetos Path-like: __fspath()__

Novos "dicionários"

dict agora é mais compacto.

Efeito colateral: agora são ordenados em CPython, mas não no spec da linguagem Python.

  • **kwargs agora são ordenados.
  • __dict__ agora é ordenado.

Async the world!

asyncio agora é oficial.

Async generators

async def ticker(delay, to):
	"""Yield numbers from 0 to *to* every *delay* seconds."""
	for i in range(to):
		yield i
		await asyncio.sleep(delay)

Async comprehensions

result = [i async for i in aiter() if i % 2]
result = [await fun() for fun in funcs if await condition()]

Last but not least

  • Customização de classes com __init_subclass__();
  • Suporte a DTrace e SystemTrap;
  • Variável de ambiente para mudar a forma de alocação de memória e mudanças no módulo tracemalloc;
  • Desambiguação de datas com entrada do horário de verão;
  • typing com novidades;
  • os.urandom() vai bloquear até que haja entropia suficiente para gerar um número;
  • Suporte a OpenSSL 1.1.0;
  • Novos métodos criptográficos em hashlib;
  • Sistema de arquivos do Windows agora é considerado UTF-8;
  • Facilidades para definir o PATH das bibliotecas com arquivos ._pth.