Conversando no Telegram com o Mário Sérgio sobre problemas que surgem ao migrar código entre versões do Python me veio a ideia de escrever este tldr para ajudar quem precisa fazer leitura ou escrita de arquivos que contenham texto com caracteres Unicode que não estão presentes na tabela ASCII como caracteres acentuados, alfabetos diferentes do romano e emoji, através de um código que funcione em ambas versões.
No Python 2 não existe uma distinção entre byte e string, o que faz com que códigos que lidam com entrada e saída sem o devido cuidado com codificação e decodificação funcionem sem nenhum erro aparente. Mas quando ele acontece deixa muita gente perdida com mensagens deste tipo:
Algumas bibliotecas do python como a que usamos para conversar um banco SQLite são na prática um encapsulamento de um binário externo. Nestes casos precisamos que eles estejam instalados em nosso sistema operacional para que determinado pacote python funcione.
Quando isso acontece, recebemos erros como este:
ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3
Para resolver estes problemas basta instalar esta dependência externa que normalmente o sistema já reconfigura tudo para você, mas para quem trabalha múltiplas versões do python e com pyenv é preciso recompilar todas as versões do python toda vez que lembra de uma dependência externa.
Esta postagem é o resultado de um bug que me assombrou por uns três meses até conseguir isolar totalmente o erro e, por acontecer em condições muito específicas de temperatura e pressão, tomou muito tempo quebrando cabeça até perceber que o problema era este.
Um dos atributos básicos de um Model field do Django é o default que determina o valor padrão de um campo quando criamos uma instância do Model. Você pode atribuir um valor a ele ou um callable que nada mais é que uma função ou uma classe que implemente o método __call__.
Em seguida crie um arquivo python chamado setup.py alterando os valores que forem necessários:
#!/usr/bin/env python# -*- coding: utf-8 -*-fromsetuptoolsimport find_packages, setup
setup(
name='meu-pacote-python',
packages=find_packages(),
version='1.0.0',
description='Descrição curta do meu pacote',
long_description='Longa descrição do meu pacote',
author='Meu Nome',
author_email='meu@email.com',
url='https://github.com/usuario/meu-pacote-python',
install_requires=['dependencia1', 'dependencia2'],
license='MIT',
keywords=['dev', 'web'],
classifiers=[
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Natural Language :: English',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 3',
],
)
O find_packages é uma ferramenta muito boa para encontrar automaticamente os arquivos que fazem parte do seu pacote qualquer dúvida veja sua documentação clicando aqui.
Me perguntaram como realizar uma conexão ssh em um servidor para rodar o comando df -h que mostra o uso de disco da máquina. Logo depois descobri que a dúvida se estendia a como fazer isso em vários servidores.
A resposta me veio rápido na mente, e junto com ela a ideia de documentar estas coisas, o que me trouxe ao começo desta série de postagens curtas carinhosamente batizada de TLDR, que é a abreviação de Too Long Didn`t Read ou, em português, Muito longo, não li.