Breve Passeio à Biblioteca Padrão

Prévio Próximo

Python Logo10. Breve Passeio à Biblioteca Padrão

10.1. Interface do Sistema Operacional

O módulo os fornece dezenas de funções para interagir com o sistema operacional:
>>> import os
>>> os.getcwd()      # Return the current working directory
'C:\\Python26'
>>> os.chdir('/server/accesslogs')   # Change current working directory
>>> os.system('mkdir today')   # Run the command mkdir in the system shell
0
Certifique-se de usar o estilo import os, em vez de from os import *. Isto irá evitar os.open() de sombrear a função open() que opera de forma muito diferente.
 
As funções internas dir() e help() são úteis como auxiliares interativas para trabalhar com grandes módulos, como os:
>>> import os
>>> dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's docstrings>
Para tarefas de arquivo e gerenciamento de diretórios diárias, o módulo shutil fornece uma interface de nível superior que é mais fácil de usar:
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
>>> shutil.move('/build/executables', 'installdir')

10.2. Arquivos Wildcards

O módulo glob fornece uma função para fazer listas de arquivos a partir de pesquisas de diretório curinga:
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']

10.3. Argumentos da Linha de Comando

Os scripts de serviços de utilidades comuns, muitas vezes precisam processar os argumentos da linha de comando. Estes argumentos são armazenados no atributo argv do módulo sys como uma lista. Por exemplo, os seguintes resultados da execução python demo.py one two three na linha de comando:
>>> import sys
>>> print sys.argv
['demo.py', 'one', 'two', 'three']
O módulo getopt processa sys.argv usando as convenções da função Unix getopt(). Mais poderosa e flexível de processamento de linha de comando é fornecida pelo módulo argparse.

10.4. Erro de redirecionamento de saída e Término de Programa

O módulo sys também tem atributos para stdinstdout e stderr. O último é útil para a emissão de avisos e mensagens de erro para torná-los visíveis mesmo quando stdout foi redirecionado:
>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
A maneira mais direta de encerrar um script é usar sys.exit().

10.5. Casando String Patterns

O módulo re fornece ferramentas de expressões regulares para processamento avançado de strings. Para correspondência e manipulação complexa, expressões regulares oferecem soluções sucintas, otimizado:
>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
Quando são necessários apenas capacidades simples, métodos de string são preferidos porque são mais fáceis de ler e de depuração:
>>> 'tea for too'.replace('too', 'two')
'tea for two'

10.6. Matemática

O módulo de matemática dá acesso às funções de biblioteca em C para matemática de ponto flutuante:
>>> import math
>>> math.cos(math.pi / 4.0)
0.70710678118654757
>>> math.log(1024, 2)
10.0
O módulo random fornece ferramentas para fazer seleções aleatórias:
>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(xrange(100), 10)   # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # random float
0.17970987693706186
>>> random.randrange(6)    # random integer chosen from range(6)
4

10.7. Acesso à Internet

Há uma série de módulos de acesso à internet e processamento de protocolos de internet. Dois dos mais simples são urllib2 para recuperar dados de URLs e smtplib para o envio de e-mail:
>>> import urllib2
>>> for line in urllib2.urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
...     if 'EST' in line or 'EDT' in line:  # look for Eastern Time
...         print line

<BR>Nov. 25, 09:43:32 PM EST

>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('[email protected]', '[email protected]',
... """To: [email protected]... From: [email protected]...
... Beware the Ides of March.
... """)
>>> server.quit()
(Note-se que no segundo exemplo precisa de um servidor de correio em execução no localhost).

10.8. Dates e Times

O módulo datetime fornece classes para manipular datas e horas em ambas as formas simples e complexas. Enquanto a aritmética de date e time é suportada, o foco da implementação é na extração eficiente do membro para a formatação de saída e manipulação. O módulo também suporta objetos que estão cientes de fuso horário.
>>> # dates are easily constructed and formatted
>>> from datetime import date
>>> now = date.today()
>>> nowdatetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

>>> # dates support calendar arithmetic
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368

10.9. Compressão de Dados

Arquivamento de dados comuns e compressão formatos são suportados por módulos, incluindo: zlibgzipbz2, arquivo zip e arquivo tar.
>>> import zlib
>>> s = 'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979

10.10. Medição de Desempenho

Alguns usuários do Python desenvolvem um profundo interesse em conhecer o desempenho relativo de diferentes abordagens para o mesmo problema. Python fornece uma ferramenta de medida que responde a essas perguntas imediatamente.

Por exemplo, pode ser tentador usar o empacotamento tuple e recurso de descompactação em vez da abordagem tradicional de trocar argumentos. O módulo timeit demonstra rapidamente uma vantagem modesta de desempenho:

>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
Em contraste ao fino nível de granularidade do módulo timeit, os módulos profile e pstats fornecem ferramentas para identificar as seções críticas do tempo em grandes blocos de código.

10.11. Controle de Qualidade

Uma abordagem para o desenvolvimento de software de alta qualidade é escrever testes para cada função quando fôr escrita e executar esses testes com freqüência durante o processo de desenvolvimento.

O módulo doctest fornece uma ferramenta para a escanear um módulo e validar testes embutidos em docstrings de um programa. Construção de teste é tão simples como corte-e-colar uma chamada típica junto com seus resultados na docstring. Isso melhora a documentação, fornecendo ao usuário com um exemplo e permite que o módulo doctest  garantir que o código permanece fiel à documentação:

def average(values):
    """Computes the arithmetic mean of a list of numbers.

    >>> print average([20, 30, 70])
    40.0
    """
    return sum(values, 0.0) / len(values)

import doctest
doctest.testmod()   # automatically validate the embedded tests
O módulo unittest não é tão fácil como o módulo doctest, mas permite que um conjunto mais abrangente de testes sejam  mantidos em um arquivo separado:
import unittest

class TestStatisticalFunctions(unittest.TestCase):

    def test_average(self):
        self.assertEqual(average([20, 30, 70]), 40.0)
        self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
        with self.assertRaises(ZeroDivisionError):
            average([])
        with self.assertRaises(TypeError):
            average(20, 30, 70)

unittest.main() # Calling from the command line invokes all tests

10.12. Baterias Incluídas

Python tem uma filosofia “baterias incluídas”. Isto é melhor visto através das capacidades sofisticadas e robustas de seus maiores pacotes. Por exemplo:
  • Os módulos  xmlrpclib e SimpleXMLRPCServer tornam implementar chamadas de procedimento remoto em uma tarefa quase trivial. Alem dos nomes dos módulos, é necessário nenhum conhecimento direto ou manipulação de XML.
  • O pacote email é uma biblioteca para gerenciamento de mensagens de e-mail, incluindo MIME e outros documentos de mensagens baseados em RFC 2822. Ao contrário do smtplib e poplib que realmente enviam e recebem mensagens, o pacote email tem um conjunto de ferramentas completo para a construção ou a decodificação de mensagens de complexas estruturas (incluindo anexos) e para a implementação de protocolos de codificação de internet e de cabeçalho.
  • Os pacotes xml.dom e xml.sax fornecem suporte robusto para analisar este formato de intercâmbio de dados popular. Da mesma forma, o módulo csv suporta leitura e gravaço diretas em um formato de banco de dados comum. Juntos, estes módulos e pacotes de simplificam grandemente o intercâmbio de dados entre aplicações Python e outras ferramentas.
  • Internacionalização é apoiado por uma série de módulos, incluindo gettextlocale, e o pacote de codecs.
Prévio Próximo