Aventuras com Locale e Calendar

29jul10

Ontem estava brincando com web2py e numa certa altura do código era necessário criar uma lista com os nomes dos meses para ser uma restrição ( ver IS_IN_SET() )no campo mês de uma tabela do banco de dados.

Claro que podia simplesmente criar uma lista normalmente

['janeiro','fevereiro', ... ]

Levante a mão quem já teve problema em decorar a ordem \o

Como seria chato escrever um por um resolvi procurar na biblioteca padrão de Python algum módulo que pudesse já ter isso pronto. Já que Python tem até o módulo coffee e antigravity porque não teria algum com os meses do ano?

Procurei primeiramente em datetime mas não encontrei nada relativo aos meses do ano, por sorte eu já tinha utilizado a calendar anteriormente para saber se um ano é bisexto ( ver calendar.isleap ) e foi nela que encontrei o calendar.month_name que como a documentação revela

An array that represents the months of the year in the current locale.
This follows normal convention of January being month number 1, so it has a length of 13 and month_name[0] is the empty string.

Então vamos lá

>>> import calendar
>>> calendar.month_name
<calendar._localized_month instance at 0xb7c8952c>
>>> type(calendar.month_name)
<type 'instance'>

Ok, não criemos pânico. A documentação diz que é é um array então

>>> calendar.month_name[2]
'February'
>>> [mes for mes in calendar.month_name]
['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']

We no speak americano!

Aqui sim há um problema, os meses estão em inglês mas eu quero em português.

Como já tinha visto algo parecido com ASP.NET  The Dark Side, lembrei de dá uma olhada no módulo locale.

>>> import locale
>>> locale.getdefaultlocale()
('pt_BR', 'UTF8')
>>> locale.getlocale()
(None, None)
>>> locale._print_locale() # omiti o retorno da função
...

Realmente o problema era com o locale, na documentação encontrei a explicação para esse problema.

Initially, when a program is started, the locale is the C locale, no matter what the user’s preferred locale is. The program must explicitly say that it wants the user’s preferred locale settings by calling setlocale(LC_ALL, ”).  doc do locale

Ainda bem que ele explicou a solução, então vamos mudar.

>>> locale.setlocale(locale.LC_ALL,'')
>>> [mes for mes in calendar.month_name]
['', 'janeiro', 'fevereiro', 'mar\xc3\xa7o', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro']

Finalizando ficou assim

>>> [mes.capitalize() for mes in calendar.month_name if mes]
['Janeiro', 'Fevereiro', 'Mar\xc3\xa7o', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro']
Anúncios


No Responses Yet to “Aventuras com Locale e Calendar”

  1. Deixe um comentário

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s


%d blogueiros gostam disto: