Manual de Referência Python
Manual de Referência Python
Release 2.4.2
23 de novembro de 2005
Python é uma linguagem de alto nı́vel, orientada a objetos, de programação de alto nı́vel e de semântica dinâmica.
Sua construção baseada em estruturas de dados de alto nı́vel, combinada com sua “tipagem” e ligações dinâmicas
tornam-a muito atraente tanto para o desenvolvimento rápido de aplicações quanto para criação de scripts ou
como linguagem para interligar componentes já existentes. Python é simples, possui uma sintaxe fácil de aprender
que dá enfase à legibilidade, reduzindo o custo de manutenção do código. Python suporta módulos e pacotes, os
quais encorajam a modularização e o reaproveitamento de código. O interpretador Python e a extensa biblioteca
padrão estão disponı́veis na forma de código fonte, e binários para as principais plataformas, e pode ser distribuı́do
livremente.
Este manual de referência descreve a sintaxe e a “semântica principal” da linguagem. É um resumo, mas tenta
ser exato e completo. A semântica de objetos de tipo interno (built-in) e das funções e módulos são descritas na
Referência da Biblioteca Python. Para uma introdução informal à linguagem, veja o Tutorial Python. Para pro-
gramadores C ou C++ existem outros dois manuais adicionais: Extendendo e Embutindo o Interpretador Python
fornece um retrato de alto nı́vel sobre como escrever módulos de extensão para Python, e o Manual de Referência
da API Python/C que descreve em detalhes as interfaces disponı́veis para programadores C/C++.
SUMÁRIO
1 Introdução 1
1.1 Alternate Implementations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Notação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Análise léxica 3
2.1 Estrutura das linhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Outros sı́mbolos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Identificadores e keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Literais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.5 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.6 Delimitadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3 Modelo de Dados 13
3.1 Objetos, valores e tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 A hierarquia padrão de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3 Nomes de métodos especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4 Modelo de execução 33
4.1 Nomeando e ligando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2 Exceções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5 Expressões 37
5.1 Conversões Aritméticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2 Átomos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.3 Primárias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.4 O operador de potência . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.5 Unary arithmetic operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.6 Operações aritméticas binárias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.7 Operações de deslocamento (shifting) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.8 Operações bit-a-bit binárias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.9 Binary bit-wise operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.10 Comparações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.11 Operações Booleanas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.12 Lambdas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.13 Listas de expressões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.14 Ordem de interpretação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.15 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6 Instruções simples 49
6.1 Expressões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.2 Assertivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.3 Atribuições . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.4 O comando pass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.5 O comando del . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
i
6.6 O comando print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.7 O comando return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.8 O comando yield . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.9 O comando raise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.10 O comando break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.11 O comando continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.12 O comando import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.13 O comando global . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.14 O comando exec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
7 Instruções compostas 59
7.1 O comando if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.2 O comando while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.3 O comando for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.4 O comando try . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7.5 Definição de funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
7.6 Definição de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
8 Componentes de alto-nı́vel 65
8.1 Programas Python completos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
8.2 Arquivo como entrada de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
8.3 Entrada de dados interativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
8.4 Expressões como entrada de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
A Histórico e Licenças 67
A.1 History of the software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
A.2 Terms and conditions for accessing or otherwise using Python . . . . . . . . . . . . . . . . . . . 68
A.3 Licenses and Acknowledgements for Incorporated Software . . . . . . . . . . . . . . . . . . . . 70
Índice Remissivo 79
ii
CAPÍTULO
ONE
Introdução
Este manual de referência descreve a linguagem de programação Python. Ele não tem a intenção de servir como
um tutorial.
Tentarei ser o mais preciso possı́vel, no entanto escolhi o uso do Português no lugar de uma especificação formal
para tudo, exceto para sintaxe e analise léxica. Isso deixará o documento mais compreensı́vel para a maioria dos
leitores, mas deixará brechas para ambigüidades. Consequentemente, se você veio de Marte e tentar reimplemen-
tar a linguagem apenas com esse documento, provavelmente implementará uma linguagem um pouco diferente.
Por outro lado, se você está usando Python e quer saber com precisão as regras sobre uma área da linguagem
em particular, provavelmente você conseguirá encontrá-las aqui. Se deseja ver uma definição mais formal da
linguagem, talvez você possa se voluntariar para a tarefa — ou inventar uma máquina de clonagem :-).
É perigoso colocar muitos detalhes de implementação num documento de referência de uma linguagem — a
implementação pode mudar, e outras implementações da mesma linguagem podem funcionar de maneira diferente.
Por outro lado, como existe apenas uma implementação de Python usada em grande escala (apesar de já existirem
implementações alternativas), é importante mencionar suas peculiaridades, especialmente onde a implementação
impõe limitações adicionais. Portanto, você encontrará algumas pequenas “notas de implementação” espalhadas
pelo texto.
Todas as implementações de Python vem com um certo número de módulos internos (built-in) e módulos padrão.
Esses módulos não serão documentados aqui, mas sim no documento Referência da Biblioteca Python. Alguns
poucos módulos serão mencionados quando eles interagirem com a definição da linguagem de modo significativo.
CPython This is the original and most-maintained implementation of Python, written in C. New language features
generally appear here first.
Jython Python implemented in Java. This implementation can be used as a scripting language for Java applications,
or can be used to create applications using the Java class libraries. It is also often used to create tests for
Java libraries. More information can be found at the Jython website.
Python for .NET This implementation actually uses the CPython implementation, but is a managed .NET application and
makes .NET libraries available. This was created by Brian Lloyd. For more information, see the Python for
.NET home page.
IronPython An alternate Python for .NET. Unlike Python.NET, this is a complete Python implementation that generates
IL, and compiles Python code directly to .NET assemblies. It was created by Jim Hugunin, the original
creator of Jython. For more information, see the IronPython website.
PyPy An implementation of Python written in Python; even the bytecode interpreter is written in Python. This
is executed using CPython as the underlying interpreter. One of the goals of the project is to encourage
1
experimentation with the language itself by making it easier to modify the interpreter (since it is written in
Python). Additional information is available on the PyPy project’s home page.
Each of these implementations varies in some way from the language as documented in this manual, or intro-
duces specific information beyond what’s covered in the standard Python documentation. Please refer to the
implementation-specific documentation to determine what else you need to know about the specific implementa-
tion you’re using.
1.2 Notação
As descrições do analisador léxico e de sintaxe usam uma notação gramatical BNF modificada. Elas usam o
seguinte estilo de definição:
A primeira linha diz que um nome é um lc_letra seguido de uma sequencia com zero ou mais lc_letra
e sublinhados. Um lc_letra por sua vez é qualquer caracter entre ‘a’ e ‘z’. (Esta regra é na verdade seguida
para nomes definidos nas definições léxicas e gramaticais neste documento.)
Cada regra começa com um nome (o qual é o nome definido pela regra) e um sinal ::=. Uma barra vertical (|) é
usada para separar alternativas; este é o menor operador de conexão nesta notação. Um asterisco (*) significa zero
ou mais repetições do item precedente; assim como, um sinal de adição (+) representa uma ou mais repetições, e
um elemento dentro de colchetes ([ ]) significa zero ou uma ocorrência (em outras palavras, o elemento interno
é opcional). Os operadores * e + conectam da forma mais forte possı́vel; parenteses são usados para agrupamento.
Strings literais são definidas entre aspas-duplas. Espaços em branco são usados com a intenção de separar tokens
(elemento léxico). Regras são geralmente definidas em apenas uma linha; regras com muitas alternativas podem
ser formatadas com cada linha iniciando com uma barra vertical.
Nas definições léxicas (como no exemplo acima), duas outras convenções são usadas: dois caracteres literais
separados por três pontos significam a escolha de qualquer caracter na faixa especificada (inclusive) dos caracteres
ASCII . Um elemento entre os sinais de menor e maior (<...>) fornece uma descrição informal do sı́mbolo
definido; ex., pode ser usado para descrever o conceito de ‘caracter de controle’ se necessário.
Mesmo a notação utilizada sendo quase sempre a mesma, existe uma grande diferença entre o significado das
definições léxica e sintática: uma definição léxica opera em caracteres individuais de uma fonte de entrada,
enquanto a definição da sintaxe opera sobre um fluxo de tokens gerados por um analisador léxico. Todos os
usos de BNF no próximo capı́tulo (“Análise Léxica”) são definições léxicas; usos nos capı́tulos subseqüentes são
definições sintáticas.
2 Capı́tulo 1. Introdução
CAPÍTULO
TWO
Análise léxica
Um programa em Python é lido por um parser. A entrada de dados do parser é uma sequência de tokens, gerados
pelo analisador léxico. Este capı́tulo descreve como essa análise divide o conteúdo de um arquivo em tokens.
Python usa o conjunto de caracteres de 7 bits ASCII para o texto de um programa. New in version 2.3: Uma
declaração de página de código pode ser usada para indicar que as strings literais e os comentários usam um
código diferente de ASCII.. Por questões de compatibilidade com versões anteriores, o interpretador Python vai
avisar apenas se encontrar caracteres de 8 bits; pode-se corrigir o problema declarando explicitamente a página de
código usada ou usando sequências de escape, se aqueles bytes forem dados binários ao invés de caracteres.
O conjunto de caracteres usado durante a execução depende dos dispositivos de entrada e saı́da conectados ao
programa, mas geralmente é um subgrupo de ASCII.
Nota de compatibilidade futura: Pode ser tentador assumir que o conjunto de caracteres usado para caracteres
de 8 bits é o ISO Latin-1 (um subgrupo do ASCIIque cobre a maioria dos idiomas ocidentais que utilizam o
alfabeto latino), mas é possı́vel que no futuro os editores de texto que usem Unicode se tornem mais populares.
Normalmente, esses editores utilizam o UTF-8, que é também um subgrupo de ASCII, mas que usa de forma
diferente os caracteres com código de 128 a 255. Apesar de ainda não haver nenhum consenso nesse assunto, não
é recomendável assumir que qualquer um dos dois será o dominante, ainda que a implementação atual favoreça o
Latin-1. Isto se aplica tanto aos caracteres usados no código-fonte quanto aos utilizados durante a execução.
O fim de uma linha lógica é representado pelo sı́mbolo (token) NEWLINE. Comandos (statements) não podem
ultrapassar os limites da linha lógica exceto quando uma nova linha é permitida pela sintaxe (por exemplo, entre
comandos em um comando composto). Uma linha lógica é construı́da de uma ou mais linhas fı́sicas, seguindo as
regras implı́citas ou explı́citas de união de linhas.
A physical line is a sequence of characters terminated by an end-of-line sequence. In source files, any of the
standard platform line termination sequences can be used - the U NIXform using ASCII LF (linefeed), the Windows
form using the ASCII sequence CR LF (return followed by linefeed), or the Macintosh form using the ASCII CR
(return) character. All of these forms can be used equally, regardless of platform.
When embedding Python, source code strings should be passed to Python APIs using the standard C conventions
for newline characters (the \n character, representing ASCII LF, is the line terminator).
3
2.1.3 Comentários
Comentários iniciam com uma tralha (#) que não seja parte de uma string literal e terminam no fim da linha fı́sica.
Um comentário significa o fim da linha lógica a menos que as regras implı́citas de união de linhas sejam usadas.
Comentários são ignorados pela sintaxe; eles não são tokens.
Se um comentário na primeira ou segunda linha de um arquivo de código Python coincidir com a expressão regular
definida por dcoding[=:]\s*([-\w.]+)c, este comentário é processado como uma declaração de código de
caracteres: o primeiro grupo da expressão é o nome da página de código. As formas recomendadas são
# vim:fileencoding=<nome-do-código>
Que é reconhecido pelo VIM. Além disso, se os primeiros bytes do arquivo são (’\xef\xbb\xbf’), o código
usado é UTF-8 (isso é reconhecido pelo bloco de notas, do Microsoft Windows, entre outros editores)
Se uma página de código for declarada, o nome tem de ser reconhecido pelo interpretador. A página de código
é usada para toda e qualquer análise léxica, em especial para encontrar o fim de uma string, e para interpretar o
conteúdo de strings literais. Strings literais são convertidas para Unicode antes de serem analisadas, e são então
convertidas de volta para o código original antes do interpretador começar a execução. A declaração de página de
código tem de aparecer sozinha na linha.
Duas ou mais linhas fı́sicas podem ser unidas em linhas lógicas usando barras invertidas (\) da seguinte forma:
quando uma linha fı́sica termina em uma barra invertida que não é parte de uma string literal ou um comentário,
ela é unida com a linha seguinte, formando uma única linha lógica, sem a barra e o caracter de nova linha a seguir.
Por exemplo:
Uma linha terminando em barra invertida não pode conter comentários. Barras invertidas não continuam co-
mentários. Eles não continuam quaisquer elementos, exceto strings literais (ou seja, elementos outros que strings
não podem ser divididos em várias linhas usando barras invertidas). Uma barra invertida é ilegal em qualquer
outro lugar que não seja uma string literal.
Expressões em parênteses, colchetes ou chaves, podem ser divididas em mais de uma linha, sem usar a barra
invertida. Exemplo:
Linhas continuadas explicitamente podem conter comentários. A indentação da linha de continuação não é im-
portante. Linhas em branco são permitidas. Não há qualquer caracter de NEWLINE entre linhas continuadas
implicitamente. Elas também podem ocorrer em strings com três aspas (abaixo); neste caso, não podem conter
comentários.
Uma linha lógica que contenha apenas espaços, tabulações, parágrafos e possivelmente um comentário, é ignorada
(ou seja, não é gerado uma NEWLINE). Durante o uso do interpretador interativo, o manuseio de linhas em
branco pode diferir dependendo da implementação do interpretador. Na implementação padrão, uma linha lógica
completamente em branco (isto é, que não tenha nem mesmo espaços ou comentários) finalizam um comando
multi-linhas.
2.1.8 Indentação
Espaços em branco (ou tabulações) no inı́cio de uma linha lógica é usado para computar o nı́vel de indentação da
linha, que por sua vez é usado para determinar o agrupamento de comandos.
Primeiro, tabulações são substituı́das (da esquerda pra direita) por um número de espaços que pode variar de um
a oito, de forma que o total de caracteres seja sempre um múltiplo de oito (a mesma regra usada por sistemas
U NIX). O número total de espaços precedendo o primeiro caracter válido determina o nı́vel de indentação da
linha. A indentação não pode ser dividida em várias linhas fı́sicas usando barras invertidas; os espaços em branco
até a primeira barra invertida determinam o nı́vel de indentação.
nota: não é muito aconselhável misturar espaços e tabulações usados como indentação em um único arquivo de
código fonte. Também deve-se notar que diferentes plataformas podem limitar explicitamente o nı́vel máximo de
indentação.
Um caracter formfeed pode estar presente no começo da linha; ele será ignorado para o cálculo de indentação
descrito acima. Quando ocorrem em qualquer outro ponto dos espaços precedendo a linha, têm efeito indefinido
(por exemplo, podem zerar a contagem de espaços).
O nı́vel de indentação de linhas consecutivas é usado para gerar tokens INDENT e DEDENT, usando uma pilha,
da seguinte forma:
Antes de ler a primeira linha do arquivo, um zero é inserido na pilha; ele jamais sairá dela. Os números inseridos
sempre aumentarão, progressivamente, da base para o topo. No inı́cio de cada linha lógica, o nı́vel de indentação
da linha é comparado com o do topo da pilha. Se for igual, nada acontece; se for maior, é inserido na pilha, e
um token INDENT é gerado. Se for menor, ele obrigatoriamente tem de ser um dos números da pilha; todos os
números que são maiores que ele são removidos e para cada um deles, um token DEDENT é gerado. No final do
arquivo, um token DEDENT é gerado para cada número maior que zero restante na pilha.
Segue um trecho de código que apesar de confuso, está indentado corretamente:
(Na verdade, os três primeiros erros são detectados pelo parser; apenas o último erro é encontrado durante a análise
léxica — a indentação de return r não coincide com o nı́vel que foi removido da pilha.)
Os caracteres espaço, tabulação e formfeed podem ser usados para separar sı́mbolos, exceto quando no começo de
uma linha lógica ou em strings literais. Espaços são necessários entre dois sı́mbolos somente se a sua concatenação
levar a interpretá-los como um sı́mbolo diferente (por exemplo, ab é um sı́mbolo, mas a b são dois).
Os seguintes identificadores são palavras reservadas, ou keywords da linguagem, e não podem ser usadas como
identificadores comuns. Eles devem ser escritos exatamente como estão aqui:
Note que apesar do identificador as poder ser usado como parte da sintaxe da instrução import, no momento
ele não é um keyword.
Em uma futura versão da linguagem, é possı́vel que os identificadores as e None tornar-se-ão keywords.
Algumas classes de identificadores (exceto keywords), têm significados especiais. Estas classes são identificadas
pelo padrão da disposição do caracter underscore antes e depois do identificador:
_* Não é importado por ‘from module import *’. O identificador especial ‘_’ é usado no interpretador
interativo para armazenar o resultado da última expressão resolvida: ele é armazenado no módulo __-
builtin__. Quando não o interpretador não estiver em modo interativo, ‘_’ não tem qualquer significado
especial e não é definido. Veja section 6.12, “O comando import.”
Note: O nome ‘_’ é às vezes usado para internacionalização; procure a documentação para o módulo
gettext module para mais informação sobre esta convenção.
__*__ Nomes definidos pelo sistema. Estes nomes são definidos pelo interpretador e sua implementação (in-
cluindo a biblioteca padrão); Assume-se que as aplicações não definam nomes adicionais usando esta
convenção. O conjunto de nomes desta classe definidos pela linguagem pode ser estendido em versões
futuras. Veja section 3.3, “Nomes de métodos especiais.”
__* Nomes privados da classe. Nomes nesta categoria, quando usados dentro do contexto de uma definição de
classe, são re-escritos para usar uma versão modificada, para evitar conflitos entre atributos “privados” entre
a classe base e suas classes derivadas. Veja section 5.2.1, “Identificadores (Nomes).”
2.4 Literais
Literais são notações para valores constantes de alguns tipos built-in.
2.4. Literais 7
Uma restrição sintática não indicada por essas definições é que espaços não são permitidos entre o
stringprefix e o resto da string literal.
Strings literais podem ser inseridas entre aspas simples (’) ou aspas duplas ("). Elas podem também ser inseridas
em groupos de três aspas duplas ou simples. Uma barra-invertida (\) pode ser usada para escapar caracteres que de
outra forma teriam algum significado especial, como newline, a própria barra-invertida ou aspas. Strings literais
podem opcionalmente ter como prefixo a letra ‘r’ ou ‘R’; tais strings são chamadas raw strings e usam regras
diferentes para a interpretação de sequências de escape. Uma string prefixada pelo character ‘u’ or ‘U’ torna-
se uma string Unicod, que utiliza o conjunto de caracteres Unicode, definido pela norma ISO 10646. Algumas
sequências adicionais, descritas adiante, estão disponı́veis em strings Unicode. Estes dois caracteres prefixando
strings podem ser utilizados simultaneamente; neste caso, ‘u’ deve vir antes de ‘r’.
Em strings com três aspas, newlines ou aspas são permitidas (e mantidas), exceto por três aspas seguidas, que
terminam a string.
A menos que a string tenha o prefixo ‘r’ ou ‘R’, sequências de escape são interpretadas segundo regras semelhantes
aquelas usadas em C. As sequências reconhecidas são:
Notas:
(1) Individual code units which form parts of a surrogate pair can be encoded using this escape sequence.
(2) Any Unicode character can be encoded this way, but characters outside the Basic Multilingual Plane (BMP)
will be encoded using a surrogate pair if Python is compiled to use 16-bit code units (the default). Individual
code units which form parts of a surrogate pair can be encoded using this escape sequence.
(3) As in Standard C, up to three octal digits are accepted.
(4) Unlike in Standard C, at most two hex digits are accepted.
(5) In a string literal, hexadecimal and octal escapes denote the byte with the given value; it is not necessary
that the byte encodes a character in the source character set. In a Unicode literal, these escapes denote a
Unicode character with the given value.
Ao contrário de C , todas as sequências de escape não reconhecidas são deixadas na string inalteradas, ou seja,
a barra invertida é deixada na string. (Este comportamente é útil na depuração do código: se uma sequência de
escape foi digitada errada, a saı́da resultante é facilmente reconhecida.) Também é importante notar que sequências
marcadas como “(Apenas Unicode)” na tabela acima, caem na categora de sequências não reconhecidas para
strings que não sejam Unicode.
Quando o prefixo ‘r’ ou ‘R’ está presente, o caracter seguinte à barra invertida é incluı́do na string sem alterações,
e todas as barras são deixadas na string. Por exemplo, r"\n" c é uma string literal válida que consiste de dois
caracteres: uma barra invertida e um ‘n’ minúsculo. Aspas simples podem ser escapadas com a barra invertida,
Múltiplas strings literais adjacentes (delimitadas por espaços, possivelmente usando convenções diferentes para as
aspas) são permitidas, e seu significado é o mesmo da sua concatenação. Desta forma, "hello"’world’
é equivalente a "helloworld". Esse recurso pode ser usado para reduzir o número de barras-invertidas
necessárias, para repartir strings longas através de várias linhas, ou mesmo para adicionar comentários a partes de
uma string, por exemplo:
re.compile("[A-Za-z_]" # letra ou underscore
"[A-Za-z0-9_]*" # letra, dı́gito ou underscore
)
Note que este recurso é definido no nı́vel sintático, mas implementado no momento da compilação. O operador
’+’ deve ser usado para concatenar strings em tempo de execução. Note ainda que concatenação literal pode usar
diferentes tipos de aspas para cada componente (até misturar strings cruas e strings com três aspas).
Há quatro tipos de literais numéricos: inteiros, longos, números de ponto flutuante e números imaginários. Não
há literais complexos (eles podem ser formados adicionando um número real e um número imaginário).
Note que literais numéricos não incluem um sinal; um trecho como -1 é na verdade uma expressão composta do
operador ‘-’ e do número 1.
the largest unsigned 32-bit number (on a machine using 32-bit arithmetic), 4294967296, were taken as the negative plain integer obtained by
subtracting 4294967296 from their unsigned value.
2.4. Literais 9
Octais e hexadecimais se comportam de maneira semelhante, mas quando ultrapassam a maior representação
possı́vel, mas estão abaixo do maior número de 32-bits possı́vel, 4294967296, eles aparecem como o inteiro
negativo obtido da subtração de 4294967296 do seu valor original. Não há limite para longos, exceto, é claro, o
quanto pode ser armazenado na memória.
Alguns exemplos de inteiros (primeira linha) e longos (segunda e terceira linhas):
7 2147483647 0177
3L 79228162514264337593543950336L 0377L 0x100000000L
79228162514264337593543950336 0xdeadbeef
Note que literais numéricos não incluem um sinal; um trecho como -1 é na verdade uma expressão composta do
operador ‘-’ e do número 1.
2.5 Operadores
Os seguintes sı́mbolos são operadores:
+ - * ** / // %
<< >> & | ˆ ˜
< > <= >= == != <>
Os operadores de comparação <> e != são formas alternativas do mesmo operador. != é a forma preferida; <>
está obsoleto.
( ) [ ] { } @
, : . ‘ = ;
+= -= *= /= //= %=
&= |= ˆ= >>= <<= **=
O ponto pode ocorrer ainda em números de ponto-flutuante e literais imaginários. Uma sequência de três pontos
tem o significado especial de uma elipse no fatiamento de sequências. Os operadores da segunda metada da lista,
servem como delimitadores, mas também executam uma operação.
Os seguintes caracteresASCII têm significado especial quando partes de outros sı́mbolos ou são de alguma forma
significantes para a análise léxica:
’ " # \
Os seguintes caracteres ASCII não são usados em Python. Sua ocorrência fora de strings ou comentários é um erro
incondicional:
$ ?
2.6. Delimitadores 11
12
CAPÍTULO
THREE
Modelo de Dados
estar 100% precisa e completa: por exemplo, agora é possı́vel em alguns casos mudar o tipo de um objeto, sob certas condições controladas.
Até que este manual passe por uma revisão extensiva ele não deve ser considerado como autoridade definitiva com exceção das considerações
acerca das “classes tradicionais”, que ainda são o padrão, por motivos de compatibilidade, em Python 2.2 e 2.3
13
contidos; entretanto, quando nós falamos sobre a mutabilidade de um contêiner, estamos tratando apenas das
identidades dos objetos imediatamente contidos. Então, se um contêiner imutável (como uma tupla) contêm uma
referência para um objeto mutável, seu valor muda se o objeto mutável for alterado.
Os tipos afetam quase todos os aspectos do comportamento de um objeto. A importância da identidade é afetada
do mesmo jeito: para tipos imutáveis, operações que calculam novos valores podem retornar uma referência para
um objeto existente com o mesmo tipo e valor, enquanto para objetos mutáveis isto não é permitido. Ex., depois
de ‘a = 1; b = 1’, a e b podem ou não se referirem ao mesmo objeto com o valor um, dependendo da
implementação, mas ‘c = []; d = []’, c e d tem que garantir que se referem a duas listas diferentes, unicas,
recém-criadas e vazias. (Note que ‘c = d = []’ atribuem o mesmo objeto tanto para c quanto para d.)
None Este tipo tem um valor único. Existe um único objeto com este valor. Este objeto é acessado através do
nome interno None. Ele é usado com o significado de ausência de valor em várias situações, ex., ele é
retornado por funções que não retornam nada explicitamente. Seu valor lógico é falso.
NotImplemented Este tipo tem um valor único. Existe um único objeto com este valor. Este objeto é acessado
através do nome interno NotImplemented. Métodos numéricos e métodos completos de comparação
podem retornar este valor se eles não implementam a operação para os operandos fornecidos. (O interpre-
tador tentará então uma operação refletida, ou alguma chamada alternativa, dependendo do operador.) Seu
valor lógico é verdadeiro.
Ellipsis Este tipo tem um valor único. Existe um único objeto com este valor. Este objeto é acessado através do
nome interno Ellipsis. Ele é usado para indicar a presença da sintaxe ‘...’ em uma fatia. Seu valor
lógico é verdadeiro.
Números São criados por números literais e retornados como resultado por operadores aritméticos e funções
aritméticas internas. Objetos numéricos são imutáveis; uma vez criados seus valores nunca mudam.
Números em Python são fortemente relacionados com números matemáticos, mas sujeitos às limitações
da representação numérica em computadores.
Python faz distinção entre inteiros, números de ponto flutuante, e números complexos:
Inteiros Representam elementos do conjunto matemático dos números inteiros (positivos e negativos).
Existem três tipos de inteiros:
Inteiros Planos Representam números na faixa de -2147483648 até 2147483647. (A faixa pode ser
maior em máquinas com um tamanho de palavra maior, mas não menor.) Quando o resultado
de uma operação fica fora dessa faixa, o resultado é retornado normalmente como um inteiro
longo (em alguns casos, a exceção OverflowError é levantada no lugar). Para propósito de
deslocamento (binário) e operações com máscaras, assume-se que eles usem notação binária de 32
bits ou mais e números negativos são representados usando complemento de dois, e não escondem
nenhum bit do usuário (ex., todos os 4294967296 padrões de bits diferentes correspondem a um
valor diferente).
Inteiros Longos Representam números numa faixa ilimitada, sujeita apenas à memória (virtual). Para
propósito de deslocamento (binário) e operações com máscaras, assume-se que usem notação
binária e números negativos são representados com uma variação do complemento de dois que dá
a ilusão de uma string infinita com o bit de sinal extendendo para a esquerda.
Booleanos Representam os valores lógicos False (Falso) e True (Verdadeiro). Os dois objetos que
representam os valores False e True são os únicos objetos Booleanos. O tipo Booleano é um
subtipo dos inteiros planos, e valores Booleanos se parecem com os valores 0 e 1, respectivamente,
Seqüências Representam conjuntos finitos ordenados indexados por um número não-negativo. A função interna
len() retorna o número de ı́tens da seqüência. Quando o tamanho de uma seqüência é n, o conjunto de
ı́ndices contém os números 0, 1, . . . , n-1. O ı́tem i de uma seqüência a é retornado por a[i].
Seqüências também suportam fatiamento (slicing): a[i:j] retorna todos os ı́tens com ı́ndice k onde i <=k
< j. Quando usado como uma expressão, uma fatia é uma seqüência do mesmo tipo. Isto implica que o
conjunto de ı́ndices é renumerado para que comece em 0.
Algumas seqüências também suportam “fatiamento estendido” com um terceiro parâmetro de “passo”:
a[i:j:k] retorna todos os ı́tens de a com ı́ndice x onde x = i + n*k, n >= 0 e i <= x < j.
Seqüências são divididas de acordo com sua “mutabilidade”:
Seqüências imutáveis Um objeto do tipo seqüência imutável não pode ser alterado após sua criação. (Se o
objeto contém referências para outros objetos, estes objetos podem ser mutáveis e podem ser alterados;
todavia, a coleção de objetos diretamente referenciadas por um objeto imutável não pode alterar.)
Os seguintes tipos são seqüências imutáveis:
Strings Os items de uma string são caracteres. Não há um tipo à parte para caracteres; eles são
representados por uma string de um único item. Caracteres representam (pelo menos) um byte.
As funções internas chr() e ord() convertem entre caracteres e números inteiros positivos
representando os valores. Bytes com os valores de 0 a 127 geralmente representam o valor ASCII
correspondente, mas a sua interpretação correta depende do programa. O tipo string é ainda usado
para representar matrizes de dados, por exemplo, para guardar dados lidos de um arquivo.
(Em sistemas cujo conjunto de caracteres nativo não é ASCII, strings podem usar EBCDIC em sua
representação interna, contanto que as funcões chr() e ord() implementem um mapeamento
entre EBCDIC, e comparações de strings preservem a ordem ASCII. Ou será que talvez alguém
pode propôr uma regra melhor?)
Unicode Os items de um objeto Unicode são unidades de código Unicode. São representadas por
um objeto Unicode de um item e podem conter valores de 16 ou 32 bits, representando um car-
acter ordinal Unicode (o valor máximo é dado por sys.maxunicode e depende de como o
interpretador Python foi configurado no momento da compilação). Pares surrogate podem estar
presentes no objeto Unicode, e serão reportados como dois items separados. As funções internas
unichr() e ord() convertem entre unidades de código e inteiros positivos, representando os
ordinais Unicode, como definidos no Unicode Standard 3.0. Conversão de e para outros códigos
são possı́veis através do método Unicode encode e a função interna unicode().
Tuples Os items de uma tupla são quaisquer objetos Python. Tuplas de dois ou mais items são
formadas por uma lista de expressões, separadas por vı́rgula. Uma tupla de um item (’single-
ton’) pode ser formada adicionando uma vı́rgula a uma expressão (uma expressão sozinha en-
tre parênteses não cria uma tupla, já que parênteses podem ser usados para criar grupos de ex-
pressões). Uma tupla vazia pode ser criada por um par de parênteses.
Mapeamentos Mapeamentos representam conjuntos finitos de objetos, indexados por ı́ndices arbitrários. A
notação a[k] seleciona o item indexado por [k] do mapeamento a; isto pode ser usado em expressões
e como o alvo de atribuições ou do comando del. A função interna len() retorna o número de items num
mapeamento.
Atualmente há apenas um único mapeamento intrı́nseco à linguagem:
Dicionários Dicionários () representam conjuntos finitos de objetos, indexados por ı́ndices praticamente
arbitrários. O único tipo de objeto inaceitável como chave são listas ou dicionários ou outros ob-
jetos mutáveis que são comparados pelo valor e não pela identidade. A razão para isso é que uma
implementação eficiente de dicionários requer que o valor do hash da chave permaneça constante.
Tipos numéricos usados para chaves obedecem as regras normais de comparação: se na comparação
dois números são considerados iguais (por exemplo, 1 e 1.0) então qualquer um deles pode ser usado
para indexar o mesmo valor em um dicionário.
Dicionários são mutáveis; eles podem ser criados pela notação {...} (veja a seção 5.2.6,
“Visualização de dicionários”).
Os módulos dbm,gdbm, bsddb fornecem exemplos adicionais de mapeamentos.
Tipos executáveis Estes são os tipos aos quais a operação de chamada de função (veja section ??, “Chamadas”)
pode ser aplicada:
Funções Um objeto função é criado por uma definição de função (veja a section 7.5, “Definições de
função”). Ele deve ser chamado com uma lista de argumentos contendo o mesmo número que itens
que na definição formal da lista de parâmetros do objeto.
Special attributes:
Attribute Meaning
func_doc The function’s documentation string, or None if unavailable
__doc__ Another way of spelling func_doc
func_name The function’s name
__name__ Another way of spelling func_name
__module__ The name of the module the function was defined in, or None if unavailable.
func_defaults A tuple containing default argument values for those arguments that have defaults, or None if n
func_code The code object representing the compiled function body.
func_globals A reference to the dictionary that holds the function’s global variables — the global namespace
func_dict The namespace supporting arbitrary function attributes.
func_closure None or a tuple of cells that contain bindings for the function’s free variables.
Most of the attributes labelled “Writable” check the type of the assigned value.
Changed in version 2.4: func_name is now writable.
Function objects also support getting and setting arbitrary attributes, which can be used, for example, to
attach metadata to functions. Regular attribute dot-notation is used to get and set such attributes. Note
that the current implementation only supports function attributes on user-defined functions. Function
attributes on built-in functions may be supported in the future.
Additional information about a function’s definition can be retrieved from its code object; see the
description of internal types below.
Métodos Um objeto método combina uma classe, uma instância dessa classe (ou None) e qualquer objeto
executável (normalmente uma função definida pelo usuário).
Módulos Módulos são importados através do comando import (veja section 6.12, “O comando import”).
Um objeto módulo tem um namespace implementado através de um dicionário (é esse o dicionário refer-
enciado pelo atributo func globals de funções definidas no módulo). Referências a atributos são traduzidas
em procuras a esse dicionário, por exemplo: m.x equivale à m.__dict__["x"]. Um objeto módulo não
contem o objeto código usado para sua inicialização (já que não é mais necessário depois dela).
Atribuições atualizam o dicionário do namespace do módulo, por exemplo., ‘m.x = 1’ equivale a ‘m._-
_dict__["x"] = 1’.
Atributos especiais somente para leitura: __dict__ é o namespace do módulo, representado por um
dicionário.
Atributos pré-definidos: __name__ é o nome do módulo; __doc__ é a string de documentação do
módulo, ou None se indisponı́vel; __file__ é o caminho do arquivo do qual o módulo foi carregado,
se ele foi carregado de um arquivo. O atributo __file__ não está presente para módulos em C que
são ligados estaticamente ao interpretador; para módulos de extensões carregados dinamicamente de uma
biblioteca compartilhada, é o caminho do arquivo da biblioteca.
Classes Classes são objetos criados por definições de classe (veja section7.6, “Definições de classe”). Uma classe
tem um namespace implementado através de um objeto dicionário. Referências a atributos da classe são
traduzidas em procuras a este dicionário, por exemplo: ‘C.x’ é equivalente à ‘C.__dict__["x"]’.
Quando o nome do atributo não é encontrado, a busca continua nas classes base. A busca é realizada da
esquerda para a direita, na ordem de ocorrência na lista de classes base.
Quando uma referência de um atributo da classe (digamos, uma classe C) irá retornar uma função ou um
método desligado cuja classe associada é C ou uma de suas classes base, ele é transformado em um método
desligado cujo atributo im_class é C. Quando ele for retornar um método estático, ele é transformado em
um objeto “embrulhado” pelo objeto original. Veja section 3.3.2 para outros exemplos de como atributos
recuperados de uma classe podem diferir daqueles contidos em seu __dict__.
Atribuições aos atributos de uma classe alteram sempre o seu próprio dicionário, nunca o de uma classe
base.
Um objeto classe pode ser executado (veja acima) para criar e retornar uma instância da classe (veja logo
abaixo).
Atributos especiais: __name__ é o nome da classe; __module__ é o nome do módulo no qual a classe
foi definida; __dict__ é o dicionário contendo o namespace da classe; __bases__ é uma tupla (talvez
vazia, ou contendo um único elemento) contendo as classes base, na ordem de sua ocorrência na definição
da classe; __doc__ é a string de documentação da classe ou None quando indefinida;
Instâncias de classes Uma instância é criada executando um objeto classe (veja acima). Elas têm um namespace
implementado como um dicionário que é o primeiro lugar em que são procuradas referências a atributos.
Quando um atributo não é encontrado lá, e a classe da instância tem um atributo com aquele nome, a busca
continua entre os atributos da classe. Se for encontrado um atributo na classe que seja um objeto função
ou um método cuja classe associada seja a seja a classe da instância que iniciou a busca ouuma de suas
classes base, este método ou função é então transformado em um objeto método ligado, cujos atributos
im_class e im_self são respectivamente C e a própria instância. Métodos estáticos e métodos de
classe são também tranformados, como se tivessem sido recuperados da mesma classe C; veja logo acima
em “Classes”. Consulte section ?? para uma outra forma na qual atributos de uma classe recuperados através
Arquivos Um objeto file representa um arquivo aberto. Estes objetos são criados pela função interna open() e
também por os.popen(), os.fdopen(), e os métodos makefile() de objetos socket. Os objetos
sys.stdin, sys.stdout e sys.stderr são inicializados para arquivos, correspondendo à entrada
e saı́da de dados padrão do interpretador, e da saı́da de erros. Veja em Python Library Reference para a
documentação completa desses objetos.
Tipos internos Alguns tipos usados internamente pelo interpretador são acessı́veis ao usuário. Suas definições
podem mudar em futuras versões, mas são mencionadas aqui para manter um registro mais completo.
Código Objeto Códigos objetos [code objects] contêm os bytes compilados do código executável de
Python, ou bytecodes. A diferença entre um código objeto para uma função objeto é que a função
objeto contém uma referência explı́cita para o seu contexto global (o módulo em que ela foi definida),
enquanto que um código objeto não contém qualquer contexto; além disso, os valores padrão dos
argumentos são armazenados no objeto função, não no objeto código (porque estes representam val-
ores calculados durante a execução). Ao contrário de objetos função, código é imutável e não contém
quaisquer referências (diretas ou indiretas) para objetos mutáveis.
Atributos especiais somente para leitura: co_name contém o nome da função; co_argcount é o
número de argumentos posicionais (incluindo argumentos com valores padrão); co nlocals é o número
de variáveis locais usadas pela função (incluindo argumentos); co_varnames é uma tupla contendo
os nomes das variáveis locais (começando pelos nomes dos argumentos); co_cellvars é uma tupla
contendo os nomes de variáveis locais que são referenciadas por funções aninhadas; co_freevars
é uma tupla contendo os nomes de variáveis livres; co_code é uma string representando a sequência
de instruções em bytecode; co_consts é uma tupla contendo os literais usados pelo bytecode; co_-
names é uma tupla contendo os nomes usados pelo bytecode; co_filename é o nome do arquivo
de onde o bytecode foi compilado; co_firstlineno é o número da primeira linha da função;
co_lnotab é uma string contendo o mapeamento dos deslocamentos dos bytecodes para números
de linhas (para maiores detalhes procurar o código fonte do interpratador); co_stacksize é o
tamanho exigido da pilha (incluindo as variáveis locais); co_flags é uma codificação inteira de
flags para o interpretador.
Os seguintes bits de flag são definidos como co_flags: o bit 0x04 é definido se a função usa a
sintaxe ‘*arguments’ para aceitar um número arbitrário de posiçõesç o bit 0x08 é definido se a
função usa a sintaxe ‘**keywords’ para aceitar argumentos chaves-valores; o bit 0x20 é definido
se a função é um gerador.
Futuras declarações de caracterı́sticas (‘from __future__ import division’) também
usam bits nas co_flags para indicar se um código-objeto foi compilado com uma caracterı́stica
particular habilitada: o bit 0x2000 é definido se a função foi compilada com divisões futuras habili-
tadas; os bits 0x10 e 0x1000 foram utilizados em versões anteriores de Python.
Outros bits em co_flags são reservados para uso interno.
Se um código-objeto representa uma função, o primeiro item em co_consts é a string de
documentação da função, ou None se não estiver definida.
Objetos quadro [frame ] Objetos quadro representam execução de quadros. Eles podem ocorrer em obje-
tos [traceback] (veja abaixo).
Atributos especiais somente de leitura: f_back é anterior ao [stack frame] (próximo ao chamador),
ou None se estiver abaixo na [stack frame]; f_code é o código objeto que está sendo executado
neste quadro; f_locals é o diretório utilizado para pesquisa de variáveis locais; f_globals é
utilizado para variáveis globais; f_builtins é uma flag indicando se a função está executando em
__new__(cls[, ... ])
Called to create a new instance of class cls. __new__() is a static method (special-cased so you need
not declare it as such) that takes the class of which an instance was requested as its first argument. The
remaining arguments are those passed to the object constructor expression (the call to the class). The return
value of __new__() should be the new object instance (usually an instance of cls).
Typical implementations create a new instance of the class by invoking the superclass’s __new__()
method using ‘super(currentclass, cls).__new__(cls[, ...])’ with appropriate arguments and
then modifying the newly-created instance as necessary before returning it.
If __new__() returns an instance of cls, then the new instance’s __init__() method will be invoked
like ‘__init__(self [, ...])’, where self is the new instance and the remaining arguments are the
same as were passed to __new__().
If __new__() does not return an instance of cls, then the new instance’s __init__() method will not
be invoked.
__new__() is intended mainly to allow subclasses of immutable types (like int, str, or tuple) to customize
instance creation.
__init__(self [, ... ])
Chamado quando a instância é criada. Os argumentos são aqueles passados para a expressão que chama o
construtor da classe. Se uma classe base possui um método __init__(), o método __init__() da
classe derivada, se existir, deve explicitamente chamá-lo para garantir uma correta inicialização da parte da
instância que está na classe base; por exemplo: ‘BaseClass.__init__(self , [args...])’. Como
uma caracterı́stica especial dos construtores, estes não devem retornar nenhum valor; isto irá fazer com que
uma TypeError seja lançada em tempo de execução.
__del__(self )
Chamado quando uma instância está para ser destruı́da. Também conhecido como destrutor. Se uma classe
base possui um método __del__(), o método __del__() da classe derivada, se existir, deve explici-
tamente chamá-lo para garantir uma correta deleção da parte da instância que está na classe base. Note
que é possı́vel (mas não recomendado!) que o método __del__() adie a destruição da instância criando
uma nova referência para ela. O método pode ser chamado em outro momento quando esta nova referência
é deletada. Não é garantido que métodos __del__() sejam chamados para objetos que ainda existam
quando o interpretador finaliza.
Note: ‘del x’ não chama diretamente x.__del__() — a expressão decrementa a contagem de re-
ferências para x em um, e __del__() somente será chamado quando o contador de referências de x’s
chegar a zero. Algumas situações comuns para evitar que o contador de referências de um objeto chegue
a zero incluem: referências circulares entre objetos (ex., uma lista duplamente encadeada ou uma estru-
tura de dados em árvore com ponteiros pai e filho); uma referência para o objeto na pilha de uma função
que captura uma excessão (o traceback armazenado em sys.exc_traceback mantém a pilha viva);
ou uma referência para o objeto em uma pilha que lançou uma excessão não capturada no modo interativo
(o traceback armazenado em mantém a pilha viva). A primeira situação só pode ser remediada através da
Os métodos seguintes podem ser definidos para customizar o modo de acesso a atributos (uso de, atribuição para,
ou deleção de x.name) em instâncias de classes.
__getattr__(self, name)
Chamado quando a busca por um atributo não o encontra nos lugares usuais (i.e., não é um atributo da
instância nem foi encontrado na árvore da classe em self). name é o nome do atributo. Este método deve
retornar o valor do atributo (computado) ou lançar uma excessão AttributeError.
Note que se o atributo é encontrado através do mecanismo normal, __getattr__() não é chamado.
(Essa é uma intencional assimetria entre __getattr__() e __setattr__().) Isso é feito em am-
bos por questões de eficiência e porque de outro modo __setattr__() não teria como acessar outros
atributos da instância. Note que pelo menos para variáveis de instância, você pode “falsificar” totalmente o
controle não inserindo quaisquer valores no dicionário de atributos da instância (mas ao invés inserı́-los em
outro objeto). Veja o método __getattribute__() abaixo para um modo de atualmente obter controle
total em classes new-style.
__setattr__(self, name, value)
Chamado quando ocorre uma atribuição a algum atributo. Este método é chamado ao invés do mecanismo
normal (i.e. armazenar o valor no dicionário da instância). name é o nome do atributo, value é o valor a ser
atribuı́do a ele.
Se __setattr__() pretende atribuir um valor a um atributo de uma instância, ele não deve simplesmente
executar ‘self.name = value’ — isso causaria uma chamada recursiva a si mesmo. Ao invés, deve
inserir o valor no dicionário de atributos da instância, ex., ‘self.__dict__[name] = value’. Para
classes new-style, ao invés de acessar o dicionário da instância, deve chamar o método da classe base com
o mesmo nome, por exemplo, ‘object.__setattr__(self, name, value)’.
__delattr__(self, name)
Similar a __setattr__(), mas para a deleção de um atributo ao invés de atribuição. Este só deve ser
Implementando Descritores
Os métodos seguintes apenas se aplicam quando a instância da classe contendo o método (a chamada classe
descriptor (descritora)) aparece no dicionário de outra classe new-style, conhecida como classe proprietária. Nos
exemplos abaixo, “o atributo” refere-se ao atributo cujo nome é a chave da propriedade na classe proprietária’
__dict__. Descritores só podem ser implementados ocmo classes new-style.
__get__(self, instance, owner)
Chamado para ler o atributo da classe proprietária (acesso ao atributo da classe) ou de uma instância dessa
classe (acesso ao atributo da instância). owner é sempre a classe proprietária, enquanto instance é a instância
através da qual o atributo está sendo acessado, ou None quando o atributo é acessado através de owner. Este
método deve retornar o valor (computado) do atributo ou lançar uma excessão AttributeError.
__set__(self, instance, value)
Chamado para atribuir um novo valor value ao atributo em uma instância instance da classe proprietária.
__delete__(self, instance)
Chamado para deletar o atributo em uma instância instance da classe proprietária.
Invocando Descritores
Em geral, um descritor é um atributo de um objeto com “comportamento de ligação”, no qual o acesso a atributos
foi sobrescrito por métodos no protocolo de descritor: __get__(), __set__(), e __delete__(). Se
qualquer destes métodos estão definidos para um objeto, ele é chamado de descritor.
O comportamento padrão para acessar atributos é ler, atribuir, ou deletar o atributo do dicionário de um ob-
jeto. Para uma instância, a.x possui uma corrente de localização começando com a.__dict__[’x’], de-
pois type(a).__dict__[’x’], e continuando através das classes base de type(a), excluindo-se as meta-
classes.
Entretanto, se o valor procurado é um objeto que define um dos métodos descritores, então Python pode sobrescr-
ever o comportamento padrão e invocar ao invés o método descritor. Onde isto irá ocorrer na corrente de preced-
ncia depende de onde os métodos descritores estão definidos e como eles são chamados. Note que descritores são
apenas invocados para objetos ou classes new-style (aquelas que extendem object() ou type()).
O ponto de partida da invocação de um descritor é uma ligação, a.x. Como os argumentos são montados depende
de a:
Chamada Direta A maneira mais simples e menos comum de chamada é quando o código do usuário diretamente invoca um
método descritor: x.__get__(a).
Ligação de Instância Se ligada a uma instância de um objeto new-style, a.x é transformado na chamada: type(a).__dict_-
_[’x’].__get__(a, type(a)).
Ligação de Classe Se ligada a uma classe new-style, A.x é transformada na chamada: A.__dict__[’x’].__get__-
(None, A).
Para ligações de instãncia, a precedência de invocação de descritor depende de quais métodos descritores estão
definidos. Descritores de dados definem tanto __get__() quanto __set__(). Descritores que não repre-
sentam dados (non-data) possuem apenas o método __get__(). Descritores de dados sempre sobrescrevem
uma redefinição em um dicionário de instância. Em constraste, descritores que não representam dados podem ser
sobrescritos pelas instâncias.
Métodos Python (incluindo staticmethod() e classmethod()) são implementados como descritores non-
data. Deste modo, instâncias podem redefinir e sobrescrever métodos. Isto permite a instâncias individuais
adiquirirem comportamentos que as diferem de outras instâncias da mesma classe.
A função property() é implementadas como um descritor de dados. Deste modo, instãncias não podem
sobrescrever o comportamento de uma propriedade.
slots
Por padrão, instãncias de ambas as classes antigas e new-style possuem um dicionário para armazenamento de
atributos. Isto disperdiça espaço para objetos contendo muito poucas variáveis de instância. O consumo de espaço
pode se tornar prejudicial ao se criar um grande número de instâncias.
O padrão pode ser sobrescrito pela definição de slots em classes new-style. A declaração de slots toma uma
sequência de variáveis de instância e reserva apenas espaço suficiente em cada instância para guardar um valor
para cada variável. Espaço é economizado porque dict não é criado para cada instância.
__slots__
A esta variável de classe pode ser atribuı́da uma string, um interável, ou uma sequência de strings com
nomes variáveis usados pelas instâncias. Se definido em uma classe new-style, slots reserva espaço para
as variáveis declaradas e previne a automática criação de dict e weakref para cada instância. New in
version 2.2.
Notas ao usar slots
• Se uma variável dict , instâncias não podem atribuir novas variáveis não listadas na definição de slots .
Tentativas de atribuir à uma variável cujo nome não tenha sido listado lançam AttributeError. Se a
atribuição dinâmica de novas variáveis é desejada, então adicione ’__dict__’ para a sequência de string
na declaração de slots . Changed in version 2.3: Antigamente, adicionando ’__dict__’ à declaração
de slots não habilitaria a atribuição de novos atributos não especificamente listados na sequência de
nomes de variáveis de instância.
• Sem uma variável weakref para cada instância, classes que definem slots não suportam referências
fracas para suas instãncias. Se o suporte a referência fraca é necessário, então adicione ’__weakref__’
à sequência de string na declaração de slots . Changed in version 2.3: Antigamentem, adicionando
’__weakref__’ à declaração de slots não habilitaria o suporte para referências fracas.
• slots é implementado em nı́vel de classe pela criação de descritores (3.3.2) para cada nome de variável.
Como resultado, atributos de classe não podem ser usados para atribuir valores padrão para variáveis de
instância definidos por slots ; de outro modo, o atributo da classe sobrescreveria a atribuição do descritor.
• Se uma classe define um slot também definido na classe base, a variável de instância definida pelo slot
da classe base é inacessı́vel (exceto retornando seu descritor diretamente da classe base). Isto rende um
comportamento indefinido do programa. No futuro, uma verificação deve ser adicionada para prevenir isso.
• A ação da declaração de slots é limitada à classe onde ele está definido. Como resultado, subclasses
terão um dict a menos que elas também definam slots .
• slots não funcionam para classes derivadas de tipos internos de “tamanho variável” como long, str
and tuple.
• Qualquer iterável não string pode ser atribuı́do à slots . Mapas também podem ser usados; entretando,
no futuro, comportamento especial pode ser adicionado aos valores correspondentes a cada chave.
Por padrão, classes new-style são construı́das usando type(). Uma definição de classe é lida dentro de um
namespace separado e o valor do nome da classe é anexado ao resultado de type(name, bases, dict).
Quando a definição de uma classe é lida, se metaclass está definida então a classe executável (callable)
atribuı́da a eke será chamada ao invés de type(). Isto permite que classes e funções sejam escritas para monitorar
ou alterar o processo de criação da classe:
__metaclass__
Esta variável pode ser qualquer classe executável (callable) que aceite os argumentos name, bases, e
dict. Na criação da classe, o executável é usado ao invés do interno type(). New in version 2.2.
A metaclasse apropriadas é determinada pelas seguintes regras de precedência:
O uso potencial de metaclasses não possui limites. Algumas idéias que tem sido exploradas incluem log-
ging, verificação de interface, delegação automática, criação de propriedades automática, proxies, frameworks,
e locking/sincronização de recursos automático.
Os métodos seguintes podem ser definidos para implementar objetos contêiner. Contêineres em geral são
sequências (como listas e tuplas) ou mapas (como dicionários), mas podem representar outros contêiners do
mesmo modo. O primeiro conjunto de métodos e usado tanto para emular uma sequência quando para emular um
mapa; a diferença é que para uma sequência, as chaves permitidas devem ser inteiros k, para 0 <= k < N onde
N é o tamanho da sequência, ou objetos fatia, que definem uma faixa de itens. (Para compatibilidade com versões
anteriores, o método __getslice__() (veja abaixo) também de ser definido para lidar com fatias simples, mas
não extendidas. Também é recomendado que mapas provenham os métodos keys(), values(), items(),
has_key(), get(), clear(), setdefault(), iterkeys(), itervalues(), iteritems(),
pop(), popitem(), copy(), e update() se comportando de modo similar aos dicionários padrão de
Python. O módulo UserDict provê uma classe DictMixin para ajudar na criação daqueles métodos de um
conjunto base de __getitem__(), __setitem__(), __delitem__(), e keys(). Sequências mutáveis
devem prover métodos append(), count(), index(), extend(), insert(), pop(), remove(),
reverse() e sort(), como os objetos lista padrões de Python. Finalmente, tipos sequência devem imple-
mentar adição (no sentido de concatenação) e multiplicação (no sentido de repetição) pela definição dos métodos
__add__(), __radd__(), __iadd__(), __mul__(), __rmul__() e __imul__() descritos abaixo;
eles não devem definir __coerce__() ou outros operadores numéricos. É recomendado que ambos os mapas e
sequências implementem o método __contains__() para permitir o uso eficiente do operador in; para ma-
pas, in deve ser equivalente a has_key(); para sequências, deve buscar através dos valores. Adicionalmente
Os seguintes métodos opcionais podem ser definidos para incrementar a emulação de objetos sequência. Métodos
de sequências imutáveis devem no máximo definir __getslice__(); sequências mutáveis podem definir todos
os três métodos.
__getslice__(self, i, j)
Deprecated since release 2.0. Suporte de objetos fatia como parâmetros para o método __getitem__().
Chamado para implemenyar a avaliação de self [i:j]. O objeto retornado deve ser do mesmo tipo de
self . Note que omitindo i ou j na expressão fatia os valores serão substituı́dos por zero ou sys.maxint,
respectivamente. Se ı́ndices negativos são usados na fatia, o tamanho da sequência é adicionado àquele
ı́ndice. Se a instância não implementa o método __len__(), AttributeError é lençada. Nenhuma
class MyClass:
...
def __getitem__(self, index):
...
def __setitem__(self, index, value):
...
def __delitem__(self, index):
...
Note as chamadas a max(); elas são necessárias para tratar ı́ndices negativos antes que os métodos __*slice_-
_() sejam chamados. Quando ı́ndices negativos são usados, os métodos __*item__() os recebem como são
fornecidos, mas os métodos __*slice__() recebem uma forma “preparada” dos valores dos ı́ndices. Para
cada valor de ı́ndice negativo, o tamanho da sequência é adicionado ao ı́ndice antes de chamar o método (o
que ainda pode resultar em um ı́ndice negativo); este é o tratamento habitual de ı́ndices negativos pelas tipos
sequência internos, e espera-se que os métodos __*item__() procedam deste modo. Entretanto, uma vez que
eles já devem ter feito isto, ı́ndices negativos não podem ser passados; eles devem ser forçados para os limites
da sequência antes de serem passados ao métodos __*item__(). Chamando max(0, i) covenientemente
retorna o valor apropriado.
Os métodos seguintes podem ser definidos para emular objetos numéricos. Métodos correspondentes a operações
que não são suportadas pelo tipo particular de número implementado (ex., operações bit a bit para números não
inteiros) devem ser deixadas indefinidas.
Esta seção costumava documentar as regras de coerção. À medida que a linguagem evoluiu, estas regras
se tornaram difı́ceis de documentar com precisão; descrever aquilo que uma determinada versão de uma
implementação em particular faz é indesejável. Ao invés disso, aqui segue um guia informal de algumas regras.
Em Python 3.0, coerção não será mais suportada.
• Se o operando esquerdo de um operador % é uma string ou um objeto Unicode, nenhuma coerção ocorre.
Ao invés disso, é executada a operação de formatação da string.
• Não é mais recomendável definir um operador de coerção. Operações em tipos que não definem coerção
passam os argumentos originais para a operação.
• Classes new-style (aquelas derivadas de object) nunca invocam o método __coerce__() em resposta
a um operador binário; o único momento em que __coerce__() é chamado é quando a função interna
coerce() é usada.
• Para a maioria das aplicações, um operador que retorna NotImplemented é tratado da mesma forma que
um que realmente não esteja implementado.
• Logo abaixo, os métodos __op__() e __rop__() são usados para simbolizar os nomes genéricos de
métodos correspondentes a um operador; o método __iop__() é usado para o operador correspondente
que realiza a operação no lugar (in-place), sem criar um novo objeto. Por exemplo, para o operador ‘+’,
__add__() e __radd__() são usados para as variáveis esquerda e direita do operador binário, e __-
iadd__() para a variante que realiza a operação no lugar (in-place).
• Para objetos x e y, primeiro tentamosx.__op__(y) . Se este não estiver implementado ou retornar
NotImplemented, tenta-se y.__rop__(x). Se este também não estiver implementado ou retornar
NotImplemented, uma exceção TypeError é levantada. Há uma exceção para isso no próximo item:
• Quando um operador in-place (como ‘+=’) é usado, se o operando da esquerda implementa __iop__(),
ele é invocado sem nenhuma coerção. Quando a operação cai em __op__() e/ou __rop__(), se aplicam
as regras normais de coerção.
• Em x+y, se x é uma sequência que implementa concatenação, x e y são então concatenadas.
• Em x*y, se um operador for uma sequência que implementa repetições, e a outra for um inteiro (int ou
long), é invocada a repetição da sequência.
• Comparações ricas (implementadas pelos métodos __eq__() dentre outros) nunca usam coerção.
Comparações de três vias (implementadas por __cmp__()) usam coerção sob as mesmas condições que
os outros operadores binários usam.
• Na implementação atual, os tipos numéricos internos int, long e float não usam coerção; o tipo
complex por outro lado usa. A diferença pode se tornar aparente quando extendemos estes tipos. Todo
o tempo, o tipo complex pode ser corrigido para evitar a coerção. Todos estes tipos implementam um
método __coerce__(), para uso da função interna coerce().
FOUR
Modelo de execução
33
Python não possui declarações de variáveis e permite que a ligação de um nome ocorra em qualquer lugar de
um bloco de código. As variáveis locais de um pedaço de código podem ser determinadas apenas olhando as
operações de ligação que ocorreram no bloco.
No caso do comando global, todos os usos do nome especificado no comando se referem à ligação feita para aquele
nome no namespace de mais alto nı́vel. Nomes são adicionados a esse namespace após a procura por nomes no
namespace global (namespace do modulo contendo o bloco de código) e o namespace builtin (namespace do
módulo __builtin__). O global é buscado primeiro e, se o nome não for encontrado nele, o namespace builtin
é buscado. O comando global deve preceder qualquer uso do nome desejado.
O namespace built-in (embutido) associado com a execução de um bloco de código pode ser visualizado usando
o nome __builtins__ em seu namespace global. Esse nome deve ser um dicionário ou um módulo (no caso
anterior o dicionário do módulo foi usado). Normalmente o namespace __builtins__ é um dicionário do
módulo embutido __builtin__ (nota: sem ‘s’). Se não for, o modo de execução restrita esta sendo usado.
O namespace de um módulo é criado automaticamente da primeira vez que um módulo é importado. O módulo
principal de um script é sempre chamado de __main__.
A definição de uma classe é um comando executável que usa e define nomes seguindo as regras usuais de formação
de um nome. O namespace da definição de uma classe torna-se o dicionário de atributo dessa. Nomes definidos
no escopo da classe não são visiveis para os métodos.
Existem vários casos em que comandos Python, quando usados em conjunto com escopos aninhados que possuem
variáveis livres são ilegais.
Se houver referências de uma variável em um escopo superior, é ilegal deletar o nome. Caso isso aconteça um
erro ocorrerá durante a compilação.
Se uma forma mais radical do import — ‘import *’ — é usada em uma função e caso ela contenha ou seja um
bloco aninhado com variáveis livres o compilador vai levantar uma exceção SyntaxError.
Se o comando exec for usado em uma função contendo variáveis livres ou um bloco aninhado com esse tipo de
variável, o compilador levantará uma exceção SyntaxError, a não ser que o namespace local seja explicita-
mente especificado no exec. (Em outras palavras, ‘exec obj’ seria ilegal, mas ‘exec obj in ns’ seria
legal.)
As funções eval(), execfile() e input() e o comando exec não tem acesso a todos nomes resolvidos
no ambiente. Os nomes podem ser resolvidos no namespace global e local do requisitor. As variáveis locais
não são resolvidas no namespace mais próximo, mas no namespace global. 1 O comando exec e as funções
eval() e execfile() possuem argumentos opcionais para substituir o namespace global e local. Se apenas
um namespace for especificado ele é usado como global e local.
4.2 Exceções
Exceções são meios de quebrar o fluxo normal de um código para lidar com erros ou outras condições excep-
cionais. Uma exceção é levantada assim que um erro é detectado, ela pode ser manipulada pelo código que a
cerca ou pelo código que invocou direta ou indiretamente o bloco onde o erro aconteceu.
O interpretador Python levanta uma exceção quando detecta um erro durante o tempo de execução (como uma
divisão por zero). Um programa Python pode levantar uma exceção explicitamente com o comando raise.
Manipuladores de exceção são especificados com o comando try ... except. O comando try ... finally
especifica um codigo de limpeza que não lida com a exceção, mas que é sempre executado, ocorrendo ou não uma
exceção.
Python usa o modelo de “finalização” na manipulação de erros: um manipulador de exceções pode descobrir o
que houve de errado e continuar a execução em um nı́vel mais externo, mas ele não pode consertar a causa do
erro ou tentar novamente a operação que causou erro (a não ser que o pedaço de código que causou o erro seja
re-executado desde o começo).
1 Essa limitação acontece porque o código que é executado por essas operações não esta disponı́vel no momento que o modulo é compilado.
4.2. Exceções 35
36
CAPÍTULO
FIVE
Expressões
Algumas regras adicionais se aplicam a certos operadores (por exemplo, um argumento do tipo string à esquerda
do operador ‘%’). Extensões podem definir suas próprias regras de conversão.
5.2 Átomos
Átomos (atoms) são os elementos mais básicos das expressões. Os átomos mais simples são identificadores
(identifiers) ou literais (literals). Expressões delimitadas por aspas invertidas, parênteses, colchetes ou chaves
(enclosures) também são categorizadas sintaticamente como átomos. A sintaxe dos átomos é:
atom ::= identifier | literal | enclosure
enclosure ::= parenth_form | list_display
| generator_expression | dict_display
| string_conversion
Um identificador na forma de um átomo é um nome. Veja section 4.1 para documentação sobre nomeação e
ligação.
37
Quando o nome é ligado a um objeto, a interpretação do átomo retorna este objeto. Quando um nome não é ligado,
a tentativa de avaliá-lo levanta uma exceção NameError.
Modificação de nomes privados Quando um identificador que ocorre textualmente na definição de uma classe
começa com dois ou mais caracteres sublinhados (underscore) e não termina com dois ou mais sublinhados, este é
considerado um nome privado desta classe. Nomes privados são transformados para uma forma mais longa antes
que seu código seja gerado. A transformação insere o nome da classe antes do nome, com os sublinhados iniciais
removidos, e um único sublinhado é inserido antes no nome da classe. Por exemplo, o identificador __spam,
ocorrendo em um classe chamada Ham, será transformado em _Ham__spam. Essa transformação é independente
do contexto sintático no qual o identificador é usado. Se o nome transformado é extremamente longo (maior do
que 255 caracteres), pode ocorrer o truncamento definido pela implementação. Se o nome da classe é composto
somente por sublinhados, não é feita nenhuma transformação.
5.2.2 Literais
Um estrutura entre parênteses (parenth form) é uma lista opcional de expressões contida entre parênteses:
parenth_form ::= "("[expression_list] ")"
Uma lista de expressões entre parênteses retorna o que quer que a lista de expressões retorne: se a lista contém
pelo menos uma vı́rgula, esta retorna uma tupla; caso contrário, retorna a única expressão que compõe a lista de
expressões.
Um par de parênteses vazio retorna uma tupla vazia. Uma vez que as tuplas são imutáveis, as regras para literais
se aplicam (isto é, duas ocorrências de uma tupla vazia podem ou não retornar o mesmo objeto).
Note que as tuplas não são formadas pelos parênteses, mas pelo uso do operador vı́rgula. A exceção é a tupla
vazia, para a qual os parênteses são obrigatórios – permitir a presença de um “nada” sem parênteses nas expressões
causaria ambigüidades e permitiria que erros comuns de digitação passassem despercebidos.
Uma representação de lista (list display) é uma série – possivelmente vazia – de expressões contidas entre
colchetes:
test ::= and_test ( "or"and_test )* | lambda_form
testlist ::= test ( ","test )* [ ","]
list_display ::= "["[listmaker] "]"
listmaker ::= expression ( list_for | ( ","expression )* [","] )
list_iter ::= list_for | list_if
list_for ::= "for"expression_list "in"testlist [list_iter]
list_if ::= "if"test [list_iter]
Uma representação de lista retorna um novo objeto lista. Seu conteúdo é especificado fornecendo ou uma lista de
expressões ou pela compreensão de uma lista. Quando uma lista separada por vı́rgulas é fornecida, seus elementos
38 Capı́tulo 5. Expressões
são interpretados da esquerda para a direita e colocados no objeto lista nessa ordem. Quando a compreensão de
uma lista é fornecida, esta consiste de uma expressão seguida por pelo menos uma cláusula for e zero ou mais
cláusulas for ou if. Nesse caso, os elementos da nova lista são aqueles que seriam produzidos considerando cada
uma das cláusulas for ou if como um bloco, aninhando da esquerda para a direita e interpretando a expressão
para produzir um elemento da lista a cada vez que o bloco mais interno é alcançado.
A generator expression yields a new generator object. It consists of a single expression followed by at least one
for clause and zero or more for or if clauses. The iterating values of the new generator are those that would
be produced by considering each of the for or if clauses a block, nesting from left to right, and evaluating the
expression to yield a value that is reached the innermost block for each iteration.
Variables used in the generator expression are evaluated lazily when the next() method is called for generator
object (in the same fashion as normal generators). However, the leftmost for clause is immediately evaluated
so that error produced by it can be seen before any other possible error in the code that handles the generator
expression. Subsequent for clauses cannot be evaluated immediately since they may depend on the previous
for loop. For example: ‘(x*y for x in range(10) for y in bar(x))’.
The parentheses can be omitted on calls with only one argument. See section ?? for the detail.
Uma representação de dicionário (dictionary display) é uma série – possivelmente vazia – de pares chave/valor
(key/datum) contidos entre chaves:
dict_display ::= "{"[key_datum_list] "}"
key_datum_list ::= key_datum (","key_datum)* [","]
key_datum ::= expression ":"expression
Uma representação de dicionário retorno um novo objeto dicionário.
Os pares chave/valor são interpretados da esquerda para a direita para definir as entradas do dicionário: cada
objeto chave é usado como uma chave dentro do dicionário para armazenar os valores correspondentes.
As restrições dos tipos de valores das chaves são listadas anteriormente nessa seção 3.2. (Resumindo, o tipo da
chave deve ser indexável, o que exclui todos os tipos de objetos mutáveis.) Conflitos entre chaves duplicadas não
são detectados; prevalecem os últimos valores (textualmente os mais à direita na representação) armazenados para
um dado valor de chave.
Uma conversão para string (string conversion) é uma lista de expressões contidas entre aspas reversas:
string_conversion ::= "‘"expression_list "‘"
Em uma conversão para string a lista de expressões contida é interpretada e o objeto resultante é convertido em
uma string de acordo com regras especı́ficas para cada tipo.
Se o objeto é uma string, um número, None, ou então uma tupla, lista ou dicionário contendo apenas objetos de
um desses tipos, a string resultante é uma expressão Python válida que pode ser passada para a função interna
eval() para gerar uma expressão com o mesmo valor (ou uma aproximação, caso estejam envolvidos números
de ponto flutuante).
5.2. Átomos 39
(Particularmente, a conversão de uma string adiciona aspas sobre ela e converte caracteres “estranhos” para
seqüencias de escape que podem ser impressas sem problemas.)
Objetos recursivos (por exemplo, listas ou dicionários que contêm uma referência a si próprios, direta ou indi-
retamente) usam ‘...’ para indicar uma referência recursiva, e o resultado não pode ser passado para a função
eval() para obter um valor igual (em vez disso, é levantada uma exceção SyntaxError).
A função interna repr() realiza exatamente a mesma conversão nos seus argumentos que a colocação entre
parênteses e entre aspas invertidas fazem. A função interna str() realiza uma conversão similar, mas mais
amigável.
5.3 Primárias
Primárias (primaries) representam as operações mais fortemente ligadas da linguagem. Sua sintaxe é:
primary ::= atom | attributeref | subscription | slicing | call
Uma referência a um atributo (attribute reference) é uma primária seguida por um ponto e um nome:
attributeref ::= primary "."identifier
A interpretação de uma primária deve retornar um objeto cujo tipo suporte referências a atributos, por exemplo,
um módulo, uma lista ou uma instância. É feita então uma requisição a este objeto para retornar o atributo cujo
nome é o identificador. Se este atributo não estiver disponı́vel, é levantada uma exceção AttributeError.
Caso contrário, o tipo e o valor do objeto retornado são determinados pelo objeto. Múltiplas chamadas a uma
mesma referência a um atributo podem retornar objetos diferentes.
5.3.2 Subscrições
Uma subscrição (subscription) seleciona um item de uma seqüência (string, tupla ou lista) ou de um mapeamento
(dicionário):
subscription ::= primary "["expression_list "]"
A interpretação da primária deve retornar um objeto do tipo seqüência ou mapeamento.
Se a primária for um mapeamento, a interpretação da lista de expressões deve retornar um objeto cujo valor é uma
das chaves do mapeamento, e a subscrição seleciona o valor do mapeamento que corresponde àquela chave. (A
lista de expressões é uma tupla, a não ser que contenha exatamente um item).
Se a primária for uma seqüência, a interpretação da expressão (ou lista de expressões) deve retornar um inteiro
simples. Se este valor for negativo, o tamanho da seqüência é adicionado ao mesmo (para que, por exemplo,
x[-1] selecione o último item de x). O valor resultante deve ser um inteiro não negativo menor do que o número
de itens da seqüência, e a subscrição seleciona o item cujo ı́ndice é esse valor (contando a partir do zero).
Os itens de uma string são caracteres. Um caractere não é um tipo de dado separado, mas uma string com
exatamente um caractere.
5.3.3 Fatiamentos
O fatiamento (slicing) seleciona uma faixa de itens de uma seqüência (como por exemplo uma string, uma tupla
ou uma lista). Fatiamentos podem ser usados como expressões ou como alvos em comandos de atribuição ou
deleção. A sintaxe do fatiamento é:
40 Capı́tulo 5. Expressões
slicing ::= simple_slicing | extended_slicing
simple_slicing ::= primary "["short_slice "]"
extended_slicing ::= primary "["slice_list "]"
slice_list ::= slice_item (","slice_item)* [","]
slice_item ::= expression | proper_slice | ellipsis
proper_slice ::= short_slice | long_slice
short_slice ::= [lower_bound] ":"[upper_bound]
long_slice ::= short_slice ":"[stride]
lower_bound ::= expression
upper_bound ::= expression
stride ::= expression
ellipsis ::= "..."
Há uma ambigüidade na sintaxe formal aqui: qualquer coisa que tem a forma de uma lista de expressões também
tem a forma de uma lista de fatias, então qualquer subscrição pode ser interpretada como um fatiamento. Em vez
de complicar mais a sintaxe, esta ambigüidade é removida através da definição de que, nesse caso, a interpretação
como subscrição tem prioridade sobre a interpretação como fatiamento (isso se aplica se a lista de fatias não
contém fatias válidas e nem elipses). Similarmente, quando a lista de fatias tem exatamente uma fatia curta (short
slice), sem vı́rgula no final, a interpretação como fatiamento simples tem prioridade sobre a interpretação como
fatiamento estendido.
A semântica do fatiamento simples é a seguinte: a interpretação da primária deve retornar uma seqüência. A
interpretação dos limites inferior (lower bound) e superior (upper bound), se estes estiverem presentes, deve
retornar inteiros simples; os valores padrão são zero e sys.maxint, respectivamente. Se qualquer um dos
limites for negativo, é adicionado a este o tamanho da seqüência. O fatiamento então seleciona todos os itens
com ı́ndice k tais que i <= k < j, onde i e j são os limites inferior e superior especificados. Essa seleção pode
retornar uma seqüência vazia. Se i e j estão fora da faixa de ı́ndices válidos, isso não causa um erro (tais itens não
existem, portanto não são selecionados).
A semântica do fatiamento estendido é a seguinte: a primária deve ser um mapeamento, o qual é indexado com
uma chave que é construı́da a partir da lista de fatias: se a lista de fatias contém pelo menos uma vı́rgula, a chave é
uma tupla contendo a conversão dos itens dessa lista; caso contrário, a chave é a conversão do único item da lista
de fatias. A conversão de um item da lista de fatias que é uma expressão é a própria expressão. A conversão de
uma elipse da lista de fatias é o objeto pré-definido Ellipsis. A conversão de uma fatia corretamente formulada
é um objeto do tipo fatia (ver section 3.2), cujos atributos start, stop e stride são os valores das expressões
dadas como limite inferior, limite superior e passo, respectivamente, substituindo None pelas expressões que
faltam.
5.3.4 Chamadas
Uma chamada (call) chama um objeto executável (por exemplo, uma função) com uma série – possivelmente
vazia – de argumentos:
call ::= primary "("[argument_list [","]] ")"
argument_list ::= positional_arguments [","keyword_arguments]
[",*"expression]
[",**"expression]
| keyword_arguments [",*"expression]
[",**"expression]
| "*"expression [",**"expression]
| "**"expression
positional_arguments ::= expression (","expression)*
keyword_arguments ::= keyword_item (","keyword_item)*
keyword_item ::= identifier "="expression
Pode haver uma vı́rgula depois dos argumentos e keywords, mas isso não afeta a semântica.
A interpretação da primária deve retornar um objeto executável (funções definidas pelo usuário, funções internas,
métodos de objetos internos, objetos do tipo classe, métodos de instâncias de classes e em alguns casos as próprias
instâncias de classes são executáveis; extensões podem definir tipos de objetos executáveis adicionais). Todas as
expressões do argumento são interpretadas antes que a chamada seja feita. Veja section 7.5 para saber sobre a
5.3. Primárias 41
sintaxe de listas de parâmetros formais.
Se há argumentos nomeados, estes primeiro são convertidos para argumentos posicionais, como segue. Primeiro,
é criada uma lista de posições em branco para os parâmetros formais. Se há N argumentos posicionais, estes
são colocados nas N primeiras posições. A seguir, para cada argumento nomeado, o identificador é usado para
determinar a posição correspondente (se o identificador é igual ao nome do primeiro parâmetro formal, é usada
a primeira posição, e assim por diante). Se a posição já está preenchida, é levantada uma exceção TypeError.
Caso contrário, o valor do argumento é colocado na posição, preenchendo-a (mesmo que a expressão seja None,
a posição é preenchida). Quando todos os argumentos tiverem sido processados, as posições que ainda estão
em branco são preenchidas com o valor padrão correspondente na definição da função. (Os valores padrão são
calculados, uma única vez, quando a função é definida; portanto, um objeto mutável, como uma lista ou um
dicionário, usado como valor padrão será compartilhado por todas as chamadas que não especificam um valor de
argumento para a posição correspondente; isso deveria geralmente ser evitado.) Se há posições em branco para as
quais não é especificado nenhum valor padrão, é levantada uma exceção TypeError. Caso contrário, a lista de
posições preenchidas é usada com argumento para a chamada.
Se há mais argumentos posicionais do que posições para os parâmetros formais, é levantada uma exceção
TypeError, a não ser que haja um parâmetro usando a sintaxe ‘*identificador’; nesse caso, o parâmetro
formal recebe uma tupla contendo os argumentos posicionais excedentes (uma uma tupla vazia se não houver
nenhum argumento posicional excedente).
Se algum argumento nomeado não corresponde a nenhum parâmetro formal, é levantada uma exceção
TypeError, a não ser que esteja presente um parâmetro formal com a sintaxe ‘**identificador’; nesse
caso, esse parâmetro formal recebe um dicionário contendo os argumentos nomeados excedentes (usando os
nomes como chaves e os valores do argumento como valores correspondentes a essas chaves), ou um (novo)
dicionário vazio, se não houverem argumentos nomeados excedentes.
Se a sintaxe ‘*express˜ao’ aparece na chamada da função, o resultado da interpretação de ‘express˜ao’
deve ser uma seqüência. Os elementos dessa seqüência são tratados com se fossem argumentos posicionais adi-
cionais; se há argumentos posicionais x,...,xN, e o resultado da interpretação de ‘express˜ao’ é uma seqüência
y1,...,yM, isso é equivalente a uma chamada com M+N argumentos posicionais x1,...,xN,y1,...,yM.
Uma conseqüência disso é que, embora a sintaxe ‘*express˜ao’ apareça depois de quaisquer argumentos
nomeados, esta é processada antes dos argumentos nomeados (e do argumento **expressão, se houver algum –
veja abaixo). Então:
É incomum o uso de argumentos nomeados e da sintaxe ‘*express˜ao’ na mesma chamada, então, na prática,
não acontece essa confusão.
Se a sintaxe ‘**express˜ao’ aparece na chamada à função, a interpretação de ‘express˜ao’ deve resultar
em (uma subclasse de) um dicionário, cujo conteúdo é tratado como argumentos nomeados adicionais. No caso
de um mesmo nome aparecer tanto na ‘express˜ao’ quanto como um argumento nomeado explicitamente, é
levantada uma exceção TypeError.
Os parâmetros formais que usam a sintaxe ‘*identificador’ ou ‘**identificador’ não podem ser usa-
dos como argumentos posicionais nem como nomes de argumentos nomeados. Os parâmetros formais que usam
a sintaxe ‘(sublista)’ não podem ser usados como nomes de argumentos nomeados; a lista mais externa cor-
responde a uma única posição não nomeada, e o valor do argumento é atribuı́do à sublista usando as regras usuais
de atribuição para tuplas, após o processamento de todos os outros parâmetros.
42 Capı́tulo 5. Expressões
Uma chamada sempre retorna algum valor, possivelmente None, a não ser que cause uma exceção. Como esse
valor é computado depende do tipo do objeto chamado.
Se este for—
uma função definida pelo usuário: O bloco de código da função é executado, sendo-lhe passada a lista de argu-
mentos. A primeira coisa que o bloco de código fará será ligar os parâmetros formais aos argumentos; isso
é descrito na seção 7.5. Quando o bloco de código executa um comando return, é especificado o valor de
retorno da chamada à função
uma função ou método interno: O resultado fica a cargo do interpretador; ver Python Library Reference para
descrições das funções e métodos internos.
um objeto do tipo classe: É retornada uma nova instância dessa classe.
um método de uma instância de classe: A função definida pelo usuário correspondente é chamada, com uma
lista de argumentos que é maior do que a lista de argumentos da chamada: a instância passa a ser o primeiro
argumento.
uma instância de classe: A classe deve definir um método __call__(); o efeito então é o mesmo que se esse
método fosse chamado.
O operador * (multiplicação) retorna o produto dos seus argumentos. Os argumentos devem ser ambos números,
ou um argumento deve ser um inteiro (simples ou longo) e o outro deve ser uma seqüência. No primeiro caso, os
números são convertidos para um mesmo tipo e então multiplicados. No segundo caso, é executada a repetição da
seqüência; um fator de repetição negativo retorna uma seqüência vazia.
Os operadores / (divisão) e // (divisão inteira) retornam o quociente dos seus argumentos. Os argumentos
numéricos são primeiro convertidos para um mesmo tipo. A divisão de inteiros simples ou longos retorna um
inteiro do mesmo tipo; o resultado é o resultado da divisão matemática com a função ‘floor’ aplicada ao resultado.
A divisão por zero levanta uma exceção ZeroDivisionError exception.
O operador % (modulo) retorna o resto da divisão do primeiro argumento pelo segundo. Os argumentos
numéricos são primeiro convertidos para um mesmo tipo. Um argumento direito igual a zero levanta a exceção
ZeroDivisionError. Os argumentos podem ser números de ponto flutuante, por exemplo, 3.14%0.7 é
igual a 0.34 (já que 0.34 é igual a 4*0.7 + 0.34.) O operador módulo sempre retorna um resultado com o
mesmo sinal do segundo operando (ou zero); o valor absoluto do resultado é estritamente menor do que o valor
absoluto do segundo operando1 .
Os operadores divisão inteira e módulo são conectados pela seguinte identidade: x == (x/y)*y + (x%y). A
divisão inteira e o módulo também são conectadas pela função inteira divmod(x,y) == (x/y, x%y). Estas
identidades não valem para números de ponto flutuante; identidades similares valem de forma aproximada quando
x/y é substituı́do por floor(x/y) ou floor(x/y) - 12 . Deprecated since release 2.3. O operador de
divisão inteira (floor) e a função divmod() não são mais definidas para números complexos. Em vez disso,
converta para um número de ponto flutuante usando a função abs(), se for o caso.
O operador + (adição) retorna a soma dos seus argumentos. Os argumentos devem ser ou ambos números ou
ambos seqüências do mesmo tipo. No primeiro caso, os números são convertidos para um mesmo tipo e então
adicionados. No segundo, as seqüências são concatenadas.
O operador - (subtração) retorna a diferença entre os seus argumentos. Os argumentos numéricos são primeiro
convertidos para um mesmo tipo.
numericamente verdadeira devido ao arredondamento. Por exemplo, assumindo uma plataforma na qual o número de ponto flutuante do
Python seja um número de precisão dupla no padrão IEEE 754, de modo que -1e-100 %1e100 tenha o mesmo sinal que 1e100. A função
fmod() do módulo math retorna um resultado cujo sinal é igual ao do primeiro argumento em vez do segundo, e portanto retorna -1e100
nesse caso. A abordagem mais adequada depende da aplicação.
2 Se x é muito próximo de um inteiro exato múltiplo de y, é possı́vel que floor(x/y) seja maior do que (x-x%y)/y devido ao
arredondamento. Em casos desse tipo, Python retorna o último resultado, para manter a garantia de que
codedivmod(x,y)[0] * y + x % y seja muito próximo de x.
44 Capı́tulo 5. Expressões
em valor absoluto. Deslocamentos negativos causam uma exceção ValueError.
5.10 Comparações
Diferentemente do que em C, todas as operações de comparações em Python têm a mesma prioridade, que é menor
do que a de qualquer operação aritmética, de deslocamento ou bit-a-bit. Também diferentemente do que em C,
expressões como a < b < c têm a mesma interpretação que é convencional na matemática:
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "== = = > "!="
46 Capı́tulo 5. Expressões
seqüências vazias (strings, tuplas, listas, dicionários, sets e frozensets). Todos os outros valores são interpretados
como verdadeiros.
O operador not retorna True se o seu argumento é falso, False caso contrário.
Na expressão x and y, primeiro é interpretado x; se x é falso, seu valor é retornado; caso contrário, y é interpre-
tado e o valor resultante é retornado.
Na expressão x or y, primeiro é interpretado x; se x é verdadeiro, seu valor é retornado; caso contrário, y é
interpretado e o valor resultante é retornado
(Note que nem and nem or restringem o valor e o tipo que retornam a False e True, mas em vez disso
retornam o último arugumento interpretado. Algumas vezes isso é útil, por exemplo, se s é uma string que deve
ser substituı́da por um valor padrão caso seja vazia, a expressão s or ’foo’ retorna o valor desejado. Porque o
not precisa inventar uma valor de qualquer forma, ele não se preocupa em retornar um valor que seja do mesmo
tipo que o seu argumento, então por exemplo not ’foo’ retorna False, e não ’’.)
5.12 Lambdas
lambda_form ::= "lambda"[parameter_list]: expression
Construções lambda (expressões lambda) têm a mesma posição sintática do que expressões. Elas são uma forma
rápida de criar funções anônimas; a expressão lambda arguments: expression retorna um objeto do tipo
função. Os objeto não nomeado se comporta como uma função definida com
def name(arguments):
return expression
Veja a section 7.5 para informação sobre a sintaxe das listasa de parâmetros. Note que funções criadas com
construções lambda não podem conter comandos.
5.12. Lambdas 47
5.15 Summary
A tabela a seguir resume as precedências de operadores em Python, da menor precedência (ligação mais fraca)
à maior precedência (ligação mais forte). Os operadores na mesma caixa têm a mesma precedência. A menos
que a sintaxe seja dada explicitamente, os operadores são binários. Os operadores na mesma caixa são agrupados
da esquerda para a direita (exceto as comparações, incluindo os testes, os quaos tem a mesma precedência e são
encadeados da esquerda para a direita – veja a seção 5.10 – e exponenciação, que se agrupam da direita para a
esquerda).
Operador Descrição
lambda Expressão lambda
or OR Booleano
and AND Booleano
not x NOT Booleano
in, not in Testes de pertinência
is, is not Testes de identidade
<, <=, >, >=, <>, !=, == Comparações
| OR bit-a-bit
ˆ XOR bit-a-bit
& AND bit-abit
<<, >> Deslocamentos
+, - Adição e subtração
*, /, % Multiplicação, divisão, resto
+x, -x Positivo, negativo
˜x NOT bit-a-bit
** Exponenciação
x.atributo Referência a atributos
x[indice] Subscrição
x[indice:indice] Fatiamento
f (argumentos...) Chamada de função
(expressoes...) Ligação ou representação de tupla
[expressoes...] Representação de lista
{chave:dado...} Representação de dicionário
‘expressoes...‘ Conversão para string
48 Capı́tulo 5. Expressões
CAPÍTULO
SIX
Instruções simples
Instruções simples são compreendidas em uma única linha lógica. Várias instruções simples podem ocorrer em
uma única linha, separadas por ponto-e-vı́rgula. A sintaxe para essas instruções é:
simple_stmt ::= expression_stmt
| assert_stmt
| assignment_stmt
| augmented_assignment_stmt
| pass_stmt
| del_stmt
| print_stmt
| return_stmt
| yield_stmt
| raise_stmt
| break_stmt
| continue_stmt
| import_stmt
| global_stmt
| exec_stmt
6.1 Expressões
Expressões são usadas para computar e escrever um valor ou para chamar um procedimento (uma função que
não retorna qualquer resultado significativo; em Python, procedimentos retornam o valor None). Existem outras
formas permitidas e ocasionalmente úteis de se usar expressões. A sintaxe para uma expressão é definida por:
expression_stmt ::= expression_list
Uma expressão interpreta a lista de expressões passada (que pode ser uma única expressão) e devolve o resultado.
No modo interativo, se o valor não for None, ele é convertido para uma string usando a função repr() e a string
resultante é escrita em uma linha na saı́da de dados padrão (veja section 6.6). (Expressões que retornem None
não são escritas, de modo que esse procedimento não gera nenhuma saı́da.)
6.2 Assertivas
Assertivas são uma maneira conveniente de inserir verificações para a depuração de um programa:
assert_stmt ::= "assert"expression [","expression]
A forma simples, ‘assert expression’, é equivalente a:
49
if __debug__:
if not expression: raise AssertionError
if __debug__:
if not expression1: raise AssertionError, expression2
Essas equivalências assumem que __debug__ e AssertionError referem às variáveis built-in com esses nomes.
Na implementação atual, a variável __debug__ é True sob circunstâncias normais e False quando otimização
é usada. O interpretador não gera nenhum código para uma assertiva quando é usado otimização durante a
compilação. Note que é desnecessário incluir o código fonte da expressão que falho na mensagem de erro; ele
será mostrado no traceback do erro.
Atribuições à __debug__ são ilegais. O valor dessa variável é determinado quando o interpretador inicia.
6.3 Atribuições
Atribuições são usadas para (re)ligar nomes à valores e para modificar atributos ou items de objetos mutáveis:
assignment_stmt ::= (target_list "=")+ expression_list
target_list ::= target (","target)* [","]
target ::= identifier
| "("target_list ")"
| "["target_list "]"
| attributeref
| subscription
| slicing
(Veja a seção 5.3 para a definição da sintaxe dos três últimos sı́mbolos.)
Uma atribuição resolve a lista de expressões passada (lembre-se que pode ser uma única expressão ou uma lista
de expressões separadas por vı́rgulas, nesse caso retornando uma tupla) e atribui o objeto resultanta a cada uma
das variáveis da lista de alvos, da esquerda para a direita.
A atribuição é definida recursivamente, dependendo do formato dos alvos. Quando um alvo é parte de um objeto
mutável (uma referência de um atributo, subscrição ou slicing) esse objeto que deve realizar a atribuição e decidir
sobre sua validade, podendo levantar uma exceção se a atribuição for inaceitável. As regras observadas pelo objeto
e as exceções levantadas dependem da definição do próprio objeto (veja a seção 3.2).
A atribuição de um objeto a uma lista de alvos é definida recursivamente da seguinte forma:
– Se o nome não ocorre em um comando global no bloco de código atual: o nome é ligado ao objeto
no escopo atual.
– Em outros casos, o nome é simplesmente ligado ao objeto no escopo atual.
(Na implementação atual, assume-se que a sintaxe para alvos é idêntica à usada para expressões, e uma sintaxe
inválida é rejeitada na fase de geração do código, com mensagens de erro menos detalhadas.)
AVISO: Apesar da definição de atribuição implicar que repassar variáveis entre o lado esquerdo e o lado direito
da expressão é uma operação ‘segura (exemplo: ‘a, b = b, a’ troca duas variáveis), o mesmo dentro de uma
coleção de variáveis sendo atribuı́das não é seguro! Por exemplo, o seguinte programa escreve ‘[0, 2]’:
x = [0, 1]
i = 0
i, x[i] = 1, 2
print x
Uma atribuição incremental é a combinação, em um único comando, de uma operação binária e uma atribuição:
augmented_assignment_stmt ::= target augop expression_list
augop ::= "+= -= "*= "/= "%= "**="
| >= <= "&= "ˆ= ="
(Veja a seção 5.3 para definições da sintaxe dos três últimos sı́mbolos.)
Uma atribuição incremental resolve o alvo (que, ao contrário de outras operações de atribuição, não pode ser uma
sequência) e a lista de expressões, realizando a operação especı́fica em relação ao tipo dos operandos, e por fim
atribui o resultado ao alvo original. O alvo é resolvido apenas uma vez.
6.3. Atribuições 51
Uma expressão x += 1 pode ser escrita como x = x + 1 para obter um efeito semelhante, mas não idêntico.
Na versão incremental, x é resolvido apenas uma vez. Além disso, quando for possı́vel, a operação é realizada
in-place. Ao invés de criar um novo objeto e atribuı́do ao alvo, o objeto antigo é modificado.
Com a exceção de atribuições a tuplas e múltiplos alvos no mesmo comando, a atribuição incremental é realizada
da mesma maneira que uma atribuição normal. De forma similar, com a exceção do comportamento in-place
citado acima, a operação binária realizada pela atribuição é a mesma de uma operação normal.
Para alvos que são referências de atributos, o valor inicial é obtido com o método getattr() e o resultado
é atribuı́do com o método setattr(). Note que os dois métodos não referem necessariamente a mesma
variável. Quando getattr() refer a uma variável da classe, setattr() ainda atribui o valor a uma variável
da instância. Por exemplo:
class A:
x = 3 # variável da classe
a = A()
a.x += 1 # atribui 4 à a.x, deixando 3 em A.x
É ilegal deletar um nome do espaço local se ele ocorre como uma variável livre em um bloco aninhado.
Deleções de referências de atributos, subscrições e slicings são passadas para o objeto primário envolvido na
operação; deleção de um slicing é em geral equivalente a atribuição um slice vazio do tipo correto (determinado
pelo tipo do objeto).
See Also:
PEP 0255, “Simple Generators”
The proposal for adding generators and the yield statement to Python.
Um comando futuro orienta o compilador de que um determinado módulo deve ser compilado usando a sintaxe
ou a semântica que estará disponı́vel numa versão futura da linguagem. A intenção é facilitar a migração para
versões futuras que introduzem mudanças que criam incompatibilidades na linguage. Ele permite o uso de novas
funções em determinados módulos, antes que a função se torne o padrão.
future_statement ::= "from__future__import"feature ["as"name] (","feature ["as"name
| "from__future__import("feature ["as"name] (","feature ["as"n
feature ::= identifier
name ::= identifier
Um comando futuro deve aparecer logo no topo do módulo. As únicas linhas permitidas antes dele são:
As funções reconhecidas em Python 2.3 são ‘generators’ (geradores), ‘division’ (divisão de inteiros) e
‘nested_scopes’ (escopos aninhados). ‘generators’ e ‘nested_scopes’ são redundantes em Python
2.3 porque estão sempre ativos.
Um comando futuro e reconhecido e tratado durante a compilação: mudanças na semântica do núclero da lin-
guagem são frequentemente implementadas gerando um código diferente. É até possı́vel que uma nova função
introduza novas incompatibilidades na linguagem (como uma nova palavra reservada), caso em que o compilador
precisa interpretar o código do módulo de forma diferente. Estas decisões não podem ser deixadas de lado até o
momento da execução.
Para qualquer versão, o compilador sabe exatamente que funções foram definidas e levanta um erro se um comando
futuro contém algo desconhecido.
A semântica usada no momento da execução é a mesma de qualquer comando import: há um módulo padrão
chamado __future__, descrito adiante, e ele será importado da maneira usual no momento em que o comando
é executado.
Note que não há nada de especial no comando:
import __future__ [como um nome]
Esse não é um comando futuro; é um comando import ordinário, sem nenhuma semântica especial ou restrição na
sintaxe.
Código compilado pelo comando exec ou chamadas às funções compile() e execfile() que ocorram em
um módulo M contendo um comando futuro irão, por definição, usar a nova sintaxe ou semântica associada com o
comando. Isso pode, a partir de Python 2.2, ser controlado com argumentos opcionais à função compile() —
veja a documentação dessa função na biblioteca padrão para mais detalhes.
Um comando futuro digitado no prompt do interpretador interativo irá ter efeito pelo resto da sessão. Se o inter-
pretador é iniciado com a oção -i e se for passado para execução um script que contenha um comando futuro, ele
estará em efeito na sessão apenas depois que o script for executado.
SEVEN
Instruções compostas
Instruções compostas comtêm (grupos de) outras instruções; elas afetam ou controlam de alguma forma a execução
destas outras instruções. Em geral, instruções compostas se propagam por várias linhas, apesar de que quando
usadas de formas simples, ela pode estar contida em uma só linha.
As instruções if, while e for implementam as tradicionais estruturas de controle de fluxo. try especifica os
manipladores de exceções e/ou código de limpeza para um grupo de instruções. Definições de funções e de classes
também são consideradas sintaticamente como instruções compostas.
Instruções compostas consistem de uma ou mais ’cláusulas.’ Uma cláusula consiste de um cabeçalho e de um
’corpo’(suite, no original). Os cabeçalhos das diversas cláusulas de uma instrução composta estão sempre no
mesmo nı́vel de indentação. Cada cabeçalho começa com uma keyword identificador e termina com um sinal de
dois-pontos. O corpo é um grupo de instruções controlado por uma cláusula. Ele pode ter um ou mais instruções
separadas por um sinal de ponto-e-vı́rgula na mesma linha do cabeçalho, logo após o sinal de dois pontos do
cabeçalho, ou pode ter uma ou mais instruções indentadas nas linhas seguintes. Apenas a última forma pode
conter intruções compostas aninhadas; o seguinte exemplo é ilegal, principalmente por não deixar claro a qual if
um possı́vel else seguinte pertenceria:
Note ainda que o ponto-e-vı́rgula estabelece uma ligação mais forte que o sinal de dois-pontos neste contexto,
então, no exemplo seguinte, são executados ou todas ou nenhuma das instruções print presentes:
Sumário:
compound_stmt ::= if_stmt
| while_stmt
| for_stmt
| try_stmt
| funcdef
| classdef
suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement ::= stmt_list NEWLINE | compound_stmt
stmt_list ::= simple_stmt (";"simple_stmt)* [";"]
Note que instruções sempre terminam com o sı́mbolo NEWLINE possivelmente seguido de um DEDENT. Note
ainda que cláusulas de continuação opcionais sempre começam com uma keyword que não pode iniciar uma
instrução, para que não hajam ambiguidades. (o problema de a qual if pertence o else é resolvido em Python
requerendo que todos os if aninhados estejam indentados.
Para deixar mais claro, a formatação das regras gramaticais adiante posiciona cada cláusula em uma linha separada.
59
7.1 O comando if
O comando if é usado para execução condicional:
if_stmt ::= "if"expression ":"suite
( "elif"expression ":"suite )*
["else:"suite]
Ele seleciona exatamente um dos corpos existentes, resolvendo as expressões, até que uma delas seja verdadeira
(veja a seção 5.11 para as definições de verdadeiro e falso); então, aquele corpo é executado (e nenhuma outra
parte do comando if é executada ou resolvida). Se todas as expressões são falsas, o corpo da cláusula else, se
existente, é executado.
Uma definição de função é uma instrução executável. Sua execução liga o nome da função no contexto atual a um
objeto função (um invólucro do código executável para a função). Este objeto contém uma referência ao espaço
global atual como o contexto a ser usado quando a função é chamada.
A definição não executa o corpo da função; este é executado apenas quando a função é chamada.
A function definition may be wrapped by one or more decorator expressions. Decorator expressions are evaluated
when the function is defined, in the scope that contains the function definition. The result must be a callable,
which is invoked with the function object as the only argument. The returned value is bound to the function name
instead of the function object. Multiple decorators are applied in nested fashion. For example, the following code:
@f1(arg)
@f2
def func(): pass
is equivalent to:
Quando um ou mais parâmetros têm a forma parâmetro = expressão, diz-se que a função têm “parâmetros com
valores padrão”. Para um parâmetro com valor padrão, o argumento correspondente pode ser omitido de uma
chamada, caso em que o valor padrão do parâmetro é substituı́do. Se um parâmetro tem um valor padrão, todos
os parâmetros seguintes também têm de ter — esta é uma restrição sintática que não está expressa na gramática.
Valores padrão de parâmetros são resolvidos quando a definição da função é executada. Isso significa que a
expressão só é resolvida uma vez, quando a definição da função é resolvida, e que o mesmo valor “pré-computado”
é usado para todas as chamadas. É importante entender isso, principalmente quando o valor padrão é um objeto
mutável, como uma lista ou dicionário: se a função modifica o objeto (por exemplo, adicionando um item a uma
lista) o valor padrão está definitivamente modificado. Geralmente, não é essa a intenção. Uma forma de contornar
isso é usar None como padrão, e testar por ele no corpo da função. Por exemplo:
A semântica da chamada de funções é descrita em mais detalhes na seção ??. Uma chamada de função sempre
designa valores a todos os parâmetros mencionados na lista de parâmetros, seja de argumentos posicionais, de
palavras-chave ou de valores padrão. Se a forma “*identifier” está presente, essa variável é inicializada com
uma tupla contendo quaisquer argumentos posicionais em excesso. Se a forma “**identifier” é usada, a
varı́ável é inicializada com um dicionário contendo quaisquer argumentos com palavras-chave usados em excesso.
Os valores padrão são uma tupla e um dicionário vazios, respectivamente.
É também possı́vel criar funções anônimas (funções que não são ligadas a um nome), para uso imediato em
expressões. Elas usam o a instrução lambda, descrita na seção 5.12. Note que lambda é meramente um atalho para
uma definição simplificada de função; uma função definida com o comando “def” pode ser repassada ou ter o
nome redefinido, assim como uma função definida por lambda. O comando “def” é mais poderoso pois permite
a execução de múltiplos comandos dentro do corpo da função.
Nota: Funções são objetos de primeira classe. Um comando “def” executado dentro de uma definição de função,
cria uma função local que pode ser retornada ou passada adiante. Variáveis livres usadas na função aninhada
podem acessar variáveis locais da função contendo o comando. Veja a seção 4.1 para detalhes.
EIGHT
Componentes de alto-nı́vel
O interpretador Python pode receber sua entrada de uma série de fontes: de um script passado como entrada de
dados padrão ou como argumento, digitado interativamente, de um módulo, etc. Este capı́tulo cobre a sintaxe
usada nestes casos.
65
Note que uma instrução composta deve ser seguida de uma linha em branco quando em modo interativo; isso é
necessário para que o parser possa detectar o fim da entrada.
Histórico e Licenças
Note: GPL-compatible doesn’t mean that we’re distributing Python under the GPL. All Python licenses, unlike
the GPL, let you distribute a modified version without making your changes open source. The GPL-compatible
67
licenses make it possible to combine Python with other software that is released under the GPL; the others don’t.
Thanks to the many outside volunteers who have worked under Guido’s direction to make these releases possible.
1. This LICENSE AGREEMENT is between BeOpen.com (“BeOpen”), having an office at 160 Saratoga
Avenue, Santa Clara, CA 95051, and the Individual or Organization (“Licensee”) accessing and otherwise
using this software in source or binary form and its associated documentation (“the Software”).
2. Subject to the terms and conditions of this BeOpen Python License Agreement, BeOpen hereby grants Li-
censee a non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display
publicly, prepare derivative works, distribute, and otherwise use the Software alone or in any derivative
version, provided, however, that the BeOpen Python License is retained in the Software, alone or in any
derivative version prepared by Licensee.
3. BeOpen is making the Software available to Licensee on an “AS IS” basis. BEOPEN MAKES NO REP-
RESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT
LIMITATION, BEOPEN MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY
OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF
THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
5. This License Agreement will automatically terminate upon a material breach of its terms and conditions.
6. This License Agreement shall be governed by and interpreted in all respects by the law of the State of
California, excluding conflict of law provisions. Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture between BeOpen and Licensee. This License
Agreement does not grant permission to use BeOpen trademarks or trade names in a trademark sense to
endorse or promote products or services of Licensee, or any third party. As an exception, the “BeOpen
Python” logos available at http://www.pythonlabs.com/logos.html may be used according to the permissions
granted on that web page.
7. By copying, installing or otherwise using the software, Licensee agrees to be bound by the terms and
conditions of this License Agreement.
1. This LICENSE AGREEMENT is between the Corporation for National Research Initiatives, having an
office at 1895 Preston White Drive, Reston, VA 20191 (“CNRI”), and the Individual or Organization (“Li-
censee”) accessing and otherwise using Python 1.6.1 software in source or binary form and its associated
documentation.
2. Subject to the terms and conditions of this License Agreement, CNRI hereby grants Licensee a nonexclu-
sive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare
derivative works, distribute, and otherwise use Python 1.6.1 alone or in any derivative version, provided,
however, that CNRI’s License Agreement and CNRI’s notice of copyright, i.e., “Copyright
c 1995-2001
Corporation for National Research Initiatives; All Rights Reserved” are retained in Python 1.6.1 alone
or in any derivative version prepared by Licensee. Alternately, in lieu of CNRI’s License Agreement,
Licensee may substitute the following text (omitting the quotes): “Python 1.6.1 is made available sub-
ject to the terms and conditions in CNRI’s License Agreement. This Agreement together with Python
1.6.1 may be located on the Internet using the following unique, persistent identifier (known as a handle):
1895.22/1013. This Agreement may also be obtained from a proxy server on the Internet using the following
URL: http://hdl.handle.net/1895.22/1013.”
3. In the event Licensee prepares a derivative work that is based on or incorporates Python 1.6.1 or any part
thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby
agrees to include in any such work a brief summary of the changes made to Python 1.6.1.
4. CNRI is making Python 1.6.1 available to Licensee on an “AS IS” basis. CNRI MAKES NO REPRESEN-
TATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMI-
TATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MER-
CHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON
1.6.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6.1 FOR ANY
INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFY-
ING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, OR ANY DERIVATIVE THEREOF,
EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
6. This License Agreement will automatically terminate upon a material breach of its terms and conditions.
7. This License Agreement shall be governed by the federal intellectual property law of the United States, in-
cluding without limitation the federal copyright law, and, to the extent such U.S. federal law does not apply,
by the law of the Commonwealth of Virginia, excluding Virginia’s conflict of law provisions. Notwithstand-
ing the foregoing, with regard to derivative works based on Python 1.6.1 that incorporate non-separable
material that was previously distributed under the GNU General Public License (GPL), the law of the Com-
monwealth of Virginia shall govern this License Agreement only as to issues arising under or with respect
to Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this License Agreement shall be deemed to
ACCEPT
CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
Copyright
c 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands. All rights reserved.
Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee
is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice
and this permission notice appear in supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to distribution of the software without specific,
written prior permission.
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL, INDIRECT
OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TOR-
TIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
The _random module includes code based on a download from http://www.math.keio.ac.jp/ matu-
moto/MT2002/emt19937ar.html. The following are the verbatim comments from the original code:
A.3.2 Sockets
The socket module uses the functions, getaddrinfo, and getnameinfo, which are coded in separate
source files from the WIDE Project, http://www.wide.ad.jp/about/index.html.
THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ‘‘AS IS’’ AND
GAI_ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
FOR GAI_ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON GAI_ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN GAI_ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
The source for the fpectl module includes the following notice:
The source code for the md5 module contains the following notice:
A.3.7 Profiling
Permission to use, copy, modify, and distribute this Python software and
its associated documentation for any purpose without fee is hereby
granted, provided that the above copyright notice appears in all copies,
and that both that copyright notice and this permission notice appear in
supporting documentation, and that the name of neither Automatrix,
Bioreason or Mojam Media be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.
SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR
BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
OF THIS SOFTWARE.
79
__long__() (numeric object method), 30 __truediv__() (numeric object method), 29
__lshift__() (numeric object method), 29 __unicode__() (object method), 23
__lt__() (object method), 22 __xor__() (numeric object method), 29
__main__ (built-in module), 34, 65
__metaclass__ (data in ), 26 A
__mod__() (numeric object method), 29 abs() (built-in function), 30
__module__ addition, 44
class attribute, 18 análise léxica, 3
function attribute, 16 and
method attribute, 17 bit-wise, 45
__mul__() and
numeric object method, 29 operator, 47
sequence object method, 27 anonymous
__name__ function, 47
class attribute, 18 append() (sequence object method), 27
function attribute, 16 argument
method attribute, 17 function, 16
module attribute, 18 arithmetic
__ne__() (object method), 22 operation, binary, 44
__neg__() (numeric object method), 30 operation, unary, 43
__new__() (object method), 21 aritmética
__nonzero__() conversão, 37
object method, 27 array (standard module), 16
object method, 23 ASCII , 2, 7, 8, 11, 15
__oct__() (numeric object method), 30 aspas
__or__() (numeric object method), 29 invertidas, 39
__pos__() (numeric object method), 30 assert
__pow__() (numeric object method), 29 statement, 49
__radd__() AssertionError
numeric object method, 29 exception, 50
sequence object method, 27 assertions
__rand__() (numeric object method), 29 debugging, 49
__rcmp__() (object method), 23 assignment
__rdiv__() (numeric object method), 29 attribute, 50, 51
__rdivmod__() (numeric object method), 29 augmented, 51
__repr__() (object method), 22 class attribute, 18
__rfloordiv__() (numeric object method), 29 class instance attribute, 19
__rlshift__() (numeric object method), 29 slicing, 51
__rmod__() (numeric object method), 29 statement, 16, 50
__rmul__() subscription, 51
numeric object method, 29 target list, 50
sequence object method, 27 atributo, 14
__ror__() (numeric object method), 29 especial, 14
__rpow__() (numeric object method), 29 genérico especial, 14
__rrshift__() (numeric object method), 29 referência, 40
__rshift__() (numeric object method), 29 attribute
__rsub__() (numeric object method), 29 assignment, 50, 51
__rtruediv__() (numeric object method), 29 assignment, class, 18
__rxor__() (numeric object method), 29 assignment, class instance, 19
__set__() (object method), 24 class, 18
__setattr__() class instance, 19
object method, 23 deletion, 52
object method, 23 AttributeError
__setitem__() (container object method), 27 exception, 40
__setslice__() (sequence object method), 28 augmented
__slots__ (data in ), 25 assignment, 51
__str__() (object method), 22
__sub__() (numeric object method), 29
80 Índice Remissivo
B chaining
back-quotes, 22, 39 comparisons, 45
backward character, 15
quotes, 22, 39 character set, 15
barra invertida, 4 chave, 39
binary chr() (built-in function), 15
arithmetic operation, 44 class
bit-wise operation, 45 attribute, 18
binding attribute assignment, 18
global name, 57 constructor, 21
name, 33, 50, 55, 62, 63 definition, 53, 63
bit-wise instance, 19
and, 45 name, 63
operation, binary, 45 object, 18, 43, 63
operation, unary, 43 class
or, 45 statement, 63
xor, 45 class instance
blank line, 5 attribute, 19
block, 33 attribute assignment, 19
code, 33 call, 43
BNF, 2, 37 object, 18, 19, 43
Boolean class object
operation, 46 call, 18, 43
Booleano clause, 59
object, 15 clear() (mapping object method), 27
break cmp() (built-in function), 23
statement, 54, 60–62 co_argcount (code object attribute), 19
bsddb (standard module), 16 co_cellvars (code object attribute), 19
built-in co_code (code object attribute), 19
method, 18 co_consts (code object attribute), 19
module, 55 co_filename (code object attribute), 19
built-in function co_firstlineno (code object attribute), 19
call, 43 co_flags (code object attribute), 19
object, 17, 43 co_freevars (code object attribute), 19
built-in method co_lnotab (code object attribute), 19
call, 43 co_name (code object attribute), 19
object, 18, 43 co_names (code object attribute), 19
byte, 15 co_nlocals (code object attribute), 19
bytecode, 19 co_stacksize (code object attribute), 19
co_varnames (code object attribute), 19
C code
block, 33
C, 8
object, 19
language, 17, 45
code block, 55
linguagem, 14, 15
coleta de lixo, 13
call
comma
built-in function, 43
trailing, 47, 53
built-in method, 43
command line, 65
class instance, 43
comment, 4
class object, 18, 43
comparison, 45
function, 16, 43
string, 15
instance, 26, 43
comparisons, 23
method, 43
chaining, 45
procedure, 49
compile() (built-in function), 57
user-defined function, 43
complex
callable
literal, 9
object, 16, 41
complex() (built-in function), 30
calls, 41
complexos
caractere, 40
Índice Remissivo 81
numeros, 15 dictionary, 39
object, 15 division, 44
compound divmod() (built-in function), 29
statement, 59 documentation string, 19
compreensões
lista, 38 E
constant, 7 EBCDIC, 15
constructor elif
class, 21 keyword, 60
contêiner, 14 Ellipsis
contagem de referência, 13 object, 14
container, 18 else
continuação de linhas, 4 dangling, 59
continue else
statement, 54, 60–62 keyword, 54, 60, 61
conversão empty
aritmética, 37 tuple, 15
string, 39 encodings, 4
conversion environment, 33
string, 22, 49 error handling, 34
copy() (mapping object method), 27 errors, 34
count() (sequence object method), 27 escape sequence, 8
especial
D atributo, 14
dado atributo, genérico, 14
tipo, 14 estendido
tipo, imutável, 38 fatiamento, 41
dados, 13 estrutura entre parênteses, 38
dangling eval() (built-in function), 57, 66
else, 59 evaluation
dbm (standard module), 16 order, 47
debugging exc_info (in module sys), 20
assertions, 49 exc_traceback (in module sys), 20, 61
decimal literal, 9 exc_type (in module sys), 61
DEDENT token, 5, 59 exc_value (in module sys), 61
def except
statement, 62 keyword, 61
default exception, 34, 54
parameter value, 62 AssertionError, 50
definições léxicas, 2 AttributeError, 40
definition handler, 20
class, 53, 63 ImportError, 55
function, 53, 62 NameError, 38
del raising, 54
statement, 16, 21, 52 RuntimeError, 53
delete, 16 StopIteration, 53
deletion SyntaxError, 55
attribute, 52 TypeError, 43
target, 52 ValueError, 45
target list, 52 ZeroDivisionError, 44
delimiters, 11 exception handler, 34
destructor, 21, 51 exclusive
dicionário or, 45
object, 39, 40 exec
dictionary statement, 57
display, 39 execfile() (built-in function), 57
object, 16, 18, 23, 51 execution
display frame, 33, 63
82 Índice Remissivo
restricted, 34 func_doc (function attribute), 16
stack, 20 func_globals (function attribute), 16
execution model, 33 function
expressão, 37 anonymous, 47
expression argument, 16
generator, 39 call, 16, 43
lambda, 47 call, user-defined, 43
list, 47, 49, 50 definition, 53, 62
statement, 49 generator, 53
extend() (sequence object method), 27 name, 62
extended print statement, 53 object, 16, 17, 43, 62
extensão user-defined, 16
módulo, 14 future
extension statement, 56
filename, 55
G
F gdbm (standard module), 16
f_back (frame attribute), 20 genérico
f_builtins (frame attribute), 20 especial atributo, 14
f_code (frame attribute), 20 generator
f_exc_traceback (frame attribute), 20 expression, 39
f_exc_type (frame attribute), 20 function, 17, 53
f_exc_value (frame attribute), 20 iterator, 17, 53
f_globals (frame attribute), 20 object, 19, 39
f_lasti (frame attribute), 20 generator expression
f_lineno (frame attribute), 20 object, 39
f_locals (frame attribute), 20 get() (mapping object method), 27
f_restricted (frame attribute), 20 global
f_trace (frame attribute), 20 name binding, 57
False, 15 namespace, 16
fatia, 40 global
fatiamento, 15, 40 statement, 50, 52, 57
estendido, 41 globals() (built-in function), 57
fatiamento estendido, 15 gramática, 2
file grouping, 5
object, 66
filename H
extension, 55 handle an exception, 34
finally handler
keyword, 53, 54, 61 exception, 20
float() (built-in function), 30 has_key() (mapping object method), 27
floating point literal, 9 hash() (built-in function), 23
for hash character, 4
statement, 54, 60 hex() (built-in function), 30
form hexadecimal literal, 9
lambda, 47, 63 hierarchical
frame module names, 55
execution, 33, 63 hierarquia
object, 19 tipo, 14
free
variable, 33, 52 I
from
id() (built-in function), 13
keyword, 55
identidade de um objeto, 13
statement, 33, 55
identifier, 6, 37
func_closure (function attribute), 16
identity
func_code (function attribute), 16
test, 46
func_defaults (function attribute), 16
if
func_dict (function attribute), 16
statement, 60
Índice Remissivo 83
im_class (method attribute), 17 iterkeys() (mapping object method), 27
im_func (method attribute), 17 itervalues() (mapping object method), 27
im_self (method attribute), 17
imaginary literal, 9 J
import Java
statement, 18, 55 linguagem, 15
ImportError
exception, 55 K
imutável keys() (mapping object method), 27
dado tipo, 38 keyword, 7
object, 15 elif, 60
objeto, 38, 39 else, 54, 60, 61
in except, 61
keyword, 60 finally, 53, 54, 61
operator, 46 from, 55
inclusive in, 60
or, 45
INDENT token, 5 L
indentation, 5 lambda
index() (sequence object method), 27 expression, 47
indices() (slice method), 20 form, 47, 63
inheritance, 63 language
initialization C, 17, 45
module, 55 Pascal, 60
input, 66 last_traceback (in module sys), 20
raw, 66 leading whitespace, 5
input() (built-in function), 66 len() (built-in function), 15, 16, 27
insert() (sequence object method), 27 line structure, 3
instance linguagem
call, 26, 43 C, 14, 15
class, 19 Java, 15
object, 18, 19, 43 linha fı́sica, 3, 4
int() (built-in function), 30 linha lógica, 3
integer, 15 list
integer literal, 9 assignment, target, 50
inteiro deletion target, 52
object, 14 expression, 47, 49, 50
representação, 15 object, 16, 51
inteiro longo target, 50, 60
object, 14 lista
inteiro plano compreensões, 38
object, 14 object, 39, 40
interactive mode, 65 representação, 38
internal type, 19 vazia, 39
interpreter, 65 literal, 7, 38
inversion, 43 locals() (built-in function), 57
invertidas long() (built-in function), 30
aspas, 39 long integer literal, 9
invocation, 16 loop
is over mutable sequence, 60
operator, 46 statement, 54, 60
is not loop control
operator, 46 target, 54
item
seqüência, 40 M
string, 40
módulo
items() (mapping object method), 27
extensão, 14
iteritems() (mapping object method), 27
object, 40
84 Índice Remissivo
makefile() (socket method), 19 privados, 38
mapeamento None
object, 40 object, 49
mapping None, 14
object, 16, 19, 51 not
membership operator, 47
test, 46 not in
method operator, 46
built-in, 18 notação, 2
call, 43 NotImplemented, 14
object, 16, 18, 43 null
user-defined, 16 operation, 52
minus, 43 numérico
modificação object, 14
nome, 38 number, 9
module numeric
built-in, 55 object, 19
importing, 55 numeric literal, 9
initialization, 55 numero
name, 55 ponto flutuante, 15
names, hierarchical, 55 numeros
namespace, 18 complexos, 15
object, 18
search path, 55 O
user-defined, 55 object
modules (in module sys), 55 Booleano, 15
modulo, 44 built-in function, 17, 43
multiplication, 44 built-in method, 18, 43
mutable callable, 16, 41
object, 16, 50, 51 class, 18, 43, 63
mutable sequence class instance, 18, 19, 43
loop over, 60 code, 19
object, 16 complexos, 15
dicionário, 39, 40
N dictionary, 16, 18, 23, 51
name, 6, 33, 37 Ellipsis, 14
binding, 33, 50, 55, 62, 63 file, 66
binding, global, 57 frame, 19
class, 63 function, 16, 17, 43, 62
function, 62 generator, 19, 39
module, 55 generator expression, 39
rebinding, 50 imutável, 15
unbinding, 52 instance, 18, 19, 43
NameError inteiro, 14
exception, 38 inteiro longo, 14
NameError (built-in exception), 33 inteiro plano, 14
names list, 16, 51
hierarchical module, 55 lista, 39, 40
namespace, 33 módulo, 40
global, 16 mapeamento, 40
module, 18 mapping, 16, 19, 51
negation, 43 method, 16, 18, 43
newline module, 18
suppression, 53 mutable, 16, 50, 51
NEWLINE token, 59 mutable sequence, 16
nome None, 49
modificação, 38 numérico, 14
nomes numeric, 19
Índice Remissivo 85
ponto flutuante, 15 par chave/valor, 39
recursivo, 40 parameter
seqüência, 15, 40 value, default, 62
seqüência imutável, 15 parser, 3
sequence, 19, 46, 51, 60 Pascal
slice, 27 language, 60
string, 15, 40 pass
traceback, 20, 54, 61 statement, 52
tupla, 40 path
tuple, 15, 47 module search, 55
unicode, 15 physical line, 8
user-defined function, 16, 43, 62 plain integer literal, 9
user-defined method, 16 plus, 43
objeto, 13 ponto flutuante
imutável, 38, 39 numero, 15
objeto imutável, 13 object, 15
objeto mutável, 13 pop()
objetos inacessı́veis, 13 mapping object method, 27
oct() (built-in function), 30 sequence object method, 27
octal literal, 9 popen() (in module os), 19
open() (built-in function), 19 popitem() (mapping object method), 27
operação de ı́ndice, 15 pow() (built-in function), 29
operation precedence
binary arithmetic, 44 operator, 48
binary bit-wise, 45 primária, 40
Boolean, 46 print
null, 52 statement, 22, 52
shifting, 44 privados
unary arithmetic, 43 nomes, 38
unary bit-wise, 43 procedure
operator call, 49
and, 47 program, 65
in, 46 Python Enhancement Proposals
is, 46 PEP 0255, 54
is not, 46
not, 47 Q
not in, 46 quotes
or, 47 backward, 22, 39
overloading, 21 reverse, 22
precedence, 48
operators, 10 R
or raise
bit-wise, 45 statement, 54
exclusive, 45 raise an exception, 34
inclusive, 45 raising
or exception, 54
operator, 47 range() (built-in function), 60
ord() (built-in function), 15 raw input, 66
order raw string, 8
evaluation, 47 raw_input() (built-in function), 66
output, 49, 53 readline() (file method), 66
standard, 49, 53 rebinding
OverflowError (exceção interna), 14 name, 50
overloading recursivo
operator, 21 object, 40
referência
P atributo, 40
packages, 55 remove() (sequence object method), 27
86 Índice Remissivo
repr() (built-in function), 22, 40, 49 compound, 59
representação continue, 54, 60–62
inteiro, 15 def, 62
lista, 38 del, 16, 21, 52
tupla, 38 exec, 57
reserved word, 7 expression, 49
restricted for, 54, 60
execution, 34 from, 33, 55
retorna ı́tem, 15 future, 56
return global, 50, 52, 57
statement, 53, 61, 62 if, 60
reverse import, 18, 55
quotes, 22 loop, 54, 60
reverse() (sequence object method), 27 pass, 52
RuntimeError print, 22, 52
exception, 53 raise, 54
return, 53, 61, 62
S simple, 49
scope, 33 try, 20, 61
search while, 54, 60
path, module, 55 yield, 53
seqüência statement grouping, 5
item, 40 stderr (in module sys), 19
object, 15, 40 stdin (in module sys), 19
seqüência imutável stdout (in module sys), 19, 53
object, 15 step (slice object attribute), 20, 41
sequence stop (slice object attribute), 20, 41
object, 19, 46, 51, 60 StopIteration
setdefault() (mapping object method), 27 exception, 53
shifting str() (built-in function), 22, 40
operation, 44 string
simple comparison, 15
statement, 49 conversão, 39
singleton conversion, 22, 49
tuple, 15 item, 40
sintaxe, 2, 37 object, 15, 40
slice Unicode, 8
object, 27 string literal, 7
slice() (built-in function), 20 subscrição, 15, 40
slicing, 16 subscription, 16
assignment, 51 assignment, 51
sort() (sequence object method), 27 subtraction, 44
source character set, 4 suite, 59
space, 5 suppression
stack newline, 53
execution, 20 SyntaxError
trace, 20 exception, 55
standard sys (built-in module), 53, 55, 61, 65
output, 49, 53 sys.exc_info, 20
Standard C, 8 sys.exc_traceback, 20
standard input, 65 sys.last_traceback, 20
start (slice object attribute), 20, 41 sys.modules, 55
statement sys.stderr, 19
assert, 49 sys.stdin, 19
assignment, 16, 50 sys.stdout, 19
assignment, augmented, 51 SystemExit (built-in exception), 35
break, 54, 60–62
class, 63
Índice Remissivo 87
T unicode() (built-in function), 15, 23
tab, 5 Unicode Consortium, 8
target, 50 UNIX, 65
deletion, 52 unrecognized escape sequence, 8
list, 50, 60 update() (mapping object method), 27
list assignment, 50 user-defined
list, deletion, 52 function, 16
loop control, 54 function call, 43
tb_frame (traceback attribute), 20 method, 16
tb_lasti (traceback attribute), 20 module, 55
tb_lineno (traceback attribute), 20 user-defined function
tb_next (traceback attribute), 20 object, 16, 43, 62
termination model, 34 user-defined method
test object, 16
identity, 46
membership, 46 V
tipo, 14 vı́rgula, 38
dado, 14 valor, 39
hierarquia, 14 valor de um objeto, 13
imutável dado, 38 value
tipo de um objeto, 13 default parameter, 62
token, 3 ValueError
token NEWLINE, 3 exception, 45
trace values
stack, 20 writing, 49, 53
traceback values() (mapping object method), 27
object, 20, 54, 61 variable
trailing free, 33, 52
comma, 47, 53 vazia
triple-quoted string, 8 lista, 39
True, 15 tupla, 38
try
statement, 20, 61 W
tupla while
object, 40 statement, 54, 60
representação, 38 whitespace, 5
vazia, 38 writing
tuple values, 49, 53
empty, 15
object, 15, 47 X
singleton, 15 xor
type() (built-in function), 13 bit-wise, 45
TypeError
exception, 43 Y
types, internal, 19 yield
statement, 53
U
unary Z
arithmetic operation, 43 ZeroDivisionError
bit-wise operation, 43 exception, 44
unbinding
name, 52
UnboundLocalError, 33
união de linhas, 3, 4
unichr() (built-in function), 15
Unicode, 15
unicode
object, 15
88 Índice Remissivo