Seleção condicional de valores

Em diversas situações, o valor a ser atribuído a uma variável, ou retornado por um método depende de uma condição. Por exemplo:

if x >= 0:
    y = 1
else:
    y = -1

O valor de y depende da condição estabelecida sobre o valor de x. O código acima pode ser representado através de uma sintaxe mais concisa e de fácil leitura:

y = 1 if x >= 0 else -1

A expressão acima poderia ser lida da seguinte forma:

O valor de y será 1 se x for maior ou igual a zero. Caso contrário, será -1.

Podemos nos aproveitar dessa sintaxe simplificada para determinar o valor de retorno de funções:

def f(x):
    return 1 if x >= 0 else -1

Esse tipo de estrutura lembra, embora seja mais legível, as expressões ternárias em C:

int func(int x)
{
    return x >= 0 ? 1 : -1;
}

 

Servidor Web em Python pela Linha de Comando

O post da vez não é muito relacionado à programação em Python, mas poderá ajudar bastante no nosso dia-a-dia. Quantas vezes precisamos compartilhar determinado arquivo com um colega, que muitas vezes está na mesma rede que a gente? Qual a solução? Realizar o compartilhamento via Samba? Copiar o arquivo com scp? Existe um jeito bem mais simples, usando um módulo que vem instalado junto com o Python, chamado SimpleHTTPServer. Nesse módulo, há uma classe chamada SimpleHTTPRequestHandler, que é responsável por servir, via HTTP, os arquivos e sub-diretórios do diretório de trabalho atual.

Na prática, significa que podemos “levantar” um servidor web que irá listar os arquivos presentes em um diretório, para que outras pessoas possam copiar arquivos. Por exemplo, queremos compartilhar os arquivos e sub-diretórios presentes no diretório /home/user/files, então podemos proceder da seguinte forma:

cd /home/user/files
python -m SimpleHTTPServer

Após isso, basta acessar, usando um navegador Web, o endereço http://localhost:8000 , pois quando chamado sem parâmetros, o serviço é iniciado na porta 8000. É óbvio que para compartilharmos arquivos com amigos, devemos passar o endereço IP de nossa máquina, e não localhost. 😛

bPython, um shell “tunado”

Em outros posts, comentei sobre o Dreampie e sobre o iPython, ambos programas para interpretação interativa de código Python. Agora chegou a vez de outra alternativa bem legal, o bPython. O bPython é bem diferente das outras opções, começando por seu estilão ncurses de mostrar as informações.

bpython

bPython completando função

Como mostra o screenshot acima, o bPython, além de completar os nomes de funções e módulos, também mostra o texto de ajuda envolto por uma caixinha, que some assim que não for mais necessária. Isso é muito mais prático do que, por exemplo, antes de chamar uma função, executar help(função) para descobrir o que faz a função e quais são seus argumentos. Além desses recursos de ajuda, o bPython oferece diversos outros recursos, que irei sumarizar a seguir:

  • rewind: permite “voltar no tempo”. Quando executado, esse recurso reavalia a última linha.
  • show source: quando F2 é pressionado após o nome de um módulo, o bPython busca e mostra o código-fonte daquele módulo.
  • pastebin: envia o código digitado pelo usuário ao pastebin, um serviço na web para armazenamento de trechos de código.
  • Destaque de sintaxe: assim como os outros programas apresentados, o bPython também colore a sintaxe do código, a medida que vai sendo digitado.
  • Salvar código: permite salvar o código digitado no shell em um arquivo no disco.
  • Auto-indentação: o bPython indenta automaticamente a próxima linha quando, por exemplo, escrevemos um cabeçalho de função, de loop for, etc.
  • Completação de nomes de arquivos: em diversas situações, é preciso que utilizemos o caminho de arquivos do disco no código Python, como por exemplo, quando vamos abrir um arquivo com a função open. O bPython completa e mostra as opções de arquivos do disco, à medida que digitamos o caminho do arquivo.

Comparado ao iPython, o bPython possui menos recursos. Mas, para quem não vai utilizar os recursos avançados que o iPython oferece, o bPython é uma excelente alternativa. Na página oficial do projeto, existe uma página que apresenta as alternativas ao bPython e, inclusive, deixa claro que os “concorrentes” podem ser mais adequados para determinados usuários. Mais um exemplo legal em um projeto de software livre.

