<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pythonologia, o blog da Triveos &#187; python</title>
	<atom:link href="http://blog.triveos.com.br/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.triveos.com.br</link>
	<description>Python e Django — Cursos e Desenvolvimento Web</description>
	<lastBuildDate>Tue, 24 Aug 2010 23:46:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<item>
		<title>Interface Admin do Django: um baita quebra-galho.</title>
		<link>http://blog.triveos.com.br/2010/07/02/interface-admin-do-django-um-baita-quebra-galho/</link>
		<comments>http://blog.triveos.com.br/2010/07/02/interface-admin-do-django-um-baita-quebra-galho/#comments</comments>
		<pubDate>Sat, 03 Jul 2010 00:57:42 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=645</guid>
		<description><![CDATA[Já faz algum tempo que]]></description>
			<content:encoded><![CDATA[<p>Já faz algum tempo que nós aqui na <a href="http://www.triveos.com.br/" title="Triveos — Aplicações e sistemas para Web. Especialistas Python e Django">Triveos</a> estamos usando <a href="http://www.djangoproject.com/">Django</a> e <a href="http://www.python.org/">Python</a>. Também tenho apresentado palestras e ministrado cursos de Django em vários lugares. Temos até mesmo um <a href="http://www.ludeos.com.br/store/triveos-cursos-online/">curso online de Python e Django</a> à venda em um site desenvolvido em Django.</p>
<div id="attachment_652" class="wp-caption aligncenter" style="width: 403px"><a href="http://blog.triveos.com.br/wp-content/uploads/shot-2010-07-02-at-9.20.12-PM.png"><img src="http://blog.triveos.com.br/wp-content/uploads/shot-2010-07-02-at-9.20.12-PM-393x300.png" alt="A Interface Admin do Django" title="A Interface Admin do Django" width="393" height="300" class="size-medium wp-image-652" /></a><p class="wp-caption-text">A Interface Admin do Django</p></div>
<p>Todos os programadores Django adoram falar sobre um dos grandes diferenciais desse framework: <a href="http://docs.djangoproject.com/en/dev/ref/contrib/admin/">A Interface Admin</a>.</p>
<p>Realmente, só quem desenvolve aplicações Web a bastante tempo e perdeu tempo precioso fazendo &#8220;telinhas de cadastro&#8221; sabe como essa tarefa é chata e pouco desafiadora. E todos que desenvolvem com Django agradecem a existência dessa funcionalidade.</p>
<p>A interface Admin do Django é prática, fácil de ser usada, e bonitinha. Uma mão na roda. Um baita quebra-galho. Até mesmo&#8230; mágica! A diferença entre um projeto entregue e um projeto atrasado.</p>
<p>Mas isso termina por aqui.</p>
<p>A interface de Admin do Django tem uma função clara: administrar o sistema. Tanto que ela foi feita para ser acessada só por usuários do &#8220;<a href="http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/sites.py#L136">staff</a>&#8220;.</p>
<p>Ela foi feita para que os desenvolvedores do site não percam tempo fazendo cadastros &#8220;bobinhos&#8221; que precisam ser mantidos só pelos funcionários da empresa.</p>
<p>O Django nasceu no mercado editorial e o primeiro projeto desenvolvido nele foi um gerenciador de conteúdo (CMS). A interface de Admin do Django servia (serve?) para que os editores, jornalistas, autores, etc. inserissem conteúdo nos sites dos jornais do grupo <a href="http://www2.ljworld.com/about/">The World Company</a>.</p>
<p>A interface Admin não foi feita para você desenvolver toda a sua aplicação nela. Ela é muito poderosa e até faz algumas coisas além de permitir somente a inclusão, visualização, alteração, e exclusão de conteúdo. Ela permite ordenar registros, efetuar buscas, definir ações, etc. Mas paramos por aí.</p>
<p>Funcionalidades mais elaboradas ou que precisam ser acessadas por pessoas que não fazem parte do &#8220;staff&#8221; continuam tendo o seu desenvolvimento necessário.</p>
<p>No site <a href="http://www.ludeos.com.br/" title="Cursos online - Ludeos">Ludeos</a>, que foi desenvolvido em Django, a interface Admin ainda é usada para verificar os pagamentos dos cursos, e na manutenção das lojas e produtos. O fato do Django oferecer essa funcionalidade pra gente fez a diferença entre um projeto &#8220;atrasado&#8221; e um projeto &#8220;no ar&#8221;.</p>
<p>Mas o uso da interface Admin é um fator limitante para o nosso uso do sistema. Fica claro que, para que o projeto evolua, será necessário tirar algumas dessas funcionalidades da interface de Admin.</p>
<p>Em resumo: usem a interface Admin, mas saibam que em determinado momento ela pode limitar as suas ações e, nestes casos, Django oferece outras alternativas pra te ajudar a deixar a interface Admin: <a href="http://docs.djangoproject.com/en/dev/topics/generic-views/">Generic Views</a>. Falaremos sobre elas em outra oportunidade.</p>
<blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2010, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2010/07/02/interface-admin-do-django-um-baita-quebra-galho/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Django-ZODB 0.2rc1 lançado</title>
		<link>http://blog.triveos.com.br/2010/06/08/django-zodb-0-2rc1-lancado/</link>
		<comments>http://blog.triveos.com.br/2010/06/08/django-zodb-0-2rc1-lancado/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 21:05:32 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=483</guid>
		<description><![CDATA[Post rápido pra anunciar que]]></description>
			<content:encoded><![CDATA[<p>Post rápido pra anunciar que hoje eu subi o módulo <a href="http://bit.ly/djangozodb">django-zodb-0.2rc1</a> no <a href="http://pypi.python.org/">PyPI</a>. Publiquei essa versão para que outros pythonistas que usam Django e/ou ZODB possam colaborar com o projeto.</p>
<p>A ajuda que preciso com maior urgência é para corrigir os meus erros de inglês na documentação (deve ter toneladas deles no README.rst) e completá-la (removendo os XXX). Consertando os bugs que forem aparecendo e finalizando a documentação eu já lanço a versão 0.2final. Modificações que mudem a API só entram nessa versão se forem pra corrigir erros de design.</p>
<p>Novas funcionalidades podem ser incorporadas em um branch separado. O projeto está hospedado no <a href="http://github.com/triveos/django-zodb">github</a>, portanto, isso é fácil de se fazer. Tem uma mini-lista de coisas que ainda faltam ser feitas no fim do arquivo README.</p>
<div id="attachment_485" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.triveos.com.br/wp-content/uploads/django-zodb-layout.jpg"><img src="http://blog.triveos.com.br/wp-content/uploads/django-zodb-layout-300x300.jpg" alt="Layout provisório do site do projeto Django-ZODB" title="django-zodb-layout" width="300" height="300" class="size-medium wp-image-485" /></a><p class="wp-caption-text">Layout provisório do site do projeto Django-ZODB</p></div>
<p>Já tenho um template pronto para o site do projeto mas não poderei trabalhar nisso nos próximos dias. Se alguém quiser mexer nisso é só falar comigo.</p>
<blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2010, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2010/06/08/django-zodb-0-2rc1-lancado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trabalhando com Python e Django à moda Osvaldo</title>
		<link>http://blog.triveos.com.br/2010/04/25/trabalhando-com-python-e-django/</link>
		<comments>http://blog.triveos.com.br/2010/04/25/trabalhando-com-python-e-django/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 01:45:40 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=446</guid>
		<description><![CDATA[Esse post está aqui para]]></description>
			<content:encoded><![CDATA[<p>Esse post está aqui para ser usado por mim como referência futura mas, como pode ser útil para outras pessoas vou deixá-lo público aqui no blog.</p>
<a name="wptoc_0_0_0"></a><h2>Software</h2>
<p>Trabalhei muito tempo com Linux (e alguns outros Unices) e de três anos pra cá sou mais um Apple Fanboy que usa o excelente OS X. Mas acho que boa parte das dicas aqui ainda são úteis para usuários de Linux.</p>
<ul>
<li><strong>Terminal.app</strong> &#8211; Porque Mac é máquina pra &#8216;macho&#8217; :D</li>
<li><strong>bash</strong> &#8211; Pesadão, bloat, mas não consegui me habituar com outro. É o default do OS X.</li>
<li><strong>Vim</strong> &#8211; Esse é o editor pra tudo. É difícil de aprender a usar mas é um F1. Depois que aprendemos a lidar com ele a gente voa. Uso a versão texto que acompanha o OS X.</li>
<li><strong>TextMate</strong> &#8211; Esse eu uso para o desenvolvimento &#8216;pesado&#8217;. Dá pra usar o Vim pra isso também. Mas dependendo do meu humor eu escolho o TextMate para algumas coisas.</li>
<li><strong>Rudix</strong> &#8211; O OS X não vem com tudo mas você encontra o que falta no Rudix.</li>
<li><strong>Git</strong> &#8211; Uso o git pros meus projetos mas também tenho o Mercurial, Bazaar, Subversion, &#8230; instalados para contribuir com outros projetos open-source</li>
<li><strong>virtualenv</strong> &#8211; ter um ambiente isolado para cada projeto Python onde você trabalha é muito legal. Já escrevi sobre o virtualenv <a href="/ambiente-isolado-para-python-com-virtualenv/">aqui</a>.</li>
<li><strong>pylint</strong> e <strong>pyflakes</strong> &#8211; Analisadores estáticos de código.</li>
</ul>
<a name="wptoc_0_0_1"></a><h2>Diretórios básicos</h2>
<ul>
<li><tt>$HOME/</tt>
<ul>
<li><tt>Work</tt> &#8211; Diretório onde os projetos em que trabalho ficam.</li>
<li><tt>bin</tt> &#8211; Diretório com scripts, binários estáticos, etc. Esse diretório fica no <tt>$PATH</tt></li>
</ul>
</li>
</ul>
<a name="wptoc_0_0_2"></a><h2>Configuração</h2>
<p>Sempre que eu falar sobre um arquivo de configuração específico você pode encontrá-lo no endereço: <a href="http://github.com/osantana/personal">http://github.com/osantana/personal</a>.</p>
<a name="wptoc_2_1_0"></a><h3>Os arquivos &#8216;.&#8217; (ponto)</h3>
<p><strong><tt><a href="http://github.com/osantana/personal/blob/master/profile">.profile</a></tt></strong></p>
<ul>
<li>Configurar 3 aliases: <tt>mv='mv -i'</tt> e <tt>cp='cp -i'</tt> pra evitar acidentes com arquivos sendo sobrescritos e <tt>ls='ls -G'</tt> para habilitar cores no comando <tt>ls</tt>.</li>
<li>Configurações genéricas para cores no terminal</li>
<li>Definir o <tt>vim</tt> como <tt>EDITOR</tt> padrão.</li>
<li>Definir <tt>LANG</tt> e <tt>LC_CTYPE</tt> como <tt>en_US.UTF-8</tt> para que o Mercurial e alguns outros softwares funcionem corretamente.</li>
<li>Adicionar o diretório <tt>$HOME/bin</tt> ao <tt>$PATH</tt>. Nesse diretório eu jogo todos aqueles programinhas utilitários usados no dia a dia.</li>
<li>Configurações Python:
<ul>
<li><tt>export PYTHONSTARTUP="$HOME/.pystartup.py"</tt></li>
<li><tt>source ~/bin/<a href="http://code.djangoproject.com/svn/django/trunk/extras/django_bash_completion">django_bash_completion</a></tt></li>
</ul>
</li>
<li>Configuração Java: <tt>export JAVA_HOME="/Library/Java/Home"</tt></li>
<li>Configuração Ruby: adicionar <tt>$HOME/.gem/ruby/1.8/bin</tt> ao <tt>$PATH</tt></li>
<li>Eu uso virtualenv em todos os meus projetos então crio duas funções para ativar os ambientes e entrar nos diretórios desses projetos:

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Uso: p nome_do_projeto</span>
p<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>Work<span style="color: #000000; font-weight: bold;">/</span>$<span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">*</span>
    <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-f</span> bin<span style="color: #000000; font-weight: bold;">/</span>activate <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #7a0874; font-weight: bold;">source</span> bin<span style="color: #000000; font-weight: bold;">/</span>activate
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Uso: c</span>
c<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$VIRTUAL_ENV</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$VIRTUAL_ENV</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

</li>
</ul>
<p><strong><tt><a href="http://github.com/osantana/personal/blob/master/gitconfig">.gitconfig</a></tt></strong></p>
<pre>
[user]
	name = Osvaldo Santana
	email = osantana na triveos.com
[color]
	status = auto
	diff = auto
	branch = auto
	ui = auto
	grep = auto
[alias]
	st = status
	ci = commit
	co = checkout
[merge]
	tool = opendiff
[core]
	legacyheaders = false
	excludesfile = /Users/osantana/.gitignore
    whitespace = trailing-space,space-before-tab
[apply]
    whitespace = fix
[repack]
	usedeltabaseoffset = true
[git-tmbundle]
	gitx-path = /Application/GitX.app/
[mergetool "opendiff"]
	cmd = opendiff
	trustExitCode = true
[clean]
	requireForce = false
</pre>
<p><strong><tt><a href="http://github.com/osantana/personal/blob/master/gitignore">.gitignore</a></tt></strong></p>
<pre>
.DS_Store
*.py[co]
*.tmproj
*~
*.swp*
</pre>
<p><strong><tt><a href="http://github.com/osantana/personal/blob/master/inputrc">.inputrc</a></tt></strong></p>
<p>Eu uso o modo <tt>vi</tt> também no console. Neste arquivo fica essa configuração e mais umas outras que deixam o comportamento do prompt do Mac mais parecido com o do Linux.</p>
<p>Já falei sobre essas configurações <a href="/home-end-page-up-and-page-down-configuration-for-mac-snow-leopard/">aqui no blog</a>. Use por conta e risco.</p>
<p><strong><tt><a href="http://github.com/osantana/Personal-Files/blob/master/pylintrc">.pylintrc</a></tt></strong></p>
<p>As configurações que eu uso para análise estática do código que eu produzo. Eu rodo o <tt>pylint</tt> antes de fazer o commit do meu código. Durante o desenvolvimento eu uso somente o <tt>pyflakes</tt> que é mais simples e rápido mas faz uma análise mais superficial do código. Eu costumava usar o <tt>pep8.py</tt> mas já faz um tempo que o aposentei.</p>
<p><strong><tt><a href="http://github.com/osantana/personal/blob/master/pystartup.py">.pystartup.py</a></tt></strong></p>
<p>Script executado pelo interpretador Python ao entrar no modo interativo. Eu configuro o &#8216;auto-completion&#8217; do prompt interativo do Python, gravo o histórico de comandos, etc.</p>
<p>Infelizmente ele não funciona com o Python padrão do Mac porque o mesmo não é compilado com a biblioteca readline. Mas no Linux ele (deve) funcionar certinho.</p>
<p><strong><tt><a href="http://github.com/osantana/personal/blob/master/vimrc">.vimrc</a></tt></strong></p>
<p>Esse é o meu famoso arquivo <tt>.vimrc</tt>. Ele não tem nada de muito especial.</p>
<p><strong>Outros arquivos</strong></p>
<p>Existem outros arquivos mas, nestes casos, eles contém informações privativas e não faria sentido colocar aqui pra vocês :)</p>
<a name="wptoc_0_0_3"></a><h2>Criando e Usando um projeto Python (com Django)</h2>
<p>Para exemplificar vamos criar um projeto &#8220;pythonologia&#8221;:</p>
<pre>
~ $ cd ~/Work
Work $ virtualenv --no-site-package pythonologia
New python executable in pythonologia/bin/python
Installing setuptools............done.
Work $ p pythonologia
(pythonologia) pythonologia $ easy_install django
(pythonologia) pythonologia $ django-admin.py pythonologia
(pythonologia) pythonologia $ cd pythonologia
(pythonologia) pythonologia $ git init
(pythonologia) pythonologia $ git add *.py
(pythonologia) pythonologia $ git commit -m "Initial commit"
</pre>
<p>Projeto criado e a estrutura de diretórios vai ficar mais ou menos assim:</p>
<pre>
~/Work/pythonologia
       |____ pythonologia
       |     |____ app_django1
       |      \___ app_django2
       |____ bin
       |____ include
        \___ lib
             \____ python2.6
                   |____ distutils
                    \____ site-packages
</pre>
<p>Os arquivos que não são mantidos no repositório Git ficam no diretório <tt>~/Work/pythonologia</tt> ou em um diretório <tt>~/Work/pythonologia/files</tt>. O arquivo de projeto do Textmate, por exemplo, fica em <tt>~/Work/pythonologia/pythonologia.tmproj</tt>.</p>
<p>Eu também crio um link simbólico <tt>~/Work/pythonologia/django -> ~/Work/pythonologia/lib/pythonX.X/site-package/Django-1.1.1-py2.6.egg/django</tt> para dar uma &#8216;espiada&#8217; no código do Django quando necessário.</p>
<p>Quando eu quero trabalhar num outro projeto eu faço:</p>
<pre>
(pythonologia) pythonologia $ deactivate
pythonologia $ p outro_projeto
(outro_projeto) outro_projeto $
</pre>
<p>Eu estou num diretório qualquer e quero voltar para o diretório raiz do projeto basta fazer:</p>
<pre>
(pythonologia) ~ $ c
(pythonologia) pythonologia $
</pre>
<blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2010, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2010/04/25/trabalhando-com-python-e-django/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Python ainda é pythônico?</title>
		<link>http://blog.triveos.com.br/2010/04/10/python-ainda-e-pythonico/</link>
		<comments>http://blog.triveos.com.br/2010/04/10/python-ainda-e-pythonico/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 01:04:46 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=387</guid>
		<description><![CDATA[Eu estava lendo um (longo)]]></description>
			<content:encoded><![CDATA[<p>Eu estava lendo um (longo) <a href="http://www.pragprog.com/magazines/2010-04/tangled-up-in-tools">artigo</a> que fala sobre várias coisas sobre como desenvolvíamos software no passado e como desenvolvemos hoje, etc&#8230; E num determinado momento ele fala sobre bibliotecas, frameworks e sobre um conceito denominado por ele &#8220;<em>radius of comprehension</em>&#8220;.</p>
<p>O conceito de &#8220;<em>radius of comprehension</em>&#8221; é simples: dado um determinado trecho pequeno de código, quanto de código a mais você precisa ler para entender o que ele faz. Quanto menor o &#8220;<em>radius of comprehension</em>&#8221; melhor.</p>
<p>Ao ler isso eu me lembrei de uma palestra do <a href="http://oficinas.ramgarlic.com/">Luciano Ramalho</a> onde ele fala que gosta da linguagem Python (e da idéia de algo ser &#8216;pythonico&#8217;) porque ela &#8220;cabe na cabeça&#8221; dele e acho que isso tem uma relação direta com a idéia de <em>&#8220;radius of comprehension</em>&#8220;.</p>
<p>Eu também pensava da mesma forma que o Luciano. Achava que Python &#8220;cabia&#8221; na minha cabeça. Mas hoje eu devo admitir que isso é parcialmente verdade.</p>
<p>Em primeiro lugar eu acho que a linguagem vem crescendo demais desde a versão 2.2. Adicionando funcionalidades e &#8220;acúcares sintáticos&#8221; cujos benefícios podem ser facilmente questionados.</p>
<p>Mas não vou falar muito da linguagem não. Vou falar de alguns módulos da biblioteca padrão do Python que são praticamente impossíveis de serem usadas sem ter a documentação à mão:</p>
<ul>
<li>logging &#8211; esse é o pior de todos. Não tem uma única vez que eu não preciso recorrer à documentação do módulo pra fazer algo &#8220;bobo&#8221;. Sei que um &#8220;logging.log(&#8230;)&#8221; basta para o básico, mas se você precisa de algo básico+1 você já se vê obrigado a ler toda a documentação do módulo. Acho que o problema desse módulo foi tentar copiar o log4j do mundo Java. Todos nós conhecemos o gosto por &#8220;over engineering&#8221; dos programadores Java.</li>
<li>ConfigParser &#8211; não tenho muito a dizer. Porque esse módulo precisa daqueles conceitos complicados de configurações &#8220;globais&#8221;, busca de arquivos em múltiplos diretórios, etc. Ele poderia implementar o simples e fácil e deixar as extensões para bibliotecas de terceiros.</li>
<li>email &#8211; precisei usar esse aqui uma única vez e desde então eu tremo de medo sempre que alguém me pede pra &#8220;manipular e-mails&#8221; em uma aplicação Python. Sei que manipular e-mails é complicado se considerarmos a quantidade de &#8220;variações dos padrões&#8221; existentes num serviço que tem quase a idade da Internet, mas as abstrações devem ser construídas para nos poupar desses detalhes, não?</li>
<li>xml.dom e xml.sax &#8211; eu já não gosto de XML, imagina manipular XML com essas duas bibliotecas &#8220;podres&#8221;. Se eu pego um código pra dar manutenção e esse código usa uma dessas duas bibliotecas eu triplico o valor do serviço.</li>
<li>re &#8211; neste caso eu não acho que seja muito culpa do Python, mas peça pra alguém que conheça regex mas não conheça Python explicar a diferença entre re.search() e re.match(). Ou mostre pra ele uma regex com &#8220;(?P&lt;foo&gt;.*)&#8221; significa.</li>
</ul>
<p>Além dessas tem outras que não vou me lembrar. Tem também algumas bibliotecas, módulos e frameworks no atual &#8220;eco sistema&#8221; do Python que simplesmente não entram na minha cabeça:</p>
<ul>
<li>Zope e Plone &#8211; a turma do PythonBrasil já conhece essa história. Eu tentei bem umas 3 vezes estudar essa dupla e nas 3 eu não consegui ir além de abrir a interface de administração do Zope. Mas de duas uma: ou sou burro demais ou o troço é desnecessariamente complicado. Por sorte o ZODB funciona separadamente porque esse sim é poderoso e fácil de usar.</li>
<li>Buildout &#8211; esse eu já usei basicamente pra instalar alguns programas mas é uma caixa preta completa pra mim. Não tenho certeza, mas acho que ele nasceu no (ou em função do) Zope/Plone e talvez isso explique um pouco disso. Eu não sei direito se ele é um sistema de build, um sistema pra criação de ambiente de desenvolvimento, ou se é algum sistema alienígena de IA.</li>
</ul>
<p>Eu sei que os problemas que temos que resolver hoje em dia são bem mais complexos do que os que tínhamos que resolver quando comecei a programar, mas problemas complexos não precisam de soluções que deixem transparecer essa complexidade.</p>
<blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2010, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2010/04/10/python-ainda-e-pythonico/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Textmate &#8220;Django test executator tabajara&#8221;</title>
		<link>http://blog.triveos.com.br/2010/03/29/textmate-django-test-executator-tabajara/</link>
		<comments>http://blog.triveos.com.br/2010/03/29/textmate-django-test-executator-tabajara/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 19:22:32 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=361</guid>
		<description><![CDATA[O script a seguir pode]]></description>
			<content:encoded><![CDATA[<p>O <em>script</em> a seguir pode ser usado para executar testes automatizados em uma aplicação Django a partir do Textmate.</p>
<p>Ele deve ser usado como um &#8220;command&#8221; no bundle &#8220;Python Django&#8221; do Textmate e funciona exclusivamente com o sistema de testes do próprio Django (<tt>manage.py test</tt>).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">python</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">which</span> <span style="color: #800000;">${TM_PYTHON:-python}</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #007800;">project</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$(dirname &quot;$TM_DIRECTORY&quot;)</span>&quot;</span>
<span style="color: #007800;">app</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$(basename &quot;$TM_DIRECTORY&quot;)</span>&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># virtualenv</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-x</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$project</span>/../bin/python&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
   <span style="color: #007800;">python</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$project</span>/../bin/python&quot;</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #007800;">class_filter</span>=<span style="color: #ff0000;">&quot;s/^ *class +([A-Za-z0-9_]+Test)\(.*Test.*\):/\1/p&quot;</span>
<span style="color: #007800;">test_filter</span>=<span style="color: #ff0000;">&quot;s/^ *def +(test[a-zA-Z0-9_]+) *\(self.*$/\1/p&quot;</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;&lt;html&gt;&lt;head&gt;&quot;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;&lt;title&gt;Django test results&lt;/title&gt;&quot;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;&lt;/head&gt;&lt;body&gt;&quot;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;&lt;h1&gt;Django test results&lt;/h1&gt;&quot;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${project}</span>/settings.py&quot;</span> <span style="color: #660033;">-a</span> \
     <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${project}</span>/manage.py&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;&lt;h2&gt;Test Results for: <span style="color: #007800;">$app</span>&lt;/h2&gt;&quot;</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;&lt;pre&gt;&quot;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;"># selected text test</span>
  <span style="color: #007800;">tests</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> x<span style="color: #ff0000;">&quot;<span style="color: #007800;">$TM_FILENAME</span>&quot;</span> = x<span style="color: #ff0000;">&quot;tests.py&quot;</span> <span style="color: #660033;">-a</span> \
         <span style="color: #ff0000;">&quot;<span style="color: #007800;">$TM_SELECTED_TEXT</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
      <span style="color: #007800;">classname</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span>
        <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-nE</span> <span style="color: #ff0000;">&quot;1,<span style="color: #007800;">${TM_INPUT_START_LINE}</span>p&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${TM_FILEPATH}</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span>\
        <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-nE</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$class_filter</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span>\
        <span style="color: #c20cb9; font-weight: bold;">tail</span> <span style="color: #660033;">-1</span>
      <span style="color: #7a0874; font-weight: bold;">&#41;</span>
      <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$TM_SELECTED_TEXT</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> l; <span style="color: #000000; font-weight: bold;">do</span>
        <span style="color: #007800;">class_parse</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$l</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-nE</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$class_filter</span>&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$class_parse</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #007800;">classname</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$class_parse</span>&quot;</span>
        <span style="color: #007800;">test_parse</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$l</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-nE</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$test_filter</span>&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$test_parse</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$app</span>.<span style="color: #007800;">$classname</span>.<span style="color: #007800;">$test_parse</span>&quot;</span>
      <span style="color: #000000; font-weight: bold;">done</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
  <span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
  <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-z</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$tests</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #007800;">tests</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$app</span>&quot;</span>
  <span style="color: #007800;">$python</span> <span style="color: #007800;">$project</span><span style="color: #000000; font-weight: bold;">/</span>manage.py <span style="color: #7a0874; font-weight: bold;">test</span> <span style="color: #007800;">$tests</span>
  <span style="color: #666666; font-style: italic;"># I don't have time to &quot;fight&quot; against wordpress</span>
  <span style="color: #666666; font-style: italic;"># echo &quot;CLOSE_pre_tag&quot;</span>
<span style="color: #000000; font-weight: bold;">else</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;&lt;p style=<span style="color: #000099; font-weight: bold;">\&quot;</span>color:red;<span style="color: #000099; font-weight: bold;">\&quot;</span>&gt;Error: Django App expected.&lt;/p&gt;&quot;</span>
<span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #666666; font-style: italic;"># Again, I don't have time to &quot;fight&quot; against wordpress</span>
<span style="color: #666666; font-style: italic;"># echo &quot;CLOSE_body_tag CLOSE_html_tag&quot;&quot;</span></pre></div></div>

<ul>
<li>Este comando requer que o Bundle &#8220;Python Django&#8221; esteja instalado. Existe uma versão no repositório do próprio Textmate e uma versão atualizada no <a href="http://bitbucket.org/bkerr/django-textmate-bundles/wiki/Home">bitbucket</a>.</li>
<li>Acione &#8220;Bundles->Bundle Editor->Show Bundle Editor&#8221;.</li>
<li>Selecione &#8220;Python Django&#8221; e clique no botão &#8220;+ New Command&#8221;.</li>
<li>Escolha um nome para o comando. Aqui eu uso &#8220;Run App Tests&#8221;.</li>
<li>Configure as opções do comando conforme abaixo:
<ul>
<li><strong>Save:</strong> All files in Project</li>
<li><strong>Commands:</strong> <em>O script acima</em></li>
<li><strong>Input:</strong> None</li>
<li><strong>Output:</strong> Show as HTML</li>
<li><strong>Activation:</strong> Key Equivalent <tt>⌃⌥⌘R</tt></li>
<li><strong>Scope Selector:</strong> source.python.django</li>
</ul>
</li>
</ul>
<a name="wptoc_0_0_0"></a><h2>Modo de usar</h2>
<ul>
<li>O comando é acionado com as teclas <tt>⌃⌥⌘R</tt>.</li>
<li>O comando executa apenas os testes da aplicação à qual o arquivo que você está editando pertence.</li>
<li>Por padrão o comando executará todos os testes da aplicação.</li>
<li>Se você selecionar o os testes que você quer executar no arquivo <tt>django_app/tests.py</tt> o comando executará apenas esses testes.</li>
<li>O comando tem um suporte básico para usuários do <tt>virtualenv</tt>. Para que o comando use o virtualenv é necessário estruturar os seus diretórios da seguinte maneira: <tt>virtualenv_root/django_project/django_app</tt>. Isso é necessário para que o comando encontre o interpretador <tt>virtualenv_root/bin/python</tt>.</li>
</ul>
<p></body></html></pre>
<blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2010, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2010/03/29/textmate-django-test-executator-tabajara/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Treinamento Python e Django</title>
		<link>http://blog.triveos.com.br/2009/12/02/treinamento-python-e-django/</link>
		<comments>http://blog.triveos.com.br/2009/12/02/treinamento-python-e-django/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 14:13:36 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=346</guid>
		<description><![CDATA[Atualização Importante: No dia 11]]></description>
			<content:encoded><![CDATA[<p><strong>Atualização Importante:</strong></p>
<blockquote><p>
No dia 11 de junho a <a href="http://www.triveos.com.br/" title="Cursos e Desenvolvimento Web em Python e Django">Triveos Tecnologia</a> iniciou a pré-venda da versão online do curso &#8220;<a href="http://ludeos.com.br/store/triveos-cursos-online/python-e-django/">Desenvolvimento Web com Python e Django</a>&#8220;. O curso completo será composto por quatro módulos e o primeiro já está disponível para quem adquirir o curso agora.</p>
<p>A promoção de pré-venda dá 20% de desconto e o curso sai por R$ 200,00 (ou em 12x R$19,00 no cartão). Os cursos estão hospedados na plataforma <a href="http://www.ludeos.com.br/" title="Ludeos — Plataforma para cursos online">Ludeos</a> e os pagamentos podem ser feitos com débito em conta, cartão de crédito ou boleto bancário através do <a href="http://pagseguro.uol.com.br/">PagSeguro</a>.
</p></blockquote>
<p>A <a href="http://www.triveos.com.br/">Triveos</a> está lançando o seu treinamento de <a href="http://triveos.com.br/python-and-django/" title="Desenvolvimento Web Ágil com Python e Django – Aprenda Python e Django em apenas 5 dias!">Desenvolvimento Web Ágil com Python e Django</a> e por isso pega carona nesse conceituado blog (que por coincidência é um dos sócios da Triveos) para anunciar este lançamento.</p>
<p><a href="http://www.triveos.com.br/python-and-django/" title="Desenvolvimento Web Ágil com Python e Django – Aprenda Python e Django em apenas 5 dias!"><img src="http://blog.triveos.com.br/wp-content/uploads/trein_pydjango_small.png" alt="Imagem ilustrativa do treinamento com a apostila e o texto 'Aprenda Python e Django em apenas 5 dias'" width="374" height="240" class="aligncenter size-full wp-image-347" /></a></p>
<p>Eu não costumo fazer esse tipo de <em>post</em> (jabá) por aqui mas este é um caso especial por dois motivos: o produto anunciado foi criado pela minha empresa (como eu já havia dito); e porque que até o momento são poucas as empresas que ministram esse curso no Brasil.</p>
<p>Esse treinamento é o primeiro entre muitos que planejamos desenvolver no próximo ano sempre com algumas características:</p>
<ul>
<li>treinamentos <em>in-company</em> — isso nos dá mobilidade e permite que o treinamento seja ministrado em qualquer lugar do Brasil e não somente no eixo Rio-São Paulo.</li>
<li>treinamentos de curta duração — achamos que tecnologias precisam ser simples e que se elas forem realmente simples não seria necessário investir meses num treinamento. O treinamento de Python e Django precisa de 5 dias apenas para ser ministrado com grande tranquilidade para pessoas que já desenvolvem em alguma linguagem OO.</li>
<li>treinamentos personalizáveis — a linha principal do treinamento é mantida mas algumas modificações podem ser feitas para adequar o treinamento aos requisitos das empresas. Exemplos: dedicar um tempo do treinamento à implantação do Django, apresentar alguma biblioteca Javascript para desenvolvimento de RIAs, ministrar só o módulo Django, etc.</li>
<li>materiais de qualidade — nada de apostilas contendo só slides impressos. Disponibilização de todo o material usado em aula (Slides, repositório de códigos, etc).</li>
<li>instrutores qualificados — não posso falar muito mais sobre isso. Sou um dos instrutores :D</li>
</ul>
<p>Quem tiver interesse no treinamento pode entrar em contato com a gente através do <a href="http://triveos.com.br/contact/" title="contate-nos!">site</a> ou diretamente comigo.</p>
<p><strong>Update:</strong> Pessoal, não tinha ficado claro mas, a Triveos só trabalha com treinamentos <em>in-company</em>, ou seja, não temos infra-estrutura para ministrar esse treinamento em nossa empresa. Fazemos isso dentro da sua empresa (ou da empresa onde você trabalha). De qualquer maneira estamos avaliando um modo de atender às demandas que estão surgindo.</p>
<blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2009, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2009/12/02/treinamento-python-e-django/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>PythonBrasil [5]</title>
		<link>http://blog.triveos.com.br/2009/07/22/pythonbrasil-5/</link>
		<comments>http://blog.triveos.com.br/2009/07/22/pythonbrasil-5/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 17:50:24 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=312</guid>
		<description><![CDATA[Os preparativos para a 5ª]]></description>
			<content:encoded><![CDATA[<div class="book"><a href="http://www.pythonbrasil.org.br/" title="PythonBrasil[5]"><br />
<img src="http://www.pythonbrasil.org.br/2009/saiba-mais/apoio-divulgue/pythonbrasil-halfbanner.gif" alt="PythonBrasil[5]" /><br />
</a></div>
<p>Os preparativos para a 5ª edição do encontro brasileiro da comunidade Python já estão a todo vapor (o evento era conhecido anteriormente como PyConBrasil).</p>
<p>A <a href="http://www.pythonbrasil.org.br/">PythonBrasil[5]</a> acontecerá em <a href="http://www.pythonbrasil.org.br/2009/programe-sua-viagem/caxias-do-sul">Caxias do Sul &#8211; RS</a> nos dias 10, 11 e 12 de setembro no campus da <a href="http://www.ucs.br/">Universidade de Caxias do Sul (UCS)</a>.</p>
<p>As <a href="http://www.pythonbrasil.org.br/2009/sobre-o-evento/inscricoes">inscrições já estão abertas</a> e é possível adquirí-los com o desconto máximo até o dia 07 de agosto. Depois disso os valores vão aumentando. Estudante, membros da Associação Python Brasil, da Abraweb e da SBC contam ainda com descontos.</p>
<p>Além das inscrições a <a href="http://www.pythonbrasil.org.br/2009/sobre-o-evento/chamada-de-trabalhos">Chamada para Trabalhos</a> também estará aberta até o dia <strong>26 de Julho (domingo agora! Não perca tempo!)</strong> para palestras e treinamentos.</p>
<p>Eu, como não podia deixar de ser, participei de todas as edições da conferência e posso dizer: é fantástico. O encontro com os amigos, as palestras surpreendentes e a interação com o público (que é fácil por conta do tamanho do evento) fazem esse evento único.</p>
<p>Gostaria de pedir pros leitores do meu blog que ajudem na divulgação do mesmo. Vocês encontrarão o material para isso no próprio <a href="http://www.pythonbrasil.org.br/2009/saiba-mais/apoio-divulgue">site</a>.</p>
<blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2009, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2009/07/22/pythonbrasil-5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dicas para um bom programa em Python</title>
		<link>http://blog.triveos.com.br/2009/03/03/dicas-para-um-bom-programa-em-python/</link>
		<comments>http://blog.triveos.com.br/2009/03/03/dicas-para-um-bom-programa-em-python/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 18:09:27 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=282</guid>
		<description><![CDATA[Oi pessoal, desta vez eu]]></description>
			<content:encoded><![CDATA[<p>Oi pessoal, desta vez eu vou pular as &#8216;desculpas&#8217; por ter demorado tanto para postar aqui no blog e vamos direto ao assunto.</p>
<p>Recentemente eu tenho trabalhado bastante com Python (dã!) desenvolvendo projetos de diversos tipos e resolvi escrever aqui sobre algumas coisas que pratico enquanto desenvolvo.</p>
<a name="wptoc_0_0_0"></a><h3>Código mais robusto</h3>
<p><strong>Deu certo ou errado?</strong></p>
<p>O que você faz quando acontece algo errado na execução do seu método? O que você responde à requisição que lhe foi feita?</p>
<p>Eu tenho visto em muito código por aí os desenvolvedores retornando valores sentinela (<tt>None</tt>, <tt>null</tt>, 0, -1, etc.) para avisar que algo incorreto aconteceu na execução do método.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> f<span style="color: black;">&#40;</span>arg<span style="color: black;">&#41;</span>:
   <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> arg:
      <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span>
   <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#91;</span> <span style="color: #483d8b;">&quot;resultado&quot;</span>, <span style="color: #483d8b;">&quot;de&quot;</span>, <span style="color: #483d8b;">&quot;um&quot;</span>, <span style="color: #483d8b;">&quot;processamento&quot;</span>  <span style="color: black;">&#93;</span></pre></div></div>

<p>Algumas linguagens de programação não possuem estruturas de tratamento de exceção e, neste caso, o uso de sentinelas é válido. Mas quando a linguagem de programação te disponibiliza essa funcionalidade é bom usá-la.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> f<span style="color: black;">&#40;</span>arg<span style="color: black;">&#41;</span>:
   <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> arg:
      <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Argumento Invalido&quot;</span><span style="color: black;">&#41;</span>
   <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#91;</span> <span style="color: #483d8b;">&quot;resultado&quot;</span>, <span style="color: #483d8b;">&quot;de&quot;</span>, <span style="color: #483d8b;">&quot;um&quot;</span>, <span style="color: #483d8b;">&quot;processamento&quot;</span>  <span style="color: black;">&#93;</span></pre></div></div>

<p><strong>Deixem as exceções fluirem.</strong></p>
<p>Isso mesmo. A menos que você saiba exatamente o que você deve fazer quando uma exceção aparece deixe-a exceção &#8220;subir&#8221;. Pode ser que &#8220;lá em cima&#8221; alguém saiba cuidar dela adequadamente.</p>
<p>Quando não fazemos isso estamos ocultando informação importante para os usuários do nosso código (sejam eles usuários, outros desenvolvedores ou nós mesmos).</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> f<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
   <span style="color: #ff7700;font-weight:bold;">try</span>:
      <span style="color: #ff7700;font-weight:bold;">return</span> conecta<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
   <span style="color: #ff7700;font-weight:bold;">except</span> ExcecaoQueDeveriaSerErro:
      <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span></pre></div></div>

<p>Quando eu implemento esse tipo de método/função eu faço assim (na verdade eu não implementaria <tt>f()</tt> e chamaria <tt>conecta()</tt>):</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> f<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
   <span style="color: #ff7700;font-weight:bold;">return</span> conecta<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p><strong>O que seu método/função retorna?</strong></p>
<p>Código que eu encontrei recentemente:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> get_fulanos<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
   q = Q<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;select * from patuleia where alcunha like 'fulano%'&quot;</span><span style="color: black;">&#41;</span>
   ret = <span style="color: black;">&#91;</span> <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>fulano<span style="color: black;">&#91;</span><span style="color: #483d8b;">'nome'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> fulano <span style="color: #ff7700;font-weight:bold;">in</span> q <span style="color: black;">&#93;</span>
   <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>ret<span style="color: black;">&#41;</span> == <span style="color: #ff4500;">1</span>:
      <span style="color: #ff7700;font-weight:bold;">return</span> ret<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
   <span style="color: #ff7700;font-weight:bold;">return</span> ret</pre></div></div>

<p>Perceberam o que está errado? O seu método retorna uma lista de Fulanos ou retorna Fulano?</p>
<p>Isso está conceitualmente errado e pode fazer você perder horas preciosas do seu dia tentando achar um bug causado por esse tipo de código.</p>
<p>Aconteceu comigo. Note que <tt>str()</tt> implementa uma interface de <em>sequence</em> da mesma forma que <tt>list()</tt>. Então o erro passa silenciosamente no caso abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">old_fulanos = <span style="color: black;">&#91;</span> <span style="color: #483d8b;">&quot;Ze Ruela&quot;</span>, <span style="color: #483d8b;">&quot;Ze Mane&quot;</span> <span style="color: black;">&#93;</span>
old_fulanos.<span style="color: black;">extend</span><span style="color: black;">&#40;</span>get_fulanos<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> old_fulanos</pre></div></div>

<p>Rodando esse código você vai obter <tt>['Ze Ruela', 'Ze Mane', 'q', 'u', 'a', 'c', 'k']</tt> sendo que, em mais de 90% dos casos, o que você gostaria de ter seria: <tt>['Ze Ruela', 'Ze Mane', 'quack']</tt>.</p>
<p><strong>&#8220;Nada&#8221; é diferente de &#8220;alguma coisa&#8221;.</strong></p>
<p>Essa dica é só uma complementação da primeira e da segunda dica.</p>
<p>Quando o seu método/função retorna uma <em>collection</em> (seqüência, conjunto, <em>hash</em>, etc) vazia você deve retorná-la vazia e não um valor sentinela (como <tt>None</tt>). Isso facilita a vida de quem vai usar o seu método/função:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> vazio<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
   <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> elemento <span style="color: #ff7700;font-weight:bold;">in</span> vazio<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
   <span style="color: #ff7700;font-weight:bold;">pass</span> <span style="color: #808080; font-style: italic;">#... faz algo se o conjunto contiver dados ...</span></pre></div></div>

<p>Se você retorna um valor sentinela:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> vazio<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
   <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span>
&nbsp;
elementos = vazio<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">if</span> elementos:
   <span style="color: #ff7700;font-weight:bold;">for</span> elemento <span style="color: #ff7700;font-weight:bold;">in</span> elementos:
      <span style="color: #ff7700;font-weight:bold;">pass</span> <span style="color: #808080; font-style: italic;"># ...</span></pre></div></div>

<p>Notou que tivemos que criar uma variável com o resultado da operação (para não precisar chamá-la duas vezes) e tratar a sentinela com um &#8220;<tt>if</tt>&#8220;? Se eu esqueço de tratar a sentinela meu programa vai quebrar.</p>
<p>Lembre-se sempre que uma <em>collection</em> vazia tem valor booleano &#8220;<tt>False</tt>&#8220;.</p>
<p><strong>Todo &#8216;<tt>elif</tt>&#8216; tem um irmão &#8216;<tt>else</tt>&#8216;.</strong></p>
<p>Sempre que você precisar usar uma construção <tt>if/elif</tt> coloque uma cláusula &#8216;<tt>else</tt>&#8216;. </p>
<p>Além de usar a cláusula &#8216;<tt>else</tt>&#8216; eu geralmente faço com que ela gere uma exceção. Desta forma eu sou obrigado a trabalhar todas as possibilidades nos &#8216;<tt>if/elif</tt>&#8216; evitando ocultar uma situação que pode ser inválida.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> InvalidCommand<span style="color: black;">&#40;</span><span style="color: #008000;">Exception</span><span style="color: black;">&#41;</span>:
   <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> minihelp<span style="color: black;">&#40;</span>comando<span style="color: black;">&#41;</span>:
   <span style="color: #ff7700;font-weight:bold;">if</span> comando == <span style="color: #483d8b;">&quot;print&quot;</span>:
      <span style="color: #ff7700;font-weight:bold;">return</span> u<span style="color: #483d8b;">&quot;&quot;&quot;Imprime dados na tela.
                 Deixará de ser comando no Python 3.0&quot;&quot;&quot;</span>
   <span style="color: #ff7700;font-weight:bold;">elif</span> comando == <span style="color: #483d8b;">&quot;assert&quot;</span>:
      <span style="color: #ff7700;font-weight:bold;">return</span> u<span style="color: #483d8b;">&quot;&quot;&quot;Certifica se uma condição é
               verdadeira e gera uma excessão em caso contrário&quot;&quot;&quot;</span>
   <span style="color: #ff7700;font-weight:bold;">elif</span> comando == <span style="color: #483d8b;">&quot;...&quot;</span>:
      <span style="color: #ff7700;font-weight:bold;">pass</span> <span style="color: #808080; font-style: italic;"># ...</span>
   <span style="color: #ff7700;font-weight:bold;">else</span>:
      <span style="color: #ff7700;font-weight:bold;">raise</span> InvalidCommand<span style="color: black;">&#40;</span>u<span style="color: #483d8b;">&quot;Comando %s inválido.&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>comando,<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Eu gosto dessa prática mas isso não significa que você deva seguí-la sempre. Existem situações onde ter um &#8220;valor <em>default</em>&#8221; é necessário e nestes casos o uso do <tt>else</tt> sem levantar exceção se faz necessário.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">if</span> comando == <span style="color: #483d8b;">&quot;if&quot;</span>:
   <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Vai usar elif?&quot;</span>
<span style="color: #ff7700;font-weight:bold;">elif</span> comando == <span style="color: #483d8b;">&quot;elif&quot;</span>:
   <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Muito bem. Agora falta o else&quot;</span>
<span style="color: #ff7700;font-weight:bold;">else</span>:
   <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Pronto. Agora está bom.&quot;</span></pre></div></div>

<a name="wptoc_0_0_1"></a><h3>&#8220;Pythonismos&#8221;</h3>
<p><strong>Use mais atributos públicos do que atributos protegidos (&#8220;<tt>_</tt>&#8220;).</strong></p>
<p>Programadores acostumados com Java utilizam muito as cláusulas &#8216;<tt>private</tt>&#8216; e &#8216;<tt>protected</tt>&#8216; para encapsular os atributos de um objeto para logo depois implementarem os <em>getters</em> e <em>setters</em> para acessar esses atributos.</p>
<p>Essa prática é aconselhada em Java porque em algum momento do futuro você, talvez, precise validar esses dados ou retornar valores calculados. Nestes casos os programadores apenas implementam essa lógica nos métodos que acessam o atributo privado.</p>
<p>Mas em Python isso não é necessário. Em Python você pode transformar seu atributo público em uma &#8220;<em>property</em>&#8221; que não muda a forma de se acessar o atributo e permite o acrescimo de lógica ao acesso do mesmo.</p>
<p><strong>Evite usar &#8220;<tt>__</tt>&#8220;.</strong></p>
<p>Por convenção, em Python, todo método ou atributo iniciado com um &#8220;<tt>_</tt>&#8221; é considerado privado (equivalente ao <tt>protected</tt> em Java) e não deve ser acessado de fora da classe mesmo sendo possível fazê-lo.</p>
<p>Dito isso parece meio óbvio que não precisamos usar &#8220;<tt>__</tt>&#8221; para dificultar ainda mais o acesso à esse atributo/método. Além disso o uso do &#8220;<tt>__</tt>&#8221; traz alguns incoveninentes para quem quer derivar a sua classe e acessar este método/atributo já que o Python o renomeia acrescentando o nome da classe ao seu nome (<tt>__attr</tt> vira <tt>_Classe__attr</tt>).</p>
<p><strong>Não sobrescreva <em>builtins</em>.</strong></p>
<p>Python disponibiliza várias funções e classes builtins que facilitam muito o uso da linguagem e economizam digitação. Mas esses builtins tem nomes muito &#8220;comuns&#8221; e frequentemente a gente usa os nomes dos builtins como nomes de identificadores. Eu mesmo vivo (vivia) fazendo isso.</p>
<p>O problema é que em certos momentos alguns problemas podem acontecer quando você tenta chamar um buitin que já não é mais um builtin. Na maioria das vezes o problema &#8220;explode&#8221; logo e você rapidamente conserta mas em alguns casos você pode perder muitas horas tentando achá-lo.</p>
<p>Algumas pessoas usam um &#8220;_&#8221; no fim do nome do identificador (ex. &#8220;id&#8221; vira &#8220;id_&#8221;) mas eu acho isso um pouco feio então uso só quando não encontro uma alternativa melhor.</p>
<p>Vou colocar aqui uma tabela de equivalências que eu costumo usar para substituir o nome dos <em>builtins</em> mais comumente sobrescritos:</p>
<ul>
<li><strong>id</strong> &#8211; ident, key</li>
<li><strong>type</strong> &#8211; kind, format</li>
<li><strong>object</strong> &#8211; obj</li>
<li><strong>list</strong> &#8211; plural (lista de <tt>element</tt> vira <tt>elements</tt>)</li>
<li><strong>file</strong> &#8211; fd, file_handler</li>
<li><strong>dict</strong> &#8211; dic, hashmap</li>
<li><strong>str</strong> &#8211; text, msg</li>
</ul>
<p><strong>Análise estática economiza seu tempo.</strong></p>
<p>Eu uso o <a href="http://www.logilab.org/857">pylint</a>, mas conheço algumas pessoas que preferem o <a href="http://divmod.org/trac/wiki/DivmodPyflakes">pyflakes</a> ou o <a href="http://pychecker.sourceforge.net/">PyChecker</a>.</p>
<p>A dica é essa: usar um programinha de análise estática como esses pode diminuir consideravelmente aqueles errinhos chatos de sintaxe, ou de digitação. Pode limpar os &#8216;import&#8217; desnecessários do seu software, etc, etc.</p>
<p>É lógico que esse tipo de ferramenta não substitui uma boa política de testes mas é um bom complemento para ela.</p>
<a name="wptoc_0_0_2"></a><h3><em>Challenge yourself</em></h3>
<p><strong>Máximo de 3 níveis de indentação. (ou 4 se estiver dentro de uma classe)</strong></p>
<p>Ao se esforçar para que seu código não fique muito aninhado você está trabalhando melhor a implementação dos seus métodos e funções. Nem sempre é possível (ou aconselhável) restringir tanto o nível de identação do seu código mas muitas vezes isso melhora a sua implementação.</p>
<p><strong>Máximo de 2 indireções.</strong></p>
<p>Recebeu um objeto como parâmetro? Chame apenas métodos dele e evite ao máximo chamar métodos do retorno desses objetos:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> f<span style="color: black;">&#40;</span>obj<span style="color: black;">&#41;</span>:
    obj.<span style="color: black;">metodo</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># legal!</span>
    obj.<span style="color: black;">metodo</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">outro_metodo</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># ruim!</span></pre></div></div>

<p>Quando você chama um método pra um objeto retornado por outro método você está aumentando o acoplamento entre as classes envolvidas impedindo que uma delas seja substituída (ou reimplementada) &#8216;impunemente&#8217;.</p>
<p>Essa regrinha é uma das regrinhas da <a href="http://en.wikipedia.org/wiki/Principle_of_least_knowledge">Lei de Demeter</a>.</p>
<p><strong>Máximo de 0 &#8216;<tt>if/elif/else</tt>&#8216;s.</strong></p>
<p>Polimorfismo é isso. No mundo OO ideal, perfeito e utópico praticamente não precisaríamos do comando &#8220;<tt>if</tt>&#8221; e usaríamos somente polimorfismo. Mas&#8230; como não conseguimos isso tão facilmente<a href="#footnote_oo"><sup>*</sup></a> devemos, ao menos, usar o &#8220;<tt>if</tt>&#8221; com moderação.</p>
<p><strong>Conclusão</strong></p>
<p>Esta é uma lista incompleta de dicas para programadores Python. Se futuramente eu lembrar ou aprender algo novo eu volto aqui para falar sobre o assunto.</p>
<p>Alguns desenvolvedores podem não concordar com as dicas. Neste caso eles podem enriquecer ainda mais esse texto argumentando sobre o as suas restrições no espaço para comentários.</p>
<p>Se você tiver alguma dica para compartilhar com a gente coloque nos comentários. Se ela for boa mesmo eu coloco ela no corpo principal do blog.</p>
<p><a name="footnote_oo"><sup>*</sup></a> eu mesmo só consegui fazer uma aplicação OO funcional sem usar um único <tt>if</tt>. Era uma implementação do joguinho de adivinhação de animais (aquele que pergunta &#8220;Vive na água? (s/n)&#8221;) em Smalltalk.</p>
<p><strong>Update:</strong> pequena correção sugerida pelo Francisco nos comentários: <tt>s/Classe/_Classe/</tt>.</p>
<blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2009, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2009/03/03/dicas-para-um-bom-programa-em-python/feed/</wfw:commentRss>
		<slash:comments>42</slash:comments>
		</item>
		<item>
		<title>PyConBrasil 2009 na sua cidade. O prazo está acabando!</title>
		<link>http://blog.triveos.com.br/2008/11/04/pyconbrasil-2009-na-sua-cidade/</link>
		<comments>http://blog.triveos.com.br/2008/11/04/pyconbrasil-2009-na-sua-cidade/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 03:06:18 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=265</guid>
		<description><![CDATA[Dia 10 de novembro termina]]></description>
			<content:encoded><![CDATA[<p>Dia <strong>10 de novembro</strong> termina o prazo para envio das candidaturas à cidade-sede da PyConBrasil 2009!</p>
<p>Se você mora numa cidade com uma comunidade pythônica entusiasmada, com uma boa infra-estrutura para sediar o evento e gostaria de ver reunida a &#8216;nata&#8217; do Python no Brasil (e no mundo) é a sua chance de candidatá-la para sediar a próxima edição do maior evento de Python da América Latina!</p>
<p>Para candidatar é fácil. Basta preencher um <a href="http://associacao.pythonbrasil.org/candidatura/">formulário</a> e seguir as dicas do <a href="http://associacao.pythonbrasil.org/associacao/manual-do-big-kahuna">Manual do Big Kahuna</a> que as suas chances aumentam.</p>
<p>Os critérios para escolha da cidade variam bastante entre os participantes da banca de avaliação mas parece haver um consenso de que passam por:</p>
<ol>
<li>Participação, importância do Big Kahuna na comunidade e sua capacidade de coordenação</li>
<li>Força do GruPy local</li>
<li>Disposição de ambos para trabalhar duro durante quase um ano na organização do evento</li>
<li>&#8220;Potencial pythonico&#8221; da cidade (quantos desenvolvedores python conseguiremos &#8216;converter&#8217;)</li>
<li>Infra-estrutura pro evento</li>
<li>Infra-estrutura da cidade-sede (transporte, acesso aéreo/terrestre)</li>
<li>Mais alguns outros critérios que, com certeza, esqueci&#8230;</li>
</ol>
<p>Os resultados serão divulgados no dia 25 de novembro. A banca de avaliação ainda não foi formada mas logo que tivermos mais detalhes eu aviso por aqui.</p>
<blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2008, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2008/11/04/pyconbrasil-2009-na-sua-cidade/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A Lição Final</title>
		<link>http://blog.triveos.com.br/2008/09/24/a-licao-final/</link>
		<comments>http://blog.triveos.com.br/2008/09/24/a-licao-final/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 18:55:03 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[leitura]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=195</guid>
		<description><![CDATA[Dia desses eu estava trabalhando]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=5508&#038;tipo=2&#038;isbn=8522009201 "><img src="http://blog.triveos.com.br/wp-content/uploads/5071410_thumb.jpg" alt="A Lição Final" title="A Lição Final" width="130" height="169" class="alignnone size-full wp-image-197 book" /></a></p>
<p>Dia desses eu estava trabalhando e ao olhar na barra do meu <a href="http://talk.google.com">Google Talk</a> eu vi que o <a href="http://www.artima.com/weblogs/index.jsp?blogger=guido">Guido van Rossum</a> (criador da linguagem <a href="http://www.python.org">Python</a>) havia colocado o endereço de um <a href="http://www.youtube.com/watch?v=ji5_MqicxSo">vídeo no Youtube</a>. Achei que era algum vídeo legal sobre Python e resolvi abrir.</p>
<p>Era o vídeo de uma palestra de um professor norte-americano que trabalhava na área de tecnologia de realidade virtual. Até aí nada de mais (eu sequer me interesso pelo assunto).</p>
<p>Continuei a assistir o vídeo por mais um tempo mais por &#8220;fé&#8221; na indicação do Guido do que por qualquer outra razão. Em certo momento do início da apresentação o professor, chamado Randy Paysch, mostra um Raio-X do fígado dele onde se conta 10 tumores e ele diz que tem entre 3 e 6 meses de vida.</p>
<p>Ele então começa a falar sobre sonhos e sobre como realizá-los. Sua habilidade como orador é invejável. Continuo assistindo a palestra. Me emociono.</p>
<p>Semanas depois leio na revista Época que esse vídeo havia se tornado uma febre no Youtube e que o professor Pausch estava preparando um livro com o conteúdo dessa mesma palestra juntamente com um amigo. Pensei (me esquecendo que o cara estava condenado à morte): pronto, mais um livro de auto-ajuda que vai deixar o autor rico.</p>
<p>A algumas semanas atrás fiquei sabendo que o professor faleceu e em uma de minhas passeadas em livrarias pude ver que uma tradução do livro já estava disponível no Brasil. Voltando do Rio de Janeiro, onde havia participado da <a href="http://www.pyconbrasil.com.br">PyConBrasil 2008</a>, resolvi comprar o livro pra ler durante a viagem de volta.</p>
<p><strong>A coincidência</strong></p>
<p>Lendo o capítulo &#8220;24. O tolo que se redimiu&#8221;, onde o professor conta a história de um de seus alunos (chamado Tommy) que era fã de <a href="http://www.starwars.com/">Guerra nas Estrelas</a> e sonhava em trabalhar na produção dos filmes da saga,  eu esbarro no seguinte trecho (página 135):</p>
<blockquote><p>
Quando me transferi para a Carnegie Mellon, todos os membros da equipe da Universidade da Virgínia me acompanharam &#8212; menos Tommy. Ele não podia se mudar. Por quê? Porque fora contratado pela Industrial Light &#038; Magic, a companhia do produtor/diretor George Lucas. E note-se que ele foi contratado não por causa do seu sonho, mas sim por suas habilidades. No período em que participou do nosso grupo de pesquisa, Tommy se tornou um destacado programador de linguagem <strong>Python</strong> (<em>grifo meu</em>), por sorte dele a linguagem escolhida pela empresa de Lucas. E sorte mesmo é quando o preparo se une à oportunidade.
</p></blockquote>
<p>Não é coincidência? Eu conheço o cara através do criador do Python e voltando de uma conferência de Python eu leio que um dos alunos do cara realizou o sonho de trabalhar na <a href="http://www.ilm.com/">Industrial Light &#038; Magic</a> porque conhecia Python.</p>
<p><strong>O livro</strong></p>
<p>No geral o livro é um complemento ao vídeo e foi escrito, segundo o autor, como uma forma de deixar uma mensagem para os seus filhos.</p>
<p>Seria um típico livro de auto-ajuda se não fosse a biografia de um professor que deixou uma mensagem muito bonita para sua família pouco antes de morrer. É um livro onde se encontra muitos &#8220;clichês&#8221;, muitos momentos piegas e que muitas vezes emociona o leitor (principalmente aqueles que já são pais).</p>
<p>Ele tem uma encadernação muito bonita com capa dura e um tamanho reduzido que o torna excelente para presentear os amigos. Por se tratar de um livro barato cuja leitura é muito rápida (li ele em 1 dia) eu recomendo a todos que tem seus sonhos e gostariam de realizá-los. Mais ainda àqueles que tem filhos.</p>
<p><strong>Para comprar:</strong></p>
<p>Submarino (mais barato no momento em que faço esse <em>post</em>)</p>
<ul>
<li><a title="A Lição Final - Randy Pausch (ISBN 8522009201)" href="http://afiliados.submarino.com.br/books_productdetails.asp?Query=ProductPage&#038;ProdTypeId=1&#038;ProdId=21352874&#038;ST=SE&#038;franq=173063">A Lição Final</a></li>
<li><a title="A Lição Final (audio book) - Randy Pausch (ISBN 8561559152)" href="http://afiliados.submarino.com.br/books_productdetails.asp?Query=ProductPage&#038;ProdTypeId=1&#038;ProdId=21396651&#038;ST=SE&#038;franq=173063">A Lição Final (audiobook)</a></li>
</ul>
<p>Livraria Cultura</p>
<ul>
<li><a title="A Lição Final - Randy Pausch (ISBN 8522009201)" href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=5508&#038;tipo=2&#038;isbn=8522009201">A Lição Final</a></li>
<li><a title="A Lição Final (audio book) - Randy Pausch (ISBN 8561559152)" href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=5508&#038;tipo=2&#038;isbn=8561559152">A Lição Final (audiobook)</a></li>
</ul>
<p>Lojas Americanas (dica do <a href="http://marrcandre.blogspot.com">Prof. Marco André</a>)</p>
<ul>
<li><a title="A Lição Final - Randy Pausch (ISBN 8522009201)" href="http://www.americanas.com.br/AcomProd/1472/2512141?opn=WXNMZD">A Lição Final</a> (apenas R$9,90!)</li>
</ul>
<blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2008, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2008/09/24/a-licao-final/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
