<?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>CODARE &#187; Osvaldo Santana</title>
	<atom:link href="http://codare.net/author/osantana/feed/" rel="self" type="application/rss+xml" />
	<link>http://codare.net</link>
	<description>Programadores, uni-vos!</description>
	<lastBuildDate>Fri, 03 Dec 2010 21:34:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Python: Pegadinhas com += e list.extend()</title>
		<link>http://codare.net/2007/05/14/python-pegadinhas-com-e-listextend/</link>
		<comments>http://codare.net/2007/05/14/python-pegadinhas-com-e-listextend/#comments</comments>
		<pubDate>Mon, 14 May 2007 12:30:52 +0000</pubDate>
		<dc:creator>Osvaldo Santana</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://codare.net/2007/05/14/python-pegadinhas-com-e-listextend/</guid>
		<description><![CDATA[Palavras-chave: Python, pegadinhas, gotchas, pitfalls, listas, extends Em Python o operador de soma e atribuição += pode ser usado na forma &#8220;a += 1&#8221; que tem o mesmo significado que a expressão &#8220;a = a + 1&#8220;. Até aí nada &#8230; <a href="http://codare.net/2007/05/14/python-pegadinhas-com-e-listextend/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Python, pegadinhas, gotchas, pitfalls, listas, extends</p>
<p>Em Python o operador de soma e atribuição <tt>+=</tt> pode ser usado na forma &#8220;<tt>a += 1</tt>&#8221; que tem o mesmo significado que a expressão &#8220;<tt>a = a + 1</tt>&#8220;.</p>
<p>Até aí nada de diferente. Mas a linguagem Python disponibiliza uma função própria para tratar o operador <tt>+=</tt> (<tt>__iadd__</tt>) e outra para o operador de adição <tt>+</tt> (<tt>__add__</tt>). Na maioria das vezes o método <tt>__iadd__</tt> chama <tt>__add__</tt> e tudo fica certo. Mas não é isso que acontece com as listas.</p>
<p>Nos objetos do tipo <tt>list</tt> o método <tt>.__iadd__()</tt> irá chamar o método <tt>.extend()</tt> da lista. Desta forma podemos fazer coisas como:</p>
<pre>
&gt;&gt;&gt; a = [1,2,3]
&gt;&gt;&gt; a += [4,5,6]
&gt;&gt;&gt; a
[1, 2, 3, 4, 5, 6]
&gt;&gt;&gt; a.extend([7,8,9])
&gt;&gt;&gt; a
[1, 2, 3, 4, 5, 6, 7, 8, 9]
&gt;&gt;&gt; a = [1,2,3]
&gt;&gt;&gt; a + [4,5,6]
[1, 2, 3, 4, 5, 6]
</pre>
<p>As coisas começam a ficar complicadas quando temos uma situação que envolve strings, como no caso seguinte. Lembre-se que strings também são consideradas seqüências em Python.</p>
<pre>
&gt;&gt;&gt; a = [1,2,3]
&gt;&gt;&gt; a + "spam"
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in &lt;module&gt;
  TypeError: can only concatenate list (not "str") to list
&gt;&gt;&gt; a += "spam"
&gt;&gt;&gt; a
[1, 2, 3, 's', 'p', 'a', 'm']
&gt;&gt;&gt; a.extend("eggs")
&gt;&gt;&gt; a
[1, 2, 3, 's', 'p', 'a', 'm', 'e', 'g', 'g', 's']
</pre>
<p>Os exemplos acima deixam claro que é preciso tomar cuidado com esse tipo de situação em seus programas.</p>
<p>Alguns argumentam que esse comportamento da lista não é muito consistente e que esse &#8220;problema&#8221; deveria ser consertado. Mas existe um outro grupo que diz que esso é o comportamento correto. Até que esses grupos entrem num acordo é bom ficarmos de olho.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/05/14/python-pegadinhas-com-e-listextend/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Python: Singleton</title>
		<link>http://codare.net/2007/05/03/python-singleton/</link>
		<comments>http://codare.net/2007/05/03/python-singleton/#comments</comments>
		<pubDate>Thu, 03 May 2007 12:00:18 +0000</pubDate>
		<dc:creator>Osvaldo Santana</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://codare.net/2007/05/03/python-singleton/</guid>
		<description><![CDATA[Palavras-chave: Python, Design Patterns, Padrões de Projeto, OOP, POO Um Singleton é um dos padrões de projeto descrito no famoso livro &#8220;Design Patterns&#8221; escrito pela GoF (Gang of Four) e o seu funcionamento é bastante simples: uma classe é chamada &#8230; <a href="http://codare.net/2007/05/03/python-singleton/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Python, Design Patterns, Padrões de Projeto, OOP, POO</p>
<p>Um <em>Singleton</em> é um dos padrões de projeto descrito no famoso livro &#8220;Design Patterns&#8221; escrito pela GoF (<em>Gang of Four</em>) e o seu funcionamento é bastante simples: uma classe é chamada de Singleton quando ela permite apenas uma única instância.</p>
<p>A maneira de se implementar um Singleton descrita no livro consiste em definir um método <tt>get_instance()</tt> na classe que ficará responsável por criar a primeira instância e a partir daí retorná-la sempre que for chamada.</p>
<p>Mas a natureza dinâmica de Python e seu sistema de meta-classes permitem que se crie uma classe chamada Singleton genérica que podemos usar como super-classe dos nossos próprios Singletons:</p>
<pre>
class Singleton(object):
   def __new__(cls, *args, **kwargs):
      if '_inst' not in vars(cls):
         cls._inst = type.__new__(cls, *args, **kwargs)
      return cls._inst
</pre>
<p>Agora, para que a sua classe se transforme em Singleton basta apenas derivá-la desta classe e não é mais necessário implementar o método <tt>get_instance()</tt>. O seu uso ficaria assim:</p>
<pre>
class MeuSingleton(Singleton):
   pass

a = MeuSingleton()
b = MeuSingleton()

print a is b # imprimirá True, pois trata-se da mesma instância
</pre>
<p>Essa dica faz parte do livro Python Cookbook e foi escrita por Jürgen Hermann. No livro você poderá encontrar as explicações detalhadas sobre essa classe e mais uma série de outras dicas interessantes sobre diversos assuntos.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/05/03/python-singleton/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Python: Cópia &quot;rasa&quot; de listas</title>
		<link>http://codare.net/2007/04/04/python-copia-rasa-de-listas/</link>
		<comments>http://codare.net/2007/04/04/python-copia-rasa-de-listas/#comments</comments>
		<pubDate>Wed, 04 Apr 2007 12:00:01 +0000</pubDate>
		<dc:creator>Osvaldo Santana</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://codare.net/2007/04/04/python-copia-rasa-de-listas/</guid>
		<description><![CDATA[Palavras-chave: Python, listas, cópia, objetos Em Python as variáveis não armazenam os objetos quando atribuímos um valor à elas. Ao invés disso uma variável em Python guarda apenas uma referência para o objeto em questão. Uma prova disto pode ser &#8230; <a href="http://codare.net/2007/04/04/python-copia-rasa-de-listas/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Python, listas, cópia, objetos</p>
<p>Em Python as variáveis não armazenam os objetos quando atribuímos um valor à elas. Ao invés disso uma variável em Python guarda apenas uma referência para o objeto em questão. Uma prova disto pode ser vista a seguir:</p>
<pre class="brush: python; title: ;">
&gt;&gt;&gt; a = [1,2,3]
&gt;&gt;&gt; b = a
&gt;&gt;&gt; b is a
True
&gt;&gt;&gt; a.append(4)
&gt;&gt;&gt; b
[1, 2, 3, 4]
</pre>
<p>Por essa razão precisamos fazer cópias dos objetos quando queremos manipular os dados de uma das variáveis sem afetar os dados da outra.</p>
<p>A biblioteca Python disponibiliza o módulo <tt>copy</tt> para essa tarefa, mas em casos de listas (ou qualquer outra seqüência como strings e tuplas) existe uma maneira mais simples de se fazer isso: utilizando <em>slicing</em>, veja:</p>
<pre>
&gt;&gt;&gt; a = [1,2,3]
&gt;&gt;&gt; b = a[:]
&gt;&gt;&gt; a is b
False
&gt;&gt;&gt; a.append(4)
&gt;&gt;&gt; b
[1, 2, 3]
&gt;&gt;&gt; a
[1, 2, 3, 4]
</pre>
<p>A operação de <em>slicing</em> retornou uma cópia idêntica da lista porque <tt>a[:]</tt> é o mesmo que <tt>a[0:len(a)]</tt>. Vale lembrar, porém, que apenas a lista é copiada e não os objetos que estão dentro dela.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/04/04/python-copia-rasa-de-listas/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Python: Desligando o prompt de comandos no Windows</title>
		<link>http://codare.net/2007/03/28/python-desligando-o-prompt-de-comandos-no-windows/</link>
		<comments>http://codare.net/2007/03/28/python-desligando-o-prompt-de-comandos-no-windows/#comments</comments>
		<pubDate>Wed, 28 Mar 2007 12:00:10 +0000</pubDate>
		<dc:creator>Osvaldo Santana</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://codare.net/2007/03/28/python-desligando-o-prompt-de-comandos-no-windows/</guid>
		<description><![CDATA[Palavras-chave: Python, command prompt, prompt de comandos, prompt, DOS, Windows Quando executamos um programa &#8220;.py&#8221; no Windows uma janela de prompt irá aparecer automaticamente para que as eventuais saídas de texto do seu programa sejam enviadas para lá. Mas essa &#8230; <a href="http://codare.net/2007/03/28/python-desligando-o-prompt-de-comandos-no-windows/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Python, command prompt, prompt de comandos, prompt, DOS, Windows</p>
<p>Quando executamos um programa &#8220;<tt>.py</tt>&#8221; no Windows uma janela de <em>prompt</em> irá aparecer automaticamente para que as eventuais saídas de texto do seu programa sejam enviadas para lá.</p>
<p>Mas essa janela pode se tornar incoveniente quando o nosso programa já provê uma interface gráfica pois, neste caso, teríamos duas janelas abertas para a mesma aplicação.</p>
<p>A janela aparece porque a extensão &#8220;<tt>.py</tt>&#8221; está associada ao interpretador &#8220;<tt>X:\PythonXX\<strong>python.exe</strong></tt>&#8221; que está configurado para abrir uma janela de <em>prompt</em>.</p>
<p>Caso você precise executar seu programa sem essa janela é melhor usar o interpretador &#8220;<tt>X:\PythonXX\<strong>pythonw.exe</strong></tt>&#8221; que é feito justamente para esse propósito.</p>
<p>A extensão &#8220;<tt>.pyw</tt>&#8221; é associada à esse interpretador, portanto, basta renomear os seus arquivos <tt>.py</tt>, <tt>.pyc</tt> e <tt>.pyo</tt> para <tt>.pyw</tt> que as janelas de <em>prompt</em> deixarão de aparecer.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/03/28/python-desligando-o-prompt-de-comandos-no-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python: Fazer switch/case com dicionários</title>
		<link>http://codare.net/2007/03/22/python-fazer-switch-case-com-dicionarios/</link>
		<comments>http://codare.net/2007/03/22/python-fazer-switch-case-com-dicionarios/#comments</comments>
		<pubDate>Thu, 22 Mar 2007 12:00:14 +0000</pubDate>
		<dc:creator>Osvaldo Santana</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://codare.net/2007/03/22/python-fazer-switch-case-com-dicionarios/</guid>
		<description><![CDATA[Palavras-chave: Python, dicionários, switch, case Algumas pessoas reclamam de que Python não possui uma instrução switch/case, que permite executar trechos de código dependendo do valor de uma determinada variável. Python realmente não disponibiliza essa funcionalidade, mas podemos simulá-la utilizando funções &#8230; <a href="http://codare.net/2007/03/22/python-fazer-switch-case-com-dicionarios/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Python, dicionários, switch, case</p>
<p>Algumas pessoas reclamam de que Python não possui uma instrução <tt>switch/case</tt>, que permite executar trechos de código dependendo do valor de uma determinada variável.</p>
<p>Python realmente não disponibiliza essa funcionalidade, mas podemos simulá-la utilizando funções e dicionários. Para isso basta lembrar que funções e métodos em Python também são objetos. Veja:</p>
<pre>
def func1(): print "func1"
def func2(): print "func2"
def func_default(): print "default"

switch = {
   1: func1,
   2: func2,
}

for case in range(3):
   try:
      # chamamos a funcao aqui
      switch[case]()
   except KeyError, e:
      # se nao existe, chamamos o default
      func_default()
</pre>
<p>Quando executarmos este exemplo o resultado será:</p>
<pre>
default
func1
func2
</pre>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/03/22/python-fazer-switch-case-com-dicionarios/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Python: Listagem com cores alternadas (zebra)</title>
		<link>http://codare.net/2007/03/16/python-listagem-com-cores-alternadas-zebra/</link>
		<comments>http://codare.net/2007/03/16/python-listagem-com-cores-alternadas-zebra/#comments</comments>
		<pubDate>Fri, 16 Mar 2007 12:00:17 +0000</pubDate>
		<dc:creator>Osvaldo Santana</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://codare.net/2007/03/16/python-listagem-com-cores-alternadas-zebra/</guid>
		<description><![CDATA[Palavras-chave: Python, listagem, cores, zebrado, zebra list Em aplicações Web é bastante comum exibir grandes listagens em uma página. Para facilitar a leitura dessas listagens, quase sempre utilizamos do artifício de alternar as cores de fundo das linhas exibidas. O &#8230; <a href="http://codare.net/2007/03/16/python-listagem-com-cores-alternadas-zebra/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Python, listagem, cores, zebrado, zebra list</p>
<p>Em aplicações Web é bastante comum exibir grandes listagens em uma página. Para facilitar a leitura dessas listagens, quase sempre utilizamos do artifício de alternar as cores de fundo das linhas exibidas.</p>
<p>O meu amigo Ulysses, mais uma vez (estou até pensando em deixá-lo escrevendo por aqui) deu uma dica excelente para fazer isso, veja:</p>
<pre>
cores = ["#F5F5F5", "#FFFFFF"]
for n, linha in enumerate(linhas):
   cor_fundo = cores[n % 2]
   # aqui vai o seu código...
</pre>
<p>Vou aproveitar também essa dica para embutir uma outra dica mais voltada para a &#8220;usabilidade&#8221;: a diferença de saturação entre uma cor e outra usada no exemplo acima deve ser pequena para tornar esse efeito efetivo.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/03/16/python-listagem-com-cores-alternadas-zebra/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Python: Evitando o excesso de &quot;or&quot; em condicionais</title>
		<link>http://codare.net/2007/03/09/python-evitando-o-excesso-de-or-em-condicionais/</link>
		<comments>http://codare.net/2007/03/09/python-evitando-o-excesso-de-or-em-condicionais/#comments</comments>
		<pubDate>Fri, 09 Mar 2007 12:00:05 +0000</pubDate>
		<dc:creator>Osvaldo Santana</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://codare.net/2007/03/09/python-evitando-o-excesso-de-or-em-condicionais/</guid>
		<description><![CDATA[Palavras-chave: Python, or, in, if, while, condicional, pythonico Quem está começando no mundo do desenvolvimento Python e não conhece muito a linguagem, costuma criar cláusulas condicionais muito longas utilizando o operador &#8220;or&#8221;: if a == "foo" or a == "bar" &#8230; <a href="http://codare.net/2007/03/09/python-evitando-o-excesso-de-or-em-condicionais/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: Python, or, in, if, while, condicional, pythonico</p>
<p>Quem está começando no mundo do desenvolvimento Python e não conhece muito a linguagem, costuma criar cláusulas condicionais muito longas utilizando o operador &#8220;or&#8221;:</p>
<pre>
if a == "foo" or a == "bar" or a == "baz":
   print a
</pre>
<p>Imagine o tamanho dessa cláusula quando precisar comparar o valor de &#8220;<tt>a</tt>&#8221; com muitos outros valores. Para essas situações você pode usar o operador &#8220;<tt>in</tt>&#8221; do Python que verifica se há uma ocorrência do objeto em uma lista:</p>
<pre>
if a in ["foo", "bar", "baz"]:
   print a
</pre>
<p>Ficou bem mais simples e legível, não? Esta é a maneira &#8220;pythônica&#8221; de se montar esse tipo de cláusula condicional.</p>
<p>Essa dica foi sugerida pelo meu amigo Ulysses que me atentou para o fato de que os novatos na linguagem costumam fazer esse tipo de cláusula da forma inadequada.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/03/09/python-evitando-o-excesso-de-or-em-condicionais/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Python: Documentação e testes</title>
		<link>http://codare.net/2007/02/12/python-documentacao-e-testes/</link>
		<comments>http://codare.net/2007/02/12/python-documentacao-e-testes/#comments</comments>
		<pubDate>Mon, 12 Feb 2007 13:16:37 +0000</pubDate>
		<dc:creator>Osvaldo Santana</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://codare.net/2007/02/12/documentacao-e-testes/</guid>
		<description><![CDATA[Palavras-chave: testes, unittest, docstring, documentação, testes unitários, rest, docutils Todo desenvolvedor sabe que fazer testes é superimportante e que fazer documentação também é algo que melhora a qualidade de seus produtos. Mas num primeiro momento, fazer testes é trabalhoso e &#8230; <a href="http://codare.net/2007/02/12/python-documentacao-e-testes/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: testes, unittest, docstring, documentação, testes unitários, rest, docutils</p>
<p>Todo desenvolvedor sabe que fazer testes é superimportante e que fazer documentação também é algo que melhora a qualidade de seus produtos. Mas num primeiro momento, fazer testes é trabalhoso e documentar o nosso código também costuma ser muito chato.</p>
<p>E se a gente conseguisse fazer as duas coisas ao mesmo tempo e obter bons testes e boa documentação? Com o módulo <a href="http://docs.python.org/lib/module-doctest.html">doctest</a> do Python é possível fazer isso. Veja o exemplo abaixo (que foi parcialmente tirado da documentação do módulo):</p>
<pre># -*- coding: utf-8 -*-
import doctest

def fatorial(valor):
    """fatorial(int) -&gt; int
    A função fatorial pode ser usada para calcular
    o fatorial de um número n onde n &gt; 0 vejam os exemplos::
       &gt;&gt;&gt; fatorial(15)
       1307674368000L
       &gt;&gt;&gt; fatorial(-1)
       Traceback (most recent call last):
       ...
       ValueError: valor precisa ser &gt; 0
       &gt;&gt;&gt; fatorial(15.1)
       Traceback (most recent call last):
       ...
       ValueError: valor precisa ser inteiro
    """
    if valor &lt; 0:
        raise ValueError("valor precisa ser &gt; 0")

    if not isinstance(valor, (int,long)):
        raise ValueError("valor precisa ser inteiro")

    if valor:
        return valor * fatorial(valor - 1)
    return 1

if __name__ == '__main__':
    doctest.testmod()
</pre>
<p>Agora, para rodar nossos testes basta executar esse exemplo:</p>
<pre>$ python fatorial.py -v
:
1 items passed all tests:
   3 tests in __main__.fatorial
3 tests in 2 items.
3 passed and 0 failed.
Test passed.
</pre>
<p>Além de colocar os testes dentro das <em>docstrings</em> também podemos usar arquivos texto convencionais para essa mesma finalidade. A documentação pode usar o formato ReST usado pelos utilitários <a href="http://docutils.sf.net">docutils</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/02/12/python-documentacao-e-testes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Python: Descobrir qual o diretório do usuário</title>
		<link>http://codare.net/2007/02/05/python-descobrir-qual-o-diretorio-do-usuario/</link>
		<comments>http://codare.net/2007/02/05/python-descobrir-qual-o-diretorio-do-usuario/#comments</comments>
		<pubDate>Mon, 05 Feb 2007 12:10:57 +0000</pubDate>
		<dc:creator>Osvaldo Santana</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://codare.net/2007/02/05/descobrir-qual-o-diretorio-do-usuario/</guid>
		<description><![CDATA[Palavras-chave: userdir, home, homedrive, homepath, arquivo de configuração Frequentemente precisamos guardar preferências do usuário de nossos programas em algum arquivo de configuração. Em ambientes UNIX/Linux a prática diz que esses arquivos devem ser guardados dentro do diretório $HOME e de &#8230; <a href="http://codare.net/2007/02/05/python-descobrir-qual-o-diretorio-do-usuario/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: userdir, home, homedrive, homepath, arquivo de configuração</p>
<p>Frequentemente precisamos guardar preferências do usuário de nossos programas em algum arquivo de configuração. Em ambientes UNIX/Linux a prática diz que esses arquivos devem ser guardados dentro do diretório <tt>$HOME</tt> e de preferência como um arquivo (ou diretório) oculto.</p>
<p>Mas usar a variável de ambiente <tt>$HOME</tt> para obter o diretório não é uma solução muito portável e certamente irá falhar em outros sistemas operacionais, como o Windows.</p>
<p>Para esses casos o módulo <tt>os.path</tt> disponibiliza a função <tt>expanduser()</tt> que irá substituir o símbolo <tt>~</tt> pelo caminho completo de onde devemos guardar esses os arquivos de configuração. Veja abaixo um exemplo de uso desta função:</p>
<pre>
import os.path
print os.path.expanduser("~/.arquivorc")
</pre>
<p>Rodando esse exemplo em um ambiente UNIX/Linux iremos obter algo parecido com isso:</p>
<pre>
/home/username/.arquivorc
</pre>
<p>Já em uma máquina com Windows (XP) teremos:</p>
<pre>
C:\\Documents and Settings\\username\\.arquivorc
</pre>
<p>Algumas observações:</p>
<ul>
<li>
<p>Em ambientes UNIX/Linux é possível obter o <tt>$HOME</tt> de outros usuários. Para isso basta usar <tt>expanduser("~outro_usuario")</tt>. Isso não funcionará no Windows.</li>
<li>
<p>Não existe um padrão que diga o lugar correto para guardar arquivos de configuração no Windows. O diretório sugerido aqui é aceito mas aparentemente o mais correto seria: <tt>C:\Documents and Settings\username\Application Data\meu_programa\config.ini</tt> (lembrando sempre que &#8220;Application Data&#8221; pode ter outro nome em Windows de outros idiomas).</li>
<li>
<p>A forma 100% correta para achar esse diretório no Windows envolve a procura no &#8220;<em>Registry</em>&#8221; do Windows, mas isso fugiria do escopo dessa dica.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/02/05/python-descobrir-qual-o-diretorio-do-usuario/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Python: Imprimir mensagens de erro (stderr)</title>
		<link>http://codare.net/2007/01/30/python-imprimir-mensagens-de-erro-stderr/</link>
		<comments>http://codare.net/2007/01/30/python-imprimir-mensagens-de-erro-stderr/#comments</comments>
		<pubDate>Tue, 30 Jan 2007 11:45:57 +0000</pubDate>
		<dc:creator>Osvaldo Santana</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://codare.net/2007/01/30/imprimir-mensagens-de-erro-stderr/</guid>
		<description><![CDATA[Palavras-chave: print, stdin, stdout, stderr, erro, dispositivos, entrada/saída Quando estamos fazendo um programa que roda na linha de comando e precisamos fazer com que esse programa imprima uma mensagem de erro ou alerta, é aconselhável enviar essa mensagem para a &#8230; <a href="http://codare.net/2007/01/30/python-imprimir-mensagens-de-erro-stderr/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: print, stdin, stdout, stderr, erro, dispositivos, entrada/saída</p>
<p>Quando estamos fazendo um programa que roda na linha de comando e precisamos fazer com que esse programa imprima uma mensagem de erro ou alerta, é aconselhável enviar essa mensagem para a saída de erro padrão, conhecida como <tt>STDERR</tt>.</p>
<p>A linguagem Python disponibiliza para o programador todos os dispositivos de entrada/saída padrão do sistema operacional dentro do módulo <tt>sys</tt>:</p>
<pre>
sys.stdin      Entrada padrão (STDIN)
sys.stdout     Saída padrão (STDOUT)
sys.stderr     Saída de erros (STDERR)
</pre>
</p>
<p>O comando <tt>print</tt> envia as mensagens que serão impressas no terminal para o dispositivo <tt>sys.stdout</tt>. Neste caso, como podemos enviar mensagens para a saída de erro? De duas maneiras: usando o método <tt>.write()</tt> do dispositivo ou usando o redirecionamento do comando <tt>print</tt>. Veja os exemplos:</p>
<pre>
import sys

# .write()
# Dica: lembre-se de adicionar a quebra-de-linha no final
sys.stderr.write("ERRO: mensagem de erro.\\n")

# redirecionamento
print &gt;&gt;sys.stderr, "ERRO: mensagem de erro."
</pre>
<p>A sintaxe de redirecionamento é desconhecida de muitos programadores Python, mas é bastante prática e também pode ser usada para escrita de qualquer tipo de arquivo.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/01/30/python-imprimir-mensagens-de-erro-stderr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