Mais screenshots e screencasts, veja: http://bpython-interpreter.org/screenshots

iPython, muito mais que um simples shell

O iPython não é somente mais um shell Python. Apesar de servir muito bem como um simples substituto ao shell Python padrão, existe tanta coisa por trás desse projeto que é, no mínimo, injusto caracterizá-lo apenas como uma alternativa ao shell Python padrão. Além dos esperados recursos como completação de nomes de módulos/funções, o iPython fornece um rico conjunto de funcionalidades que o tornam um ambiente de desenvolvimento e experimentação único. Vou listar algumas das funcionalidades disponíveis:

  • Execução de comandos de sistema:com uma sintaxe mais simples que uma chamada a os.system(), é possível a execução de comandos no sistema. Basta preceder o comando com o caractere de exclamação(!).
    • Exemplo: !ls -l
  • Redirecionamento de saída de comandos:é possível armazenar em uma lista o resultado da execução de um comando do sistema. Para isso, basta uma atribuição simples.
    • Exemplo: arquivos = !ls
  • Funções avançadas de histórico: atalhos específicos para execução de comandos anteriormente executados.
  • Criação de aliases (apelidos) para comandos.
  • Autoindentação: ativada por padrão, é também possível desativá-la.
  • Execução de programas Python:com apenas um comando, é possível executar um arquivo Python dentro do iPython.
    • Exemplo: %run arquivo.py
  • Avaliar tempo de execução de comandos:com um simples comando, é possível “medir” o tempo de execução de trechos de código Python.
    • Ex.: %timeit print “Hello, world!” Muitas das funcionalidades aqui apresentadas não são novidade, pois podem ser obtidas através da utilização de módulos, como o timeit, no caso dessa funcionalidade. O interessante é a praticidade para utilização desses recursos dentro do iPython.
  • Console gráfico (qt): o iPython oferece um console que pode, por exemplo, apresentar imagens inline no texto do console. Assim, é possível plotar gráficos direto no shell.
  • Computação paralela: o iPython é muito utilizado para computação científica, onde é necessária a realização de tarefas que, muitas vezes, se tornam inviáveis em apenas uma máquina isolada. Para isso, a arquitetura do iPython já foi projetada visando dar suporte a execução paralela de comandos. Veja mais em: http://minrk.github.com/scipy-tutorial-2011/parallel_intro.html
  • Interface Web: também é possível acessar um ambiente iPython através de uma interface web.
  • E muito mais: para descobrir, execute o iPython e digite %quickref para ler a referência.
iPython

Tela do iPython

Na minha opinião, esse é um ambiente feito especialmente para quem passa o dia inteiro imerso em um shell Python e precisa de uma solução mais completa para facilitar o seu dia-a-dia. Excelente para a experimentação típica de quem trabalha com pesquisa científica, também pode ser muito bem aproveitado por programadores Python que desejam um shell mais completo. Recomendo!

Alternativas ao shell Python padrão

O shell padrão disponível quando instalamos Python em um sistema é um tanto quanto básico, não oferecendo recursos úteis ao desenvolvedor como completação de palavras, histórico de comandos, dentre outros recursos disponíveis através de bibliotecas como a readline. Porém, existem algumas formas de obtermos tais recursos para nosso shell, as quais serão listadas neste post. Segue uma lista das alternativas:

  1. Configurar o shell Python padrão para que, quando iniciado, carregue algumas funcionalidades da libreadline. Essa alternativa já foi coberta em um post anterior;
  2. Dreampie, um shell gráfico alternativo cheio de funcionalidades úteis, já apresentado em um post anterior;
  3. iPythonhttp://ipython.org
  4. bPythonhttp://bpython-interpreter.org
  5. Reinteracthttp://fishsoup.net/software/reinteract

Em breve, postarei textos descrevendo o iPython, o bPython e o Reinteract. Desde já, sugiro aos interessados na linguagem Python que instalem esses programas, pois possuem vários benefícios ao desenvolvedor.