O que há de novo no Python 3.10¶
- Versão
3.10.4
- Data
maio 25, 2022
- Editor
Pablo Galindo Salgado
Esse artigo explica os novos recursos no Python 3.10, comparado ao 3.9.
Para detalhes completos, veja o changelog.
Resumo – Destaques da versão¶
Novos recursos de sintaxe:
PEP 634, Correspondência de padrão estrutural: especificação
PEP 635, Correspondência de padrão estrutural: motivação e justificativa
PEP 636, Correspondência de padrão estrutural: Tutorial
bpo-12782, Gerenciadores de contexto entre parênteses agora são permitidos oficialmente.
Novos recursos na biblioteca padrão:
PEP 618, Adiciona verificação de comprimento opcional ao zip.
Melhorias no interpretador:
PEP 626, Números de linha precisos para depuração e outras ferramentas.
New typing features:
PEP 604, Permite escrever tipos de união como X | Y
PEP 613, Apelidos de tipo explícitos
PEP 612, Variáveis de especificação de parâmetro
Descontinuações, remoções ou restrições importantes:
Novas funcionalidades¶
Gerenciadores de contexto entre parênteses¶
O uso de parênteses para continuação em várias linhas em gerenciadores de contexto agora é suportado. Isso permite a formatação de uma longa coleção de gerenciadores de contexto em várias linhas de maneira semelhante à que era possível anteriormente com instruções de importação. Por exemplo, todos esses exemplos agora são válidos:
with (CtxManager() as example):
...
with (
CtxManager1(),
CtxManager2()
):
...
with (CtxManager1() as example,
CtxManager2()):
...
with (CtxManager1(),
CtxManager2() as example):
...
with (
CtxManager1() as example1,
CtxManager2() as example2
):
...
também é possível usar uma vírgula no final do grupo fechado:
with (
CtxManager1() as example1,
CtxManager2() as example2,
CtxManager3() as example3,
):
...
Esta nova sintaxe usa as capacidades não LL(1) do novo analisador sintático. Confira PEP 617 para mais detalhes.
(Contribuição de Guido van Rossum, Pablo Galindo e Lysandros Nikolaou em bpo-12782 e bpo-40334.)
Melhores mensagens de erro¶
SyntaxErrors¶
Ao analisar o código que contém parênteses ou chaves não fechados, o interpretador agora inclui o local da chave não fechado de parênteses em vez de exibir SyntaxError: unexpected EOF while parsing ou apontando para algum local incorreto. Por exemplo, considere o seguinte código (observe o “{” não fechado):
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()
Versões anteriores do interpretador relatavam lugares confusos como local do erro de sintaxe:
File "example.py", line 3
some_other_code = foo()
^
SyntaxError: invalid syntax
mas no Python 3.10, um erro mais informativo é emitido:
File "example.py", line 1
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
^
SyntaxError: '{' was never closed
De maneira semelhante, erros envolvendo literais de string não fechadas (entre aspas simples e triplas) agora apontam para o início da string em vez de relatar EOF/EOL.
Essas melhorias são inspiradas em trabalhos anteriores no interpretador PyPy.
(Contribuição de Pablo Galindo em bpo-42864 e Batuhan Taskaya em bpo-40176.)
As exceções SyntaxError
levantadas pelo interpretador agora destacam o intervalo total de erros da expressão que constitui o próprio erro de sintaxe, em vez de apenas onde o problema foi detectado. Desta forma, em vez de exibir (antes do Python 3.10):
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
agora o Python 3.10 vai exibir a exceção como:
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
Esta melhoria foi contribuída por Pablo Galindo em bpo-43914.
Uma quantidade considerável de novas mensagens especializadas para exceções SyntaxError
foram incorporadas. Alguns dos mais notáveis são os seguintes:
Missing
:
before blocks:>>> if rocket.position > event_horizon File "<stdin>", line 1 if rocket.position > event_horizon ^ SyntaxError: expected ':'
(Contribuição de Pablo Galindo em bpo-42997)
Tuplas sem parênteses em alvos de compreensão:
>>> {x,y for x,y in zip('abcd', '1234')} File "<stdin>", line 1 {x,y for x,y in zip('abcd', '1234')} ^ SyntaxError: did you forget parentheses around the comprehension target?
(Contribuição de Pablo Galindo em bpo-43017)
Faltando vírgulas em literais de coleção e entre expressões:
>>> items = { ... x: 1, ... y: 2 ... z: 3, File "<stdin>", line 3 y: 2 ^ SyntaxError: invalid syntax. Perhaps you forgot a comma?
(Contribuição de Pablo Galindo em bpo-43822)
Vários tipos de exceção sem parênteses:
>>> try: ... build_dyson_sphere() ... except NotEnoughScienceError, NotEnoughResourcesError: File "<stdin>", line 3 except NotEnoughScienceError, NotEnoughResourcesError: ^ SyntaxError: multiple exception types must be parenthesized
(Contribuição de Pablo Galindo em bpo-43149)
Faltando
:
em valores em literais de dicionário:>>> values = { ... x: 1, ... y: 2, ... z: ... } File "<stdin>", line 4 z: ^ SyntaxError: expression expected after dictionary key and ':' >>> values = {x:1, y:2, z w:3} File "<stdin>", line 1 values = {x:1, y:2, z w:3} ^ SyntaxError: ':' expected after dictionary key
(Contribuição de Pablo Galindo em bpo-43823)
Blocos
try
sem blocosexcept
oufinally
:>>> try: ... x = 2 ... something = 3 File "<stdin>", line 3 something = 3 ^^^^^^^^^ SyntaxError: expected 'except' or 'finally' block
(Contribuição de Pablo Galindo em bpo-44305)
Uso de
=
em vez de==
nas comparações:>>> if rocket.position = event_horizon: File "<stdin>", line 1 if rocket.position = event_horizon: ^ SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
(Contribuição de Pablo Galindo em bpo-43797)
Uso de
*
em f-strings:>>> f"Black holes {*all_black_holes} and revelations" File "<stdin>", line 1 (*all_black_holes) ^ SyntaxError: f-string: cannot use starred expression here
(Contribuição de Pablo Galindo em bpo-41064)
IndentationErrors¶
Muitas exceções IndentationError
agora têm mais contexto sobre que tipo de bloco estava esperando um indentação, incluindo a localização da instrução:
>>> def foo():
... if lel:
... x = 2
File "<stdin>", line 3
x = 2
^
IndentationError: expected an indented block after 'if' statement in line 2
AttributeErrors¶
Ao exibir AttributeError
, PyErr_Display()
oferecerá sugestões de nomes de atributos semelhantes no objeto a partir do qual a exceção foi levantada:
>>> collections.namedtoplo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?
(Contribuição de Pablo Galindo em bpo-38530.)
Aviso
Observe que isso não funcionará se
PyErr_Display()
não for chamado para exibir o erro que pode ocorrer se alguma outra função personalizada de exibição de erro for usada. Este é um cenário comum em alguns REPLs, laços de leitura-avaliação-impressão, como o IPython.
NameErrors¶
Ao exibir NameError
levantada pelo interpretador, PyErr_Display()
irá oferecer sugestões de nomes de variáveis semelhantes na função de onde a exceção foi levantada:
>>> schwarzschild_black_hole = None
>>> schwarschild_black_hole
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?
(Contribuição de Pablo Galindo em bpo-38530.)
Aviso
Observe que isso não funcionará se
PyErr_Display()
não for chamado para exibir o erro que pode ocorrer se alguma outra função personalizada de exibição de erro for usada. Este é um cenário comum em alguns REPLs, laços de leitura-avaliação-impressão, como o IPython.
PEP 626: Números de linha precisos para depuração e outras ferramentas¶
O PEP 626 traz números de linha mais precisos e confiáveis para ferramentas de depuração, criação de perfil e cobertura. Eventos de rastreamento, com o número de linha correto, são gerados para todas as linhas de código executadas e apenas para linhas de código que são executadas.
O atributo f_lineno
de objetos de quadro sempre conterá o número de linha esperado.
O atributo co_lnotab
de objetos de código foi descontinuado e será removido no 3.12. O código que precisa ser convertido do deslocamento para o número da linha deve usar o novo método co_lines()
.
PEP 634: Correspondência de padrão estrutural¶
A correspondência de padrão estrutural foi adicionada na forma de uma instrução de correspondência e instruções de caso de padrões com ações associadas. Os padrões consistem em sequências, mapeamentos, tipos de dados primitivos, bem como instâncias de classe. A correspondência de padrão permite que os programas extraiam informações de tipos de dados complexos, ramifiquem na estrutura de dados e apliquem ações específicas com base em diferentes formas de dados.
Sintaxe e operações¶
A sintaxe genérica da correspondência de padrão é:
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
Uma instrução de correspondência pega uma expressão e compara seu valor com padrões sucessivos fornecidos como um ou mais blocos de caso. Especificamente, a correspondência de padrões opera:
usando dados com tipo e forma (o
subject
)avaliando o
subject
na instruçãomatch
comparando o assunto com cada padrão em uma instrução
case
de cima para baixo até que uma correspondência seja confirmada.executando a ação associada ao padrão da correspondência confirmada
Se uma correspondência exata não for confirmada, no último caso, um curinga
_
, se fornecido, será usado como o caso de correspondência. Se uma correspondência exata não for confirmada e não houver um caractere curinga, todo o bloco de correspondência será autônomo.
Abordagem declarativa¶
Os leitores podem estar cientes da correspondência de padrão por meio do exemplo simples de correspondência de um assunto (objeto de dados) a um literal (padrão) com a instrução switch encontrada em C, Java ou JavaScript (e muitas outras linguagens). Frequentemente, a instrução switch é usada para comparação de um objeto/expressão com instruções case contendo literais.
Exemplos mais poderosos de correspondência de padrão podem ser encontrados em linguagens como Scala e Elixir. Com a correspondência de padrão estrutural, a abordagem é “declarativa” e declara explicitamente as condições (os padrões) para que os dados correspondam.
Embora uma série “imperativa” de instruções usando instruções “if” aninhadas possa ser usada para realizar algo semelhante à correspondência de padrão estrutural, é menos clara do que a abordagem “declarativa”. Em vez disso, a abordagem “declarativa” estabelece as condições a serem atendidas para uma correspondência e é mais legível por meio de seus padrões explícitos. Embora a correspondência de padrão estrutural possa ser usada em sua forma mais simples comparando uma variável a um literal em uma instrução case, seu verdadeiro valor para Python reside em seu tratamento do tipo e forma do sujeito.
Padrão simples: corresponder a um literal¶
Vejamos este exemplo como correspondência de padrão em sua forma mais simples: um valor, o assunto, sendo correspondido a vários literais, os padrões. No exemplo abaixo, status
é o assunto da instrução de correspondência. Os padrões são cada uma das instruções de caso, onde literais representam códigos de status de solicitação. A ação associada ao caso é executada após uma partida:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
Se a função acima receber um status
de 418, “I’m a teapot” será retornado. Se a função acima receber um status
de 500, a instrução case com _
irá corresponder a um curinga, e “Something’s wrong with the Internet” é retornado. Observe o último bloco: o nome da variável, _
, atua como um curinga e garante que o assunto sempre corresponderá. O uso de _
é opcional.
Você pode combinar vários literais em um único padrão usando |
(“ou”):
case 401 | 403 | 404:
return "Not allowed"
Comportamento sem o curinga¶
Se modificarmos o exemplo acima removendo o último bloco case, o exemplo se tornará:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
Sem o uso de _
em uma instrução case, uma correspondência pode não existir. Se não houver correspondência, o comportamento é autônomo. Por exemplo, se o status
de 500 for passado, ocorre um no-op.
Padrões com uma literal e variável¶
Os padrões podem parecer atribuições de desempacotamento e um padrão pode ser usado para vincular variáveis. Neste exemplo, um ponto de dados pode ser descompactado em sua coordenada x e coordenada y:
# point is an (x, y) tuple
match point:
case (0, 0):
print("Origin")
case (0, y):
print(f"Y={y}")
case (x, 0):
print(f"X={x}")
case (x, y):
print(f"X={x}, Y={y}")
case _:
raise ValueError("Not a point")
O primeiro padrão tem dois literais, (0, 0)
, e pode ser considerado uma extensão do padrão literal mostrado acima. Os próximos dois padrões combinam um literal e uma variável, e a variável vincula um valor do assunto (point
). O quarto padrão captura dois valores, o que o torna conceitualmente semelhante à atribuição de desempacotamento (x, y) = point
.
Padrões e classes¶
Se estiver usando classes para estruturar seus dados, você pode usar como padrão o nome da classe seguido por uma lista de argumentos semelhante a um construtor. Este padrão tem a capacidade de capturar atributos de classe em variáveis:
class Point:
x: int
y: int
def location(point):
match point:
case Point(x=0, y=0):
print("Origin is the point's location.")
case Point(x=0, y=y):
print(f"Y={y} and the point is on the y-axis.")
case Point(x=x, y=0):
print(f"X={x} and the point is on the x-axis.")
case Point():
print("The point is located somewhere else on the plane.")
case _:
print("Not a point")
Padrões com parâmetros posicionais¶
Você pode usar parâmetros posicionais com algumas classes embutidas que fornecem uma ordem para seus atributos (por exemplo, classes de dados). Você também pode definir uma posição específica para atributos em padrões configurando o atributo especial __match_args__
em suas classes. Se for definido como (“x”, “y”), os seguintes padrões são todos equivalentes (e todos ligam o atributo y
à variável var
):
Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)
Padrões aninhados¶
Os padrões podem ser aninhados arbitrariamente. Por exemplo, se nossos dados forem uma pequena lista de pontos, eles podem ser correspondidos assim:
match points:
case []:
print("No points in the list.")
case [Point(0, 0)]:
print("The origin is the only point in the list.")
case [Point(x, y)]:
print(f"A single point {x}, {y} is in the list.")
case [Point(0, y1), Point(0, y2)]:
print(f"Two points on the Y axis at {y1}, {y2} are in the list.")
case _:
print("Something else is found in the list.")
Padrões complexos e o curinga¶
Até este ponto, os exemplos usaram _
sozinho na última instrução case. Um curinga pode ser usado em padrões mais complexos, como ('error', code, _)
. Por exemplo:
match test_variable:
case ('warning', code, 40):
print("A warning has been received.")
case ('error', code, _):
print(f"An error {code} occurred.")
No caso acima, test_variable
irá corresponder a (‘erro’, código, 100) e (‘erro’, código, 800).
Guarda¶
Podemos adicionar uma cláusula if
a um padrão, conhecido como “guarda”. Se a guarda for falsa, match
continua para tentar o próximo bloco de caso. Observe que a captura de valor ocorre antes que a guarda seja avaliada:
match point:
case Point(x, y) if x == y:
print(f"The point is located on the diagonal Y=X at {x}.")
case Point(x, y):
print(f"Point is not on the diagonal.")
Outros recursos-chave¶
Vários outros recursos-chave:
Assim como desempacotar atribuições, os padrões de tupla e lista têm exatamente o mesmo significado e realmente correspondem a sequências arbitrárias. Tecnicamente, o subject deve ser uma sequência. Portanto, uma exceção importante é que padrões não correspondem a iteradores. Também evita um erro comum, sequência de padrões não correspondem a strings.
Os padrões de sequência têm suporte a curingas:
[x, y, *rest]
e(x, y, *rest)
funcionam de forma semelhante a curingas em desempacotamentos de atribuições. O nome depois de*
também pode ser_
, então(x, y, *_)
corresponde a uma sequência de pelo menos dois itens sem ligar os itens restantes.Padrões de mapeamento:
{"bandwidth": b, "latency": l}
captura os valores"bandwidth"
e"latency"
de um dict. Diferente dos padrões de sequência, chaves extra são ignoradas. Um curinga**rest
também é permitido. (Mas**_
seria redundante, então não é permitido.)Subpadrões podem ser capturados usando a palavra reservada
as
case (Point(x1, y1), Point(x2, y2) as p2): ...
Isso liga x1, y1, x2, y2 como você esperaria sem a cláusula
as
e p2 a todo o segundo item do subject.A maioria dos literais são comparados por igualdade. No entanto, os singletons
True
,False
eNone
são comparados por identidade.Constantes nomeadas podem ser usadas em padrões. Essas constantes nomeadas devem ser nomes pontilhados para evitar que a constante seja interpretada como uma variável de captura:
from enum import Enum class Color(Enum): RED = 0 GREEN = 1 BLUE = 2 match color: case Color.RED: print("I see red!") case Color.GREEN: print("Grass is green") case Color.BLUE: print("I'm feeling the blues :(")
Para obter as especificações completas, consulte a PEP 634. A motivação e o raciocínio estão na PEP 635, e um tutorial mais longo está na PEP 636.
EncodingWarning
opcional e opção encoding="locale"
¶
A codificação padrão de TextIOWrapper
e open()
depende da plataforma e da localidade. Como o UTF-8 é usado na maioria das plataformas Unix, omitir a opção encoding
ao abrir arquivos UTF-8 (por exemplo, JSON, YAML, TOML, Markdown) é um bug muito comum. Por exemplo:
# BUG: "rb" mode or encoding="utf-8" should be used.
with open("data.json") as f:
data = json.load(f)
Para encontrar este tipo de bug, uma EncodingWarning
opcional é adicionada. É emitido quando sys.flags.warn_default_encoding
é verdadeiro e a codificação padrão específica da localidade é usada.
A opção -X warn_default_encoding
e PYTHONWARNDEFAULTENCODING
são adicionadas para ativar o aviso.
Veja Text Encoding para mais informações.
Outras mudanças na linguagem¶
O tipo
int
tem um novo métodoint.bit_count()
, retornando o número de unidades na expansão binária de um dado inteiro, também conhecido como contagem da população. (Contribuição de Niklas Fiekas em bpo-29882.)As visualizações retornadas por
dict.keys()
,dict.values()
edict.items()
agora têm um atributomapping
que fornece um objetotypes.MappingProxyType
que envolve o dicionário original. (Contribuição de Dennis Sweeney em bpo-40890.)PEP 618: A função
zip()
agora tem um sinalizador opcionalstrict
, usado para exigir que todos os iteráveis tenham um comprimento igual.Funções embutidas e de extensão que recebem argumentos inteiros não aceitam mais
Decimal
,Fraction
e outros objetos que podem ser convertidos em inteiros apenas com uma perda (por exemplo, tem o método__int__()
, mas não tem o método__index__()
). (Contribuição de Serhiy Storchaka em bpo-37999.)Se
object.__ipow__()
retornaNotImplemented
, o operador vai corretamente recorrer aoobject.__pow__()
eobject.__rpow__()
como esperado. (Contribuição de Alex Shkop em bpo-38302.)Expressões de atribuição agora podem ser usadas sem parênteses dentro de literais de conjuntos e compreensões de conjuntos, bem como em índices de sequência (mas não em fatias).
As funções têm um novo atributo
__builtins__
que é usado para procurar por símbolos embutidos quando uma função é executada, em vez de procurar em__globals__['__builtins__']
. O atributo é inicializado a partir de__globals__["__builtins__"]
se existir; do contrário, a partir dos embutidos atuais. (Contribuição de Mark Shannon em bpo-42990.)Duas novas funções embutidas –
aiter()
eanext()
foram adicionadas para fornecer contrapartes assíncronas paraiter()
enext()
, respectivamente. (Contribuição de Joshua Bronson, Daniel Pope e Justin Wang em bpo-31861.)Métodos estáticos (
@staticmethod
) e métodos de classe (@classmethod
) agora herdam os atributos de método (__module__
,__name__
,__qualname__
,__doc__
,__annotations__
) e têm um novo atributo__wrapped__
. Além disso, métodos estáticos são agora chamáveis como funções comuns. (Contribuição de Victor Stinner em bpo-43682.)Anotações para alvos complexos (tudo além de alvos de nome simples, ou
simple name
, definidos pela PEP 526) não causam mais nenhum efeito de tempo de execução comfrom __future__ import annotations
. (Contribuição de Batuhan Taskaya em bpo-42737.)Objetos classe e módulo agora criam preguiçosamente dados vazios de anotações sob demanda. Os dicionários de anotações são armazenados em
__dict__
do objeto para compatibilidade com versões anteriores. Isso melhora as melhores práticas para trabalhar com__annotations__
; para mais informações, veja Annotations Best Practices. (Contribuição de Larry Hastings em bpo-43901.)Anotações consistindo em
yield
,yield from
,await
ou expressões nomeadas agora são proibidas emfrom __future__ import annotations
por causa de seus efeitos colaterais. (Contribuição de Batuhan Taskaya em bpo-42725.)O uso de variáveis não ligadas,
super()
e outras expressões que podem alterar o processamento da tabela de símbolos como anotações são agora processadas sem efeito sobfrom __future__ import annotations
. (Contribuição de Batuhan Taskaya em bpo-42725.)Hashes de valores NaN de ambos os tipos
float
edecimal.Decimal
agora dependem da identidade do objeto. Anteriormente, eles sempre hash para0
mesmo que os valores NaN não sejam iguais uns aos outros. Isso causou um comportamento de tempo de execução potencialmente quadrático devido a colisões de hash excessivas ao criar dicionários e conjuntos contendo vários NaNs. (Contribuição de Raymond Hettinger em bpo-43475.)A
SyntaxError
(instead of aNameError
) will be raised when deleting the__debug__
constant. (Contributed by Dong-hee Na in bpo-45000.)SyntaxError
exceptions now haveend_lineno
andend_offset
attributes. They will beNone
if not determined. (Contributed by Pablo Galindo in bpo-43914.)
Novos módulos¶
Nada ainda.
Módulos melhorados¶
asyncio¶
Adiciona o método connect_accepted_socket()
até então em falta. (Contribuição de Alex Grönholm em bpo-41332.)
argparse¶
A frase enganosa “argumentos opcionais” foi substituída por “opções” na ajuda do argparse. Alguns testes podem exigir adaptação se eles dependerem da correspondência de saída exata. (Contribuição de Raymond Hettinger em bpo-9694.)
array¶
O método index()
de array.array
agora possui os parâmetros start e stop. (Contribuição de Anders Lorentsen e Zackery Spytz em bpo-31956.)
asynchat, asyncore, smtpd¶
Esses módulos foram marcados como descontinuados em sua documentação de módulo desde o Python 3.6. Uma exceção DeprecationWarning
em tempo de importação agora foi adicionada a todos esses três módulos.
base64¶
Adiciona base64.b32hexencode()
e base64.b32hexdecode()
para dar suporte a Codificação Base32 com alfabeto hexa estendido.
bdb¶
Adiciona clearBreakpoints()
para redefinir todos os pontos de interrupção definidos. (Contribuição de Irit Katriel em bpo-24160.)
bisect¶
Added the possibility of providing a key function to the APIs in the bisect
module. (Contributed by Raymond Hettinger in bpo-4356.)
codecs¶
Adiciona uma função codecs.unregister()
para cancelar um registro de uma função de pesquisa de codecs. (Contribuição de Hai Shi em bpo-41842.)
collections.abc¶
Os __args__
do genérico parametrizado para collections.abc.Callable
agora são consistentes com typing.Callable
. A classe genérica collections.abc.Callable
agora achata parâmetros de tipo, de forma semelhante ao que typing.Callable
atualmente faz. Isso significa que collections.abc.Callable[[int, str], str]
terá __args__
de (int, str, str)
; anteriormente, isso era ([int, str], str)
. Para permitir esta alteração, agora é possível criar subclasse de types.GenericAlias
e uma subclasse será retornada ao fazer um subscript do tipo collections.abc.Callable
. Observe que uma TypeError
pode ser levantada para formas inválidas de parametrizar collections.abc.Callable
que podem ter passado silenciosamente no Python 3.9. (Contribuição de Ken Jin em bpo-42195.)
contextlib¶
Adiciona um gerenciador de contexto contextlib.aclosing()
para fechar com segurança geradores assíncronos e objetos que representam recursos liberados de forma assíncrona. (Contribuição de Joongi Kim e John Belmonte em bpo-41229.)
Adiciona suporte a gerenciador de contexto assíncrono a contextlib.nullcontext()
. (Contribuição de Tom Gringauz em bpo-41543.)
Adiciona AsyncContextDecorator
, para dar suporte ao uso de gerenciadores de contexto assíncronos como decoradores.
curses¶
As funções de cores estendidas adicionadas no ncurses 6.1 serão usadas transparentemente por curses.color_content()
, curses.init_color()
, curses.init_pair()
e curses.pair_content()
. Uma nova função, curses.has_extended_color_support()
, indica se o suporte a cores estendidas é fornecido pela biblioteca ncurses subjacente. (Contribuição de Jeffrey Kintscher e Hans Petter Jansson em bpo-36982.)
As constantes BUTTON5_*
agora são expostas no módulo curses
se forem fornecidas pela biblioteca curses subjacente. (Contribuição de Zackery Spytz em bpo-39273.)
dataclasses¶
__slots__¶
Added slots
parameter in dataclasses.dataclass()
decorator.
(Contributed by Yurii Karabas in bpo-42269)
Keyword-only fields¶
dataclasses now supports fields that are keyword-only in the generated __init__ method. There are a number of ways of specifying keyword-only fields.
You can say that every field is keyword-only:
from dataclasses import dataclass
@dataclass(kw_only=True)
class Birthday:
name: str
birthday: datetime.date
Both name
and birthday
are keyword-only parameters to the
generated __init__ method.
You can specify keyword-only on a per-field basis:
from dataclasses import dataclass
@dataclass
class Birthday:
name: str
birthday: datetime.date = field(kw_only=True)
Here only birthday
is keyword-only. If you set kw_only
on
individual fields, be aware that there are rules about re-ordering
fields due to keyword-only fields needing to follow non-keyword-only
fields. See the full dataclasses documentation for details.
You can also specify that all fields following a KW_ONLY marker are keyword-only. This will probably be the most common usage:
from dataclasses import dataclass, KW_ONLY
@dataclass
class Point:
x: float
y: float
_: KW_ONLY
z: float = 0.0
t: float = 0.0
Here, z
and t
are keyword-only parameters, while x
and
y
are not.
(Contributed by Eric V. Smith in bpo-43532)
distutils¶
Todo o pacote distutils
foi descontinuado, para ser removido no Python 3.12. Sua funcionalidade para especificar compilações de pacote já foi completamente substituída por pacotes de terceiros setuptools
e packaging
, e a maioria das outras APIs comumente usadas estão disponíveis em outro lugar na biblioteca padrão (como platform
, shutil
, subprocess
ou sysconfig
). Não há planos para migrar qualquer outra funcionalidade de distutils
, e aplicativos que estão usando outras funções devem planejar fazer cópias privadas do código. Consulte PEP 632 para discussão.
O comando descontinuado bdist_wininst
no Python 3.8 foi removido. O comando bdist_wheel
agora é recomendado para distribuir pacotes binários no Windows. (Contribuição de Victor Stinner em bpo-42802.)
doctest¶
Quando um módulo não define __loader__
, recorre a __spec__.loader
. (Contribuição de Brett Cannon em bpo-42133.)
encodings¶
encodings.normalize_encoding()
agora ignora caracteres não-ASCII. (Contribuição de Hai Shi em bpo-39337.)
fileinput¶
Adiciona os parâmetros encoding e errors a fileinput.input()
e fileinput.FileInput
. (Contribuição de Inada Naoki em bpo-43712.)
fileinput.hook_compressed()
agora retorna um objeto TextIOWrapper
quando mode é “r” e o arquivo está compactado, como arquivos descompactados. (Contribuição de Inada Naoki em bpo-5758.)
faulthandler¶
O módulo faulthandler
agora detecta se um erro fatal ocorre durante a coleta do coletor de lixo. (Contribuição de Victor Stinner em bpo-44466.)
gc¶
Adiciona ganchos de auditoria para gc.get_objects()
, gc.get_referrers()
e gc.get_referents()
. (Contribuição de Pablo Galindo em bpo-43439.)
glob¶
Adiciona os parâmetros root_dir e dir_fd em glob()
e iglob()
, o que permite especificar o diretório raiz para a pesquisa. (Contribuição de Serhiy Storchaka em bpo-38144.)
hashlib¶
O módulo hashlib requer OpenSSL 1.1.1 ou mais recente. (Contribuição de Christian Heimes em PEP 644 e bpo-43669.)
O módulo hashlib tem suporte preliminar a OpenSSL 3.0.0. (Contribuição de Christian Heimes em bpo-38820 e outras issues.)
A alternativa puramente Python de pbkdf2_hmac()
foi descontinuada. No futuro, o PBKDF2-HMAC só estará disponível quando o Python for desenvolvido com suporte a OpenSSL. (Contribuição de Christian Heimes em bpo-43880.)
hmac¶
O módulo hmac agora usa a implementação HMAC do OpenSSL internamente. (Contribuição de Christian Heimes em bpo-40645.)
IDLE e idlelib¶
Make IDLE invoke sys.excepthook()
(when started without ‘-n’).
User hooks were previously ignored. (Contributed by Ken Hilton in
bpo-43008.)
Rearrange the settings dialog. Split the General tab into Windows and Shell/Ed tabs. Move help sources, which extend the Help menu, to the Extensions tab. Make space for new options and shorten the dialog. The latter makes the dialog better fit small screens. (Contributed by Terry Jan Reedy in bpo-40468.) Move the indent space setting from the Font tab to the new Windows tab. (Contributed by Mark Roseman and Terry Jan Reedy in bpo-33962.)
The changes above were backported to a 3.9 maintenance release.
Adiciona uma barra lateral ao console. Move o prompt principal (‘>>>’) para a barra lateral. Adiciona prompts secundários (’…’) à barra lateral. Clicar com o botão esquerdo e opcionalmente arrastar seleciona uma ou mais linhas de texto, como na barra lateral do número da linha do editor. Clicar com o botão direito após selecionar as linhas de texto exibe um menu de contexto com “copy with prompts”. Isso compacta os prompts da barra lateral com linhas do texto selecionado. Esta opção também aparece no menu de contexto para o texto. (Contribuição de Tal Einat em bpo-37903.)
Use spaces instead of tabs to indent interactive code. This makes interactive code entries ‘look right’. Making this feasible was a major motivation for adding the shell sidebar. (Contributed by Terry Jan Reedy in bpo-37892.)
Highlight the new soft keywords match
,
case
, and _
in
pattern-matching statements. However, this highlighting is not perfect
and will be incorrect in some rare cases, including some _
-s in
case
patterns. (Contributed by Tal Einat in bpo-44010.)
New in 3.10 maintenance releases.
Apply syntax highlighting to .pyi files. (Contributed by Alex Waygood and Terry Jan Reedy in bpo-45447.)
importlib.metadata¶
Paridade de recursos com importlib_metadata
4.6 (histórico).
importlib.metadata entry points
now provide a nicer experience
for selecting entry points by group and name through a new
importlib.metadata.EntryPoints
class. See the Compatibility
Note in the docs for more info on the deprecation and usage.
Adicionada importlib.metadata.packages_distributions()
para resolver módulos e pacotes Python de alto nível com suas importlib.metadata.Distribution
.
inspect¶
Quando um módulo não define __loader__
, recorre a __spec__.loader
. (Contribuição de Brett Cannon em bpo-42133.)
Adiciona inspect.get_annotations()
, que calcula com segurança as anotações definidas em um objeto. Ele contorna as peculiaridades de acessar as anotações em vários tipos de objetos e faz poucas suposições sobre o objeto que examina. inspect.get_annotations()
também pode desfazer a string corretamente de anotações em string. inspect.get_annotations()
agora é considerada a melhor prática para acessar o dict de anotações definido em qualquer objeto Python; para mais informações sobre as melhores práticas para trabalhar com anotações, consulte Annotations Best Practices. Da mesma forma, inspect.signature()
, inspect.Signature.from_callable()
e inspect.Signature.from_function()
agora chamam inspect.get_annotations()
para recuperar anotações. Isso significa que inspect.signature()
e inspect.Signature.from_callable()
agora também podem remover a string de anotações em string. (Contribuição de Larry Hastings em bpo-43817.)
itertools¶
Add itertools.pairwise()
.
(Contributed by Raymond Hettinger in bpo-38200.)
linecache¶
Quando um módulo não define __loader__
, recorre a __spec__.loader
. (Contribuição de Brett Cannon em bpo-42133.)
os¶
Adiciona suporte a os.cpu_count()
para RTOS de VxWorks. (Contribuição de Peixing Xin em bpo-41440.)
Adiciona uma nova função os.eventfd()
e auxiliares relacionados para envolver a chamada de sistema eventfd2
no Linux. (Contribuição de Christian Heimes em bpo-41001.)
Adiciona os.splice()
que permite mover dados entre dois descritores de arquivo sem copiar entre o espaço de endereço do kernel e o espaço de endereço do usuário, onde um dos descritores de arquivo deve se referir a um encadeamento (pipe). (Contribuição de Pablo Galindo em bpo-41625.)
Adiciona O_EVTONLY
, O_FSYNC
, O_SYMLINK
e O_NOFOLLOW_ANY
para macOS. (Contribuição de Dong-hee Na em bpo-43106.)
os.path¶
os.path.realpath()
agora aceita um argumento somente-nomeado strict. Quando definido como True
, a exceção OSError
é levantada se um caminho não existe ou um loop de link simbólico é encontrado. (Contribuição de Barney Gale em bpo-43757.)
pathlib¶
Adiciona suporte a fatiar a PurePath.parents
. (Contribuição de Joshua Cannon em bpo-35498)
Adiciona suporte a indexação negativa a PurePath.parents
. (Contribuição de Yaroslav Pankovych em bpo-21041)
Adiciona o método Path.hardlink_to
que substitui link_to()
. O novo método tem a mesma ordem de argumentos que symlink_to()
. (Contribuição de Barney Gale em bpo-39950.)
pathlib.Path.stat()
e chmod()
agora aceita um argumento somente-nomeado follow_symlinks para consistência com as funções correspondentes no módulo os
. (Contribuição de Barney Gale em bpo-39906.)
platform¶
Adiciona platform.freedesktop_os_release()
para obter a identificação do sistema operacional a partir do arquivo padrão os-release do freedesktop.org. (Contribuição de Christian Heimes em bpo-28468)
pprint¶
pprint.pprint()
agora aceita um novo argumento nomeado underscore_numbers
. (Contribuição de sblondon em bpo-42914.)
pprint
agora pode fazer impressão bonita de instâncias de dataclasses.dataclass
. (Contribuição de Lewis Gaul em bpo-43080.)
py_compile¶
Adiciona a opção --quiet
à interface de linha de comando de py_compile
. (Contribuição de Gregory Schevchenko em bpo-38731.)
pyclbr¶
Adiciona um atributo end_lineno
aos objetos Function
e Class
na árvore retornada por pyclbr.readline()
e pyclbr.readline_ex()
. Isso corresponde ao lineno
(início) existente. (Contribuição de Aviral Srivastava em bpo-38307.)
shelve¶
O módulo shelve
agora usa pickle.DEFAULT_PROTOCOL
por padrão em vez do protocolo 3
do pickle
ao criar “shelves”. (Contribuição de Zackery Spytz em bpo-34204.)
statistics¶
Adiciona covariance()
, correlation()
do Pearson, e funções simples linear_regression()
. (Contribuição de Tymoteusz Wołodźko em bpo-38490.)
site¶
Quando um módulo não define __loader__
, recorre a __spec__.loader
. (Contribuição de Brett Cannon em bpo-42133.)
socket¶
A exceção socket.timeout
é agora um apelido de TimeoutError
. (Contribuição de Christian Heimes em bpo-42413.)
Adiciona a opção de criar soquetes MPTCP com IPPROTO_MPTCP
(Contribuição de Rui Cunha em bpo-43571.)
Adiciona a opção IP_RECVTOS
para receber o tipo do serviço (ToS) ou campos DSCP/ECN (Contribuição de Georg Sauthoff em bpo-44077.)
ssl¶
O módulo ssl requer OpenSSL 1.1.1 ou mais recente. (Contribuição de Christian Heimes em PEP 644 e bpo-43669.)
O módulo ssl tem um suporte preliminar para OpenSSL 3.0.0 e a nova opção OP_IGNORE_UNEXPECTED_EOF
. (Contribuição de Christian Heimes em bpo-38820, bpo-43794, bpo-43788, bpo-43791, bpo-43799, bpo-43920, bpo-43789 e bpo-43811.)
Função descontinuada e o uso de constantes descontinuadas agora resultam em uma DeprecationWarning
. ssl.SSLContext.options
tem OP_NO_SSLv2
e OP_NO_SSLv3
definidos por padrão e, portanto, não consegue avisar sobre a definição do sinalizador novamente. A seção de descontinuidade tem uma lista de recursos descontinuados. (Contribuição de Christian Heimes em bpo-43880.)
O módulo ssl agora tem configurações padrão mais seguras. Cifras sem forward secrecy ou SHA-1 MAC são desabilitadas por padrão. O nível de segurança 2 proíbe chaves fracas RSA, DH e ECC com menos de 112 bits de segurança. SSLContext
assume como padrão a versão mínima do protocolo TLS 1.2. As configurações são baseadas na pesquisa de Hynek Schlawack. (Contribuição de Christian Heimes em bpo-43998.)
Os protocolos descontinuados SSL 3.0, TLS 1.0 e TLS 1.1 não são mais oficialmente suportados. Python não os bloqueia ativamente. No entanto, as opções de compilação do OpenSSL, configurações de distro, patches de fornecedores e suítes de criptografia podem impedir um handshake bem-sucedido.
Adiciona um parâmetro timeout à função ssl.get_server_certificate()
. (Contribuição de Zackery Spytz em bpo-31870.)
O módulo ssl usa tipos de heap e inicialização multifásica. (Contribuição de Christian Heimes em bpo-42333.)
Uma nova sinalização de verificação VERIFY_X509_PARTIAL_CHAIN
foi adicionada. (Contribuição de l0x em bpo-40849.)
sqlite3¶
Adiciona eventos de auditoria para connect/handle()
, enable_load_extension()
e load_extension()
. (Contribuição de Erlend E. Aasland em bpo-43762.)
sys¶
Adiciona o atributo sys.orig_argv
: a lista de argumentos de linha de comando originais passada para o executável Python. (Contribuição de Victor Stinner em bpo-23427.)
Adiciona sys.stdlib_module_names
, contendo a lista de nomes de módulos da biblioteca padrão. (Contribuição de Victor Stinner em bpo-42955.)
_thread¶
_thread.interrupt_main()
agora aceita um n´mero de sinal opcional para simular (o padrão ainda é signal.SIGINT
). (Contribuição de Antoine Pitrou em bpo-43356.)
threading¶
Adiciona threading.gettrace()
e threading.getprofile()
para obter as funções definidas por threading.settrace()
e threading.setprofile()
, respectivamente. (Contribuição de Mario Corchero em bpo-42251.)
Adiciona threading.__excepthook__
para permitir obtenção do valor original de threading.excepthook()
no caso dele estar definido com um valor quebrado ou diferente. (Contribuição de Mario Corchero em bpo-42308.)
traceback¶
As funções format_exception()
, format_exception_only()
e print_exception()
podem agora receber um objeto exceção como um argumento somente-posicional. (Contribuição de Zackery Spytz e Matthias Bussonnier em bpo-26389.)
types¶
Reintroduz as classes types.EllipsisType
, types.NoneType
e types.NotImplementedType
, fornecendo um novo conjunto de tipos prontamente interpretáveis pelos verificadores de tipo. (Contribuição de Bas van Beek em bpo-41810.)
typing¶
For major changes, see Novos recurso relacionados a dicas de tipo.
O comportamento de typing.Literal
foi alterado para ficar em conformidade com a:pep:586 e para corresponder ao comportamento de verificadores de tipo estático especificados na PEP.
Literal
agora elimina a duplicação de parâmetros.Comparações de igualdade entre objetos
Literal
agora são independentes da ordem.Literal
comparisons now respect types. For example,Literal[0] == Literal[False]
previously evaluated toTrue
. It is nowFalse
. To support this change, the internally used type cache now supports differentiating types.Objetos
Literal
agora irão levantar uma exceçãoTypeError
durante as comparações de igualdade se algum de seus parâmetros não for hasheáveis. Observe que declararLiteral
com parâmetros inalteráveis não acusará um erro:>>> from typing import Literal >>> Literal[{0}] >>> Literal[{0}] == Literal[{False}] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'set'
(Contribuição de Yurii Karabas em bpo-42345.)
Adiciona uma nova função typing.is_typeddict()
para fazer introspecção se uma anotação for uma typing.TypedDict
. (Contribuição de Patrick Reader em bpo-41792)
Subclasses de typing.Protocol
que apenas têm variáveis de dados declaradas agora irão levantar um TypeError
quando verificadas com isinstance
a menos que sejam decoradas com runtime_checkable()
. Anteriormente, essas verificações eram aprovadas silenciosamente. Os usuários devem decorar suas subclasses com o decorador runtime_checkable()
se quiserem protocolos de tempo de execução. (Contribuição de Yurii Karabas em bpo-38908)
Importing from the typing.io
and typing.re
submodules will now emit
DeprecationWarning
. These submodules have been deprecated since
Python 3.8 and will be removed in a future version of Python. Anything
belonging to those submodules should be imported directly from
typing
instead.
(Contributed by Sebastian Rittau in bpo-38291)
unittest¶
Adiciona novo método new assertNoLogs()
para complementar o existente assertLogs()
. (Contribuição de Kit Yan Choi em bpo-39385.)
urllib.parse¶
Versões do Python anteriores ao Python 3.10 permitiam o uso de ;
e &
como separadores de parâmetros de consulta em urllib.parse.parse_qs()
e urllib.parse.parse_qsl()
. Devido a questões de segurança e em conformidade com as recomendações mais recentes do W3C, isso foi alterado para permitir apenas uma única chave separadora, com &
como padrão. Esta mudança também afeta cgi.parse()
e cgi.parse_multipart()
já que elas usam as funções afetadas internamente. Para obter mais detalhes, consulte a respectiva documentação. (Contribuição de Adam Goldschmidt, Senthil Kumaran e Ken Jin em bpo-42967.)
A presença de caracteres de nova linha ou tab em partes de um URL permite algumas formas de ataques. Seguindo a especificação WHATWG que atualiza RFC 3986, nova linha ASCII \n
, \r
e os caracteres de tabulação \t
são retirados da URL pelo analisador sintático em urllib.parse
impedindo tais ataques. Os caracteres de remoção são controlados por uma nova variável de nível de módulo urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE
. (Veja bpo-43882)
xml¶
Adiciona uma classe LexicalHandler
ao módulo xml.sax.handler
. (Contribuição de Jonathan Gossage e Zackery Spytz em bpo-35018.)
zipimport¶
Adiciona métodos relacionados à PEP 451: find_spec()
, zipimport.zipimporter.create_module()
e zipimport.zipimporter.exec_module()
. (Contribuição de Brett Cannon em bpo-42131.)
Adiciona o método invalidate_caches()
. (Contribuição de Desmond Cheong em bpo-14678.)
Otimizações¶
Os construtores
str()
,bytes()
ebytearray()
estão agora mais rápido (cerca de 30–40% para objetos pequenos). (Contribuição de Serhiy Storchaka em bpo-41334.)O módulo
runpy
agora importa menos módulos. O tempo de inicialização do comandopython3 -m module-name
é 1,4 vezes mais rápido em média. No Linux,python3 -I -m module-name
importa 69 módulos no Python 3.9, sendo que importa apenas 51 módulos (-18) no Python 3.10. (Contribuição de Victor Stinner em bpo-41006 e bpo-41718.)A instrução
LOAD_ATTR
agora usa o novo mecanismo “cache por opcode”. É cerca de 36% mais rápido agora para atributos regulares e 44% mais rápido para slots. (Contribuição de Pablo Galindo e Yury Selivanov em bpo-42093 e Guido van Rossum em bpo-42927, com base em ideias implementadas originalmente em PyPy e MicroPython.)Ao construir o Python com
--enable-optimizations
agora,-fno-semantic-interposition
é adicionado à linha de compilação e vinculação. Isso acelera as compilações do interpretador Python criado com--enable-shared
comgcc
em até 30%. Consulte este artigo para mais detalhes. (Contribuição de Victor Stinner e Pablo Galindo em bpo-38980.)Usa um novo código de gerenciamento de buffer de saída para os módulos
bz2
/lzma
/zlib
e adiciona a função.readall()
à classe_compression.DecompressReader
. A descompressão bz2 agora é 1,09x ~ 1.17x mais rápida, a descompressão lzma 1.20x ~ 1.32x mais rápida,GzipFile.read(-1)
1,11x ~ 1.18x mais rápida. (Contribuição de Ma Lin, revisada por Gregory P. Smith, em bpo-41486)Ao usar anotações em strings, dicts de anotações para funções não são mais criados quando a função é criada. Em vez disso, eles são armazenados como uma tupla de strings, e o objeto função converte lentamente isso no dict de anotações sob demanda. Essa otimização reduz pela metade o tempo de CPU necessário para definir uma função anotada. (Contribuição de Yurii Karabas e Inada Naoki em bpo-42202)
Funções de pesquisa de substring como
str1 in str2
estr2.find(str1)
agora às vezes usam o algoritmo de pesquisa de string “Two-Way” de Crochemore & Perrin para evitar comportamento quadrático em strings longas. (Contribuição de Dennis Sweeney em bpo-41972)Adiciona micro-otimizações a
_PyType_Lookup()
para melhorar o desempenho de pesquisa de cache de atributo de tipo no caso comum de acessos de cache. Isso torna o interpretador 1,04 vezes mais rápido, em média. (Contribuição de Dino Viehland em bpo-43452)As seguintes funções embutidas agora oferecem suporte a uma convenção de chamada de vectorcalls mais rápidos da PEP 590:
map()
,filter()
,reversed()
,bool()
efloat()
. (Contribuição de Dong-hee Na e Jeroen Demeyer em bpo-43575, bpo-43287, bpo-41922, bpo-41873 e bpo-41870)O desempenho de
BZ2File
foi melhorado removendo oRLock
interno. Isso tornaBZ2File
inseguro para threads em face a vários leitores ou gravadores simultâneos, da mesma forma que suas classes equivalentes emgzip
elzma
têm sido. (Contribuição de Inada Naoki em bpo-43785).
Descontinuados¶
Currently Python accepts numeric literals immediately followed by keywords, for example
0in x
,1or x
,0if 1else 2
. It allows confusing and ambiguous expressions like[0x1for x in y]
(which can be interpreted as[0x1 for x in y]
or[0x1f or x in y]
). Starting in this release, a deprecation warning is raised if the numeric literal is immediately followed by one of keywordsand
,else
,for
,if
,in
,is
andor
. In future releases it will be changed to syntax warning, and finally to syntax error. (Contributed by Serhiy Storchaka in bpo-43833).A partir desta versão, haverá um esforço concentrado para começar a limpar a semântica de importação antiga que foi mantida para compatibilidade com Python 2.7. Especificamente,
find_loader()
/find_module()
(substituídos porfind_spec()
),load_module()
(substituído porexec_module()
),module_repr()
(que o sistema de importação cuida para você), o atributo__package__
(substituído por__spec__.parent
), o atributo__loader__
(substituído por__spec__.loader
), e o atributo__cached__
( substituído por__spec__.cached
) será removido lentamente (assim como outras classes e métodos emimportlib
).ImportWarning
e/ouDeprecationWarning
será levantada conforme apropriado para ajudar a identificar o código que precisa ser atualizado durante esta transição.Todo o espaço de nomes de
distutils
foi descontinuado, para ser removido no Python 3.12. Consulte a seção de alterações do módulo para mais informações.Argumentos não inteiros para
random.randrange()
foram descontinuados. A exceçãoValueError
foi descontinuada em favor de uma exceçãoTypeError
. (Contribuição de Serhiy Storchaka e Raymond Hettinger em bpo-37319.)Os vários métodos de
load_module()
deimportlib
foram documentados como descontinuados desde Python 3.6, mas agora também irão disparar umDeprecationWarning
. Useexec_module()
em vez disso. (Contribuição de Brett Cannon em bpo-26131.)zimport.zipimporter.load_module()
foi descontinuado em preferência aexec_module()
. (Contribuição de Brett Cannon em bpo-26131.)O uso de
load_module()
pelo sistema de importação agora dispara uma exceçãoImportWarning
, poisexec_module()
é preferível. (Contribuição de Brett Cannon em bpo-26131.)O uso de
importlib.abc.MetaPathFinder.find_module()
eimportlib.abc.PathEntryFinder.find_module()
pelo sistema de importação agora dispara uma exceçãoImportWarning
, poisimportlib.abc.MetaPathFinder.find_spec()
eimportlib.abc.PathEntryFinder.find_spec()
são preferidos, respectivamente. Você pode usarimportlib.util.spec_from_loader()
para ajudar no port. (Contribuição de Brett Cannon em bpo-42134.)O uso de
importlib.abc.PathEntryFinder.find_loader()
pelo sistema de importação agora dispara uma exceçãoImportWarning
, poisimportlib.abc.PathEntryFinder.find_spec()
é preferido. Você pode usarimportlib.util.spec_from_loader()
para ajudar no port. (Contribuição de Brett Cannon em bpo-43672.)The various implementations of
importlib.abc.MetaPathFinder.find_module()
(importlib.machinery.BuiltinImporter.find_module()
,importlib.machinery.FrozenImporter.find_module()
,importlib.machinery.WindowsRegistryFinder.find_module()
,importlib.machinery.PathFinder.find_module()
,importlib.abc.MetaPathFinder.find_module()
),importlib.abc.PathEntryFinder.find_module()
(importlib.machinery.FileFinder.find_module()
), andimportlib.abc.PathEntryFinder.find_loader()
(importlib.machinery.FileFinder.find_loader()
) now raiseDeprecationWarning
and are slated for removal in Python 3.12 (previously they were documented as deprecated in Python 3.4). (Contributed by Brett Cannon in bpo-42135.)importlib.abc.Finder
foi descontinuada (incluindo seu único método,find_module()
).importlib.abc.MetaPathFinder
eimportlib.abc.PathEntryFinder
não mais herdam da classe. Usuários devem herdar de uma dessas duas classes conforme apropriado. (Contribuição de Brett Cannon em bpo-42135.)As descontinuações de
imp
,importlib.find_loader()
,importlib.util.set_package_wrapper()
,importlib.util.set_loader_wrapper()
,importlib.util.module_for_loader()
,pkgutil.ImpImporter
epkgutil.ImpLoader
foram todas atualizadas para listar Python 3.12 como a versão programada para remoção (elas começaram a levantarDeprecationWarning
em versões anteriores do Python). (Contribuição de Brett Cannon em bpo-43720.)O sistema de importação agora usa o atributo
__spec__
em módulos antes de recorrer amodule_repr()
para um método__repr__()
do módulo. A remoção do uso demodule_repr()
está programado para Python 3.12. (Contribuição de Brett Cannon em bpo-42137.)importlib.abc.Loader.module_repr()
,importlib.machinery.FrozenLoader.module_repr()
eimportlib.machinery.BuiltinLoader.module_repr()
foram descontinuadas e progamadas para remoção no Python 3.12. (Contribuição de Brett Cannon em bpo-42136.)sqlite3.OptimizedUnicode
teve a documentação removida e foi descontinuado desde o Python 3.3, quando foi tornado um apelido parastr
. Foi agora descontinuado, programado para remoção no Python 3.12. (Contribuição de Erlend E. Aasland em bpo-42264.)asyncio.get_event_loop()
now emits a deprecation warning if there is no running event loop. In the future it will be an alias ofget_running_loop()
.asyncio
functions which implicitly createFuture
orTask
objects now emit a deprecation warning if there is no running event loop and no explicit loop argument is passed:ensure_future()
,wrap_future()
,gather()
,shield()
,as_completed()
and constructors ofFuture
,Task
,StreamReader
,StreamReaderProtocol
. (Contributed by Serhiy Storchaka in bpo-39529.)A função embutida não documentada
sqlite3.enable_shared_cache
foi agora descontinuada, agendada para remoção no Python 3.12. Seu uso é fortemente desencorajado pela documentação do SQLite3. Veja a documentação do SQLite3 para mais detalhes. Se um cache compartilhado deve ser usado, abra o banco de dados no modo URI usando o parâmetro de consultacache=shared
. (Contribuição de Erlend E. Aasland em bpo-24464.)Os seguintes métodos de
threading
foram agora descontinuados:threading.currentThread
=>threading.current_thread()
threading.activeCount
=>threading.active_count()
threading.Condition.notifyAll
=>threading.Condition.notify_all()
threading.Event.isSet
=>threading.Event.is_set()
threading.Thread.setName
=>threading.Thread.name
threading.thread.getName
=>threading.Thread.name
threading.Thread.isDaemon
=>threading.Thread.daemon
threading.Thread.setDaemon
=>threading.Thread.daemon
(Contribuição de Jelle Zijlstra em bpo-21574.)
pathlib.Path.link_to()
foi descontinuado e programado para remoção no Python 3.12. Usepathlib.Path.hardlink_to()
em vez disso. (Contribuição de Barney Gale em bpo-39950.)cgi.log()
foi descontinuado e programado para remoção no Python 3.12. (Contribuição de Inada Naoki em bpo-41139.)Os recurso a seguir do
ssl
foram descontinuados desde o Python 3.6, Python 3.7 ou OpenSSL 1.1.0, e serão removidos no 3.11:OP_NO_SSLv2
,OP_NO_SSLv3
,OP_NO_TLSv1
,OP_NO_TLSv1_1
,OP_NO_TLSv1_2
eOP_NO_TLSv1_3
foram substituídos porsslSSLContext.minimum_version
esslSSLContext.maximum_version
.PROTOCOL_SSLv2
,PROTOCOL_SSLv3
,PROTOCOL_SSLv23
,PROTOCOL_TLSv1
,PROTOCOL_TLSv1_1
,PROTOCOL_TLSv1_2
ePROTOCOL_TLS
foram descontinuados em favor dePROTOCOL_TLS_CLIENT
ePROTOCOL_TLS_SERVER
wrap_socket()
foi substituída porssl.SSLContext.wrap_socket()
RAND_pseudo_bytes()
,RAND_egd()
Recurso de NPN como
ssl.SSLSocket.selected_npn_protocol()
essl.SSLContext.set_npn_protocols()
foram substituídos por ALPN.
A depuração de threads (variável de ambiente
PYTHONTHREADDEBUG
) foi descontinuada no Python 3.10 e será removida no Python 3.12. Este recurso exige uma construção de depuração de Python. (Contribuição de Victor Stinner em bpo-44584.)Importing from the
typing.io
andtyping.re
submodules will now emitDeprecationWarning
. These submodules will be removed in a future version of Python. Anything belonging to these submodules should be imported directly fromtyping
instead. (Contributed by Sebastian Rittau in bpo-38291)
Removidos¶
Removidos os métodos especiais
__int__
,__float__
,__floordiv__
,__mod__
,__divmod__
,__rfloordiv__
,__rmod__
e__rdivmod__
da classecomplex
. Eles sempre levantavam uma exceçãoTypeError
. (Contribuição de Serhiy Storchaka em bpo-41974.)O método
ParserBase.error()
do módulo privado e não documentado_markupbase
foi removido.html.parser.HTMLParser
é a única subclasse deParserBase
e sua implementação deerror()
já tinha sido removida no Python 3.5. (Contribuição de Berker Peksag em bpo-31844.)Removido o atributo
unicodedata.ucnhash_CAPI
que foi um objeto interno PyCapsule. A estrutura privada relacionada_PyUnicode_Name_CAPI
foi movida para uma API C interna. (Contribuição de Victor Stinner em bpo-42157.)Removido o módulo
parser
, que foi descontinuado em 3.9 em razão da mudança para o novo analisador sintático GASE, bem como todo os arquivos código-fonte e cabeçalhos C que estavam sendo usados pelo analisador sintático antigo, incluindonode.h
,parser.h
,graminit.h
egrammar.h
.Removidas as funções de API C pública
PyParser_SimpleParseStringFlags
,PyParser_SimpleParseStringFlagsFilename
,PyParser_SimpleParseFileFlags
ePyNode_Compile
que foram descontinuadas no 3.9 em razão da mudança para o novo analisador sintático GASE.Removido o módulo
formatter
, que foi descontinuado no Python 3.4. É um tanto obsoleto, pouco usado e não testado. Ele foi originalmente programado para ser removido no Python 3.6, mas tais remoções foram adiadas até depois do fim de vida do Python 2.7. Os usuários existentes devem copiar quaisquer classes que usam em seu código. (Contribuição de Dong-hee Na e Terry J. Reedy em bpo-42299.)Removida a função
PyModule_GetWarningsModule()
que era inútil agora em razão do módulo _warnings ser convertido a um módulo embutido no 2.6. (Contribuição de Hai Shi em bpo-42599.)Remove apelidos descontinuados para Classes Base Abstratas de Coleções do módulo
collections
. (Contribuição de Victor Stinner em bpo-37324.)O parâmetro
loop
foi removido da maioria da API de alto nível doasyncio
seguindo a descontinuidade no Python 3.8. A motivação por trás desta alteração é multifacetada:Isso simplifica a API de alto nível.
As funções na API de alto nível obtêm implicitamente o laço de eventos em execução do thread atual desde o Python 3.7. Não há necessidade de passar o laço de eventos para a API na maioria dos casos de uso normais.
A passagem de laço de eventos está sujeita a erros, especialmente ao lidar com laços em execução em diferentes threads.
Note that the low-level API will still accept
loop
. See Alterações na API Python for examples of how to replace existing code.(Contribuição de Yurii Karabas, Andrew Svetlov, Yury Selivanov e Kyle Stanley em bpo-42392.)
Portando para Python 3.10¶
Esta seção lista as alterações descritas anteriormente e outras correções que podem exigir alterações no seu código.
Alterações na sintaxe Python¶
Deprecation warning is now emitted when compiling previously valid syntax if the numeric literal is immediately followed by a keyword (like in
0in x
). In future releases it will be changed to syntax warning, and finally to a syntax error. To get rid of the warning and make the code compatible with future releases just add a space between the numeric literal and the following keyword. (Contributed by Serhiy Storchaka in bpo-43833).
Alterações na API Python¶
Os parâmetros etype das funções
format_exception()
,format_exception_only()
eprint_exception()
no módulotraceback
foram renomeadas para exc. (Contribuição de Zackery Spytz e Matthias Bussonnier em bpo-26389.)atexit
: Ao sair do Python, se uma função de retorno registrada comatexit.register()
falhar, sua exceção agora é registrada nos logs. Anteriormente, apenas algumas exceções eram registradas nos logs e a última exceção era sempre ignorada silenciosamente. (Contribuição de Victor Stinner em bpo-42639.)A classe genérica
Collections.abc.Callable
agora nivela os parâmetros de tipo, similar ao quetyping.Callable
faz atualmente. Isso significa quecollections.abc.Callable[[int, str], str]
terá__args__
de(int, str, str)
; anteriormente era([int, str], str)
. O código que acessa os argumentos viatyping.get_args()
ou__args__
precisa levar em conta esta mudança. Além disso,TypeError
pode ser levantada para formas inválidas de parametrizaçãoCollections.abc.Callable
que pode ter passada silenciosamente no Python 3.9. (Contribuição de Ken Jin em bpo-42195.)socket.htons()
esocket.ntohs()
agora levantamOverflowError
em vez deDeprecationWarning
se o parâmetro dado não couber em um inteiro sem sinal de 16 bits. (Contribuição de Erlend E. Aasland em bpo-42393.)O parâmetro
loop
foi removido da maioria da API de alto nível doasyncio
seguindo a descontinuidade no Python 3.8.A corrotina que atualmente se parece com isso:
async def foo(loop): await asyncio.sleep(1, loop=loop)
Deve ser substituída por isso:
async def foo(): await asyncio.sleep(1)
Se
foo()
for especificamente projetado para não executar no laço de eventos em execução da thread atual (por exemplo, executar no laço de eventos de outra thread), considere usarasyncio.run_coroutine_threadsafe()
.(Contribuição de Yurii Karabas, Andrew Svetlov, Yury Selivanov e Kyle Stanley em bpo-42392.)
The
types.FunctionType
constructor now inherits the current builtins if the globals dictionary has no"__builtins__"
key, rather than using{"None": None}
as builtins: same behavior aseval()
andexec()
functions. Defining a function withdef function(...): ...
in Python is not affected, globals cannot be overridden with this syntax: it also inherits the current builtins. (Contributed by Victor Stinner in bpo-42990.)
Alterações na API C¶
As funções de API C
PyParser_SimpleParseStringFlags
,PyParser_SimpleParseStringFlagsFilename
,PyParser_SimpleParseFileFlags
,PyNode_Compile
e o tipo usado por essas funções,struct _node
, foram removidos em razão da mudança para o novo analisador sintático GASE.O código-fonte deveria agora ser compilado diretamente para um objeto código usando, por exemplo,
Py_CompileString()
. O objeto código resultante pode ser então avaliado usando, por exemplo,PyEval_EvalCode()
.Especificamente:
Uma chamada para
PyParser_SimpleParseStringFlags
seguida porPyNode_Compile
pode ser substituída por chamarPy_CompileString()
.Não há substituição direta para
PyParser_SimpleParseFileFlags
. Para compilar código de um argumentoFILE *
, você vai precisar ler o arquivo em C e passar o buffer resultante paraPy_CompileString()
.Para compilar um arquivo de um nome de arquivo
char *
dado, abra explicitamente o arquivo, leia-o e compile o resultado. Uma forma de fazer isso é usando o móduloio
comPyImport_ImportModule()
,PyObject_CallMethod()
,PyBytes_AsString()
ePy_CompileString()
, como esboçado abaixo. (Declarações e tratamento de erro foram omitidos.)io_module = Import_ImportModule("io"); fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb"); source_bytes_object = PyObject_CallMethod(fileobject, "read", ""); result = PyObject_CallMethod(fileobject, "close", ""); source_buf = PyBytes_AsString(source_bytes_object); code = Py_CompileString(source_buf, filename, Py_file_input);
For
FrameObject
objects, thef_lasti
member now represents a wordcode offset instead of a simple offset into the bytecode string. This means that this number needs to be multiplied by 2 to be used with APIs that expect a byte offset instead (likePyCode_Addr2Line()
for example). Notice as well that thef_lasti
member ofFrameObject
objects is not considered stable: please usePyFrame_GetLineNumber()
instead.
Alterações de bytecode do CPython¶
A instrução
MAKE_FUNCTION
agora aceita um dicionário ou uma tupla de strings como as anotações da função. (Contribuição de Yurii Karabas e Inada Naoki em bpo-42202)
Alterações de compilação¶
PEP 644: Python agora exige OpenSSL 1.1.1 ou mais novo. OpenSSL 1.0.2 não é mais suportado. (Contribuição de Christian Heimes em bpo-43669.)
As funções C99
snprintf()
evsnprintf()
agora são exigidas para compilar o Python. (Contribuição de Victor Stinner em bpo-36020.)sqlite3
requires SQLite 3.7.15 or higher. (Contributed by Sergey Fedoseev and Erlend E. Aasland in bpo-40744 and bpo-40810.)O módulo
atexit
deve agora sempre ser construído como um módulo embutido. (Contribuição de Victor Stinner em bpo-42639.)Adiciona a opção
--disable-test-modules
ao scriptconfigure
: não constrói nem instala módulos de teste. (Contribuição de Xavier de Gaye, Thomas Petazzoni e Peixing Xin em bpo-27640.)Adiciona a
option --with-wheel-pkg-dir=CAMINHO
ao script./configure
. Se especificado, o móduloensurepip
procura por pacotes wheel desetuptools
epip
neste diretório: se ambos estiverem presentes, esses pacotes wheel são usados em vez de pacotes wheel empacotados por ensurepip.Algumas distribuições Linux possuem políticas de empacotamento recomendando evitar o empacotamento de dependências. Por exemplo, Fedora instala pacotes wheel no diretório
/usr/share/python-wheels/
e não instala o pacoteensurepip._bundled
.(Contribuição de Victor Stinner em bpo-42856.)
Adiciona uma nova
opção --without-static-libpython de configure
para não construir biblioteca estáticalibpythonMAJOR.MINOR.a
e não instala o arquivo objetopython.o
.(Contribuição de Victor Stinner em bpo-43103.)
O script
configure
agora usa o utilitáriopkg-config
, se disponível, para detectar a localização dos cabeçalhos Tcl/Tk e bibliotecas. Como antes, esses locais podem ser explicitamente especificados com as opções de configuração--with-tcltk-includes
e--with-tcltk-libs
. (Contribuição de Manolis Stamatogiannakis em bpo-42603.)Adiciona a opção
--with-openssl-rpath
ao scriptconfigure
. A opção simplifica a construção do Python com uma instalação OpenSSL personalizada, por exemplo,./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto
. (Contribuição de Christian Heimes em bpo-43466.)
Alterações na API C¶
PEP 652: Mantendo a ABI estável¶
A ABI (interface binária de aplicação) Estável para módulos de extensão ou Python embutido agora está explicitamente definido. C API Stability descreve as garantias de estabilidade da API C e ABI junto com as melhores práticas para usar a ABI estável.
Novas funcionalidades¶
O resultado de
PyNumber_Index()
agora sempre tem o tipo exatoint
. Anteriormente, o resultado poderia ser uma instância de uma subclasse deint
. (Contribuição de Serhiy Storchaka em bpo-40792.)Adiciona um novo membro
orig_argv
à estruturaPyConfig
: a lista dos argumentos originais da linha de comando passados para o executável Python. (Contribuição de Victor Stinner em bpo-23427.)The
PyDateTime_DATE_GET_TZINFO()
andPyDateTime_TIME_GET_TZINFO()
macros have been added for accessing thetzinfo
attributes ofdatetime.datetime
anddatetime.time
objects. (Contributed by Zackery Spytz in bpo-30155.)Add a
PyCodec_Unregister()
function to unregister a codec search function. (Contributed by Hai Shi in bpo-41842.)The
PyIter_Send()
function was added to allow sending value into iterator without raisingStopIteration
exception. (Contributed by Vladimir Matveev in bpo-41756.)Add
PyUnicode_AsUTF8AndSize()
to the limited C API. (Contributed by Alex Gaynor in bpo-41784.)Add
PyModule_AddObjectRef()
function: similar toPyModule_AddObject()
but don’t steal a reference to the value on success. (Contributed by Victor Stinner in bpo-1635741.)Add
Py_NewRef()
andPy_XNewRef()
functions to increment the reference count of an object and return the object. (Contributed by Victor Stinner in bpo-42262.)The
PyType_FromSpecWithBases()
andPyType_FromModuleAndSpec()
functions now accept a single class as the bases argument. (Contributed by Serhiy Storchaka in bpo-42423.)The
PyType_FromModuleAndSpec()
function now accepts NULLtp_doc
slot. (Contributed by Hai Shi in bpo-41832.)The
PyType_GetSlot()
function can accept static types. (Contributed by Hai Shi and Petr Viktorin in bpo-41073.)Add a new
PySet_CheckExact()
function to the C-API to check if an object is an instance ofset
but not an instance of a subtype. (Contributed by Pablo Galindo in bpo-43277.)Add
PyErr_SetInterruptEx()
which allows passing a signal number to simulate. (Contributed by Antoine Pitrou in bpo-43356.)The limited C API is now supported if Python is built in debug mode (if the
Py_DEBUG
macro is defined). In the limited C API, thePy_INCREF()
andPy_DECREF()
functions are now implemented as opaque function calls, rather than accessing directly thePyObject.ob_refcnt
member, if Python is built in debug mode and thePy_LIMITED_API
macro targets Python 3.10 or newer. It became possible to support the limited C API in debug mode because thePyObject
structure is the same in release and debug mode since Python 3.8 (see bpo-36465).The limited C API is still not supported in the
--with-trace-refs
special build (Py_TRACE_REFS
macro). (Contributed by Victor Stinner in bpo-43688.)Add the
Py_Is(x, y)
function to test if the x object is the y object, the same asx is y
in Python. Add also thePy_IsNone()
,Py_IsTrue()
,Py_IsFalse()
functions to test if an object is, respectively, theNone
singleton, theTrue
singleton or theFalse
singleton. (Contributed by Victor Stinner in bpo-43753.)Add new functions to control the garbage collector from C code:
PyGC_Enable()
,PyGC_Disable()
,PyGC_IsEnabled()
. These functions allow to activate, deactivate and query the state of the garbage collector from C code without having to import thegc
module.Add a new
Py_TPFLAGS_DISALLOW_INSTANTIATION
type flag to disallow creating type instances. (Contributed by Victor Stinner in bpo-43916.)Add a new
Py_TPFLAGS_IMMUTABLETYPE
type flag for creating immutable type objects: type attributes cannot be set nor deleted. (Contributed by Victor Stinner and Erlend E. Aasland in bpo-43908.)
Portando para Python 3.10¶
The
PY_SSIZE_T_CLEAN
macro must now be defined to usePyArg_ParseTuple()
andPy_BuildValue()
formats which use#
:es#
,et#
,s#
,u#
,y#
,z#
,U#
andZ#
. See Parsing arguments and building values and the PEP 353. (Contributed by Victor Stinner in bpo-40943.)Since
Py_REFCNT()
is changed to the inline static function,Py_REFCNT(obj) = new_refcnt
must be replaced withPy_SET_REFCNT(obj, new_refcnt)
: seePy_SET_REFCNT()
(available since Python 3.9). For backward compatibility, this macro can be used:#if PY_VERSION_HEX < 0x030900A4 # define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0) #endif
(Contributed by Victor Stinner in bpo-39573.)
Calling
PyDict_GetItem()
without GIL held had been allowed for historical reason. It is no longer allowed. (Contributed by Victor Stinner in bpo-40839.)PyUnicode_FromUnicode(NULL, size)
andPyUnicode_FromStringAndSize(NULL, size)
raiseDeprecationWarning
now. UsePyUnicode_New()
to allocate Unicode object without initial data. (Contributed by Inada Naoki in bpo-36346.)The private
_PyUnicode_Name_CAPI
structure of the PyCapsule APIunicodedata.ucnhash_CAPI
has been moved to the internal C API. (Contributed by Victor Stinner in bpo-42157.)Py_GetPath()
,Py_GetPrefix()
,Py_GetExecPrefix()
,Py_GetProgramFullPath()
,Py_GetPythonHome()
andPy_GetProgramName()
functions now returnNULL
if called beforePy_Initialize()
(before Python is initialized). Use the new Python Initialization Configuration API to get the Python Path Configuration.. (Contributed by Victor Stinner in bpo-42260.)PyList_SET_ITEM()
,PyTuple_SET_ITEM()
andPyCell_SET()
macros can no longer be used as l-value or r-value. For example,x = PyList_SET_ITEM(a, b, c)
andPyList_SET_ITEM(a, b, c) = x
now fail with a compiler error. It prevents bugs likeif (PyList_SET_ITEM (a, b, c) < 0) ...
test. (Contributed by Zackery Spytz and Victor Stinner in bpo-30459.)The non-limited API files
odictobject.h
,parser_interface.h
,picklebufobject.h
,pyarena.h
,pyctype.h
,pydebug.h
,pyfpe.h
, andpytime.h
have been moved to theInclude/cpython
directory. These files must not be included directly, as they are already included inPython.h
: Include Files. If they have been included directly, consider includingPython.h
instead. (Contributed by Nicholas Sim in bpo-35134)Use the
Py_TPFLAGS_IMMUTABLETYPE
type flag to create immutable type objects. Do not rely onPy_TPFLAGS_HEAPTYPE
to decide if a type object is mutable or not; check ifPy_TPFLAGS_IMMUTABLETYPE
is set instead. (Contributed by Victor Stinner and Erlend E. Aasland in bpo-43908.)The undocumented function
Py_FrozenMain
has been removed from the limited API. The function is mainly useful for custom builds of Python. (Contributed by Petr Viktorin in bpo-26241)
Descontinuados¶
The
PyUnicode_InternImmortal()
function is now deprecated and will be removed in Python 3.12: usePyUnicode_InternInPlace()
instead. (Contributed by Victor Stinner in bpo-41692.)
Removidos¶
Removed
Py_UNICODE_str*
functions manipulatingPy_UNICODE*
strings. (Contributed by Inada Naoki in bpo-41123.)Py_UNICODE_strlen
: usePyUnicode_GetLength()
orPyUnicode_GET_LENGTH
Py_UNICODE_strcat
: usePyUnicode_CopyCharacters()
orPyUnicode_FromFormat()
Py_UNICODE_strcpy
,Py_UNICODE_strncpy
: usePyUnicode_CopyCharacters()
orPyUnicode_Substring()
Py_UNICODE_strcmp
: usePyUnicode_Compare()
Py_UNICODE_strncmp
: usePyUnicode_Tailmatch()
Py_UNICODE_strchr
,Py_UNICODE_strrchr
: usePyUnicode_FindChar()
Removed
PyUnicode_GetMax()
. Please migrate to new (PEP 393) APIs. (Contributed by Inada Naoki in bpo-41103.)Removed
PyLong_FromUnicode()
. Please migrate toPyLong_FromUnicodeObject()
. (Contributed by Inada Naoki in bpo-41103.)Removed
PyUnicode_AsUnicodeCopy()
. Please usePyUnicode_AsUCS4Copy()
orPyUnicode_AsWideCharString()
(Contributed by Inada Naoki in bpo-41103.)Removed
_Py_CheckRecursionLimit
variable: it has been replaced byceval.recursion_limit
of thePyInterpreterState
structure. (Contributed by Victor Stinner in bpo-41834.)Removed undocumented macros
Py_ALLOW_RECURSION
andPy_END_ALLOW_RECURSION
and therecursion_critical
field of thePyInterpreterState
structure. (Contributed by Serhiy Storchaka in bpo-41936.)Removed the undocumented
PyOS_InitInterrupts()
function. Initializing Python already implicitly installs signal handlers: seePyConfig.install_signal_handlers
. (Contributed by Victor Stinner in bpo-41713.)Remove the
PyAST_Validate()
function. It is no longer possible to build a AST object (mod_ty
type) with the public C API. The function was already excluded from the limited C API (PEP 384). (Contributed by Victor Stinner in bpo-43244.)Remove the
symtable.h
header file and the undocumented functions:PyST_GetScope()
PySymtable_Build()
PySymtable_BuildObject()
PySymtable_Free()
Py_SymtableString()
Py_SymtableStringObject()
The
Py_SymtableString()
function was part the stable ABI by mistake but it could not be used, because thesymtable.h
header file was excluded from the limited C API.Use Python
symtable
module instead. (Contributed by Victor Stinner in bpo-43244.)Remove
PyOS_ReadlineFunctionPointer()
from the limited C API headers and frompython3.dll
, the library that provides the stable ABI on Windows. Since the function takes aFILE*
argument, its ABI stability cannot be guaranteed. (Contributed by Petr Viktorin in bpo-43868.)Remove
ast.h
,asdl.h
, andPython-ast.h
header files. These functions were undocumented and excluded from the limited C API. Most names defined by these header files were not prefixed byPy
and so could create names conflicts. For example,Python-ast.h
defined aYield
macro which was conflict with theYield
name used by the Windows<winbase.h>
header. Use the Pythonast
module instead. (Contributed by Victor Stinner in bpo-43244.)Remove the compiler and parser functions using
struct _mod
type, because the public AST C API was removed:PyAST_Compile()
PyAST_CompileEx()
PyAST_CompileObject()
PyFuture_FromAST()
PyFuture_FromASTObject()
PyParser_ASTFromFile()
PyParser_ASTFromFileObject()
PyParser_ASTFromFilename()
PyParser_ASTFromString()
PyParser_ASTFromStringObject()
These functions were undocumented and excluded from the limited C API. (Contributed by Victor Stinner in bpo-43244.)
Remove the
pyarena.h
header file with functions:PyArena_New()
PyArena_Free()
PyArena_Malloc()
PyArena_AddPyObject()
These functions were undocumented, excluded from the limited C API, and were only used internally by the compiler. (Contributed by Victor Stinner in bpo-43244.)
The
PyThreadState.use_tracing
member has been removed to optimize Python. (Contributed by Mark Shannon in bpo-43760.)