Função para transformar CaixaCamelo em Caixa Camelo

21 views
Skip to first unread message

Luciano Ramalho

unread,
Feb 5, 2010, 8:12:25 AM2/5/10
to Django Brasil
Deve ter uma função no Django que transforma "UmaStringAssim" em "Uma
String Assim", porque ele faz isso no Admin. Mas eu passei meia hora
vasculhando o código-fonte do Django 1.1 e não achei.

Em menos de meia hora eu poderia ter feito a minha própria função, mas
quando se usa um framework não é uma boa idéia duplicar a
funcionalidade que ele oferece nas nossas aplicações.

Então, alguém sabe onde fica a bendita função?

[ ]s
Luciano


--
"""
Many were increasingly of the opinion that they'd all made a big
mistake in coming down from the trees in the first place. And some
said that even the trees had been a bad move, and that no one should
ever have left the oceans. (DA/HHGTTG)
"""

Luciano Ramalho

unread,
Feb 5, 2010, 8:26:17 AM2/5/10
to Django Brasil
2010/2/5 Luciano Ramalho <luc...@ramalho.org>:

> Deve ter uma função no Django que transforma "UmaStringAssim" em "Uma
> String Assim", porque ele faz isso no Admin. Mas eu passei meia hora
> vasculhando o código-fonte do Django 1.1 e não achei.
>
> Em menos de meia hora eu poderia ter feito a minha própria função, mas
> quando se usa um framework não é uma boa idéia duplicar a
> funcionalidade que ele oferece nas nossas aplicações.

Pronto, resolvi assim:

>>> import re
>>> s = 'UmTextoCaixaCamelo'
>>> re.sub('(\w)([A-Z])', lambda m: m.group(1)+' '+m.group(2), s)
'Um Texto Caixa Camelo'

Mas eu ainda gostaria de saber onde uma coisa assim está implementada
no Django, se alguém souber.

Valeu!

Vanderson Mota dos Santos

unread,
Feb 5, 2010, 8:28:36 AM2/5/10
to django...@googlegroups.com
Eu também procurei, sem sucesso. Agora estou curioso também.

--
Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>



--
Vanderson Mota dos Santos

Rafael Sierra

unread,
Feb 5, 2010, 8:48:49 AM2/5/10
to django...@googlegroups.com
2010/2/5 Luciano Ramalho <luc...@ramalho.org>:

> 2010/2/5 Luciano Ramalho <luc...@ramalho.org>:
>> Deve ter uma função no Django que transforma "UmaStringAssim" em "Uma
>> String Assim", porque ele faz isso no Admin. Mas eu passei meia hora
>> vasculhando o código-fonte do Django 1.1 e não achei.
>>
>> Em menos de meia hora eu poderia ter feito a minha própria função, mas
>> quando se usa um framework não é uma boa idéia duplicar a
>> funcionalidade que ele oferece nas nossas aplicações.
>
> Pronto, resolvi assim:
>
>>>> import re
>>>> s = 'UmTextoCaixaCamelo'
>>>> re.sub('(\w)([A-Z])', lambda m: m.group(1)+' '+m.group(2), s)
> 'Um Texto Caixa Camelo'
>
> Mas eu ainda gostaria de saber onde uma coisa assim está implementada
> no Django, se alguém souber.

O mais perto que eu cheguei até agora foi isso aqui (não testei):

django/db/models/options.py:get_verbose_name = lambda class_name:
re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', ' \\1',
class_name).lower().strip()


>
> Valeu!
>
> [ ]s
> Luciano
>
>
>
>
> --
> """
> Many were increasingly of the opinion that they'd all made a big
> mistake in coming down from the trees in the first place. And some
> said that even the trees had been a bad move, and that no one should
> ever have left the oceans. (DA/HHGTTG)
> """
>

> --
> Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
> Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>

--
Rafael Sierra
http://blog.stiod.com

Luciano Ramalho

unread,
Feb 5, 2010, 11:41:35 AM2/5/10
to django...@googlegroups.com
2010/2/5 Rafael Sierra <rafae...@gmail.com>:

> 2010/2/5 Luciano Ramalho <luc...@ramalho.org>:
>> 2010/2/5 Luciano Ramalho <luc...@ramalho.org>:
>>> Deve ter uma função no Django que transforma "UmaStringAssim" em "Uma
>>> String Assim", porque ele faz isso no Admin. Mas eu passei meia hora
>>> vasculhando o código-fonte do Django 1.1 e não achei.
>>>
>>> Em menos de meia hora eu poderia ter feito a minha própria função, mas
>>> quando se usa um framework não é uma boa idéia duplicar a
>>> funcionalidade que ele oferece nas nossas aplicações.
>>
>> Pronto, resolvi assim:
>>
>>>>> import re
>>>>> s = 'UmTextoCaixaCamelo'
>>>>> re.sub('(\w)([A-Z])', lambda m: m.group(1)+' '+m.group(2), s)
>> 'Um Texto Caixa Camelo'
>>
>> Mas eu ainda gostaria de saber onde uma coisa assim está implementada
>> no Django, se alguém souber.
>
> O mais perto que eu cheguei até agora foi isso aqui (não testei):
>
> django/db/models/options.py:get_verbose_name = lambda class_name:
> re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', ' \\1',
> class_name).lower().strip()

Valeu, Rafael, você achou o código!

É curioso que a minha solução e a do Django usam lambda, mas em minha
opinião a solução do Django usa o lambda sem motivo.

A utilidade do lambda é criar funções anônimas, para uso apenas em um
contexto bem restrito. Se vocẽ usa o lambda para definir uma função e
na mesma linha você atribui a uma variável para poder usá-la depois,
deveria usar o def, que serve exatamente para criar uma função e
associá-la a um nome!

Ou seja, em vez disso:

get_verbose_name = lambda class_name:
re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', ' \\1',
class_name).lower().strip()

O código do Django ficaria mais fácil de ler assim:

def get_verbose_name(class_name):
return re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', ' \\1',
class_name).lower().strip()

[ ]s

Rafael Sierra

unread,
Feb 5, 2010, 7:08:25 PM2/5/10
to django...@googlegroups.com
2010/2/5 Luciano Ramalho <ram...@gmail.com>:

> 2010/2/5 Rafael Sierra <rafae...@gmail.com>:
>> 2010/2/5 Luciano Ramalho <luc...@ramalho.org>:
>>> 2010/2/5 Luciano Ramalho <luc...@ramalho.org>:
>>>> Deve ter uma função no Django que transforma "UmaStringAssim" em "Uma
>>>> String Assim", porque ele faz isso no Admin. Mas eu passei meia hora
>>>> vasculhando o código-fonte do Django 1.1 e não achei.
>>>>
>>>> Em menos de meia hora eu poderia ter feito a minha própria função, mas
>>>> quando se usa um framework não é uma boa idéia duplicar a
>>>> funcionalidade que ele oferece nas nossas aplicações.
>>>
>>> Pronto, resolvi assim:
>>>
>>>>>> import re
>>>>>> s = 'UmTextoCaixaCamelo'
>>>>>> re.sub('(\w)([A-Z])', lambda m: m.group(1)+' '+m.group(2), s)
>>> 'Um Texto Caixa Camelo'
>>>
>>> Mas eu ainda gostaria de saber onde uma coisa assim está implementada
>>> no Django, se alguém souber.
>>
>> O mais perto que eu cheguei até agora foi isso aqui (não testei):
>>
>> django/db/models/options.py:get_verbose_name = lambda class_name:
>> re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', ' \\1',
>> class_name).lower().strip()
>
> Valeu, Rafael, você achou o código!
>
> É curioso que a minha solução e a do Django usam lambda, mas em minha
> opinião a solução do Django usa o lambda sem motivo.

Pois é...eu achei tão estranho que postei como "cheguei perto",
prefiri não arriscar um "achei!"

>
> A utilidade do lambda é criar funções anônimas, para uso apenas em um
> contexto bem restrito. Se vocẽ usa o lambda para definir uma função e
> na mesma linha você atribui a uma variável para poder usá-la depois,
> deveria usar o def, que serve exatamente para criar uma função e
> associá-la a um nome!
>
> Ou seja, em vez disso:
>
> get_verbose_name = lambda class_name:
> re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', ' \\1',
> class_name).lower().strip()
>
> O código do Django ficaria mais fácil de ler assim:
>
> def get_verbose_name(class_name):
>    return re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', ' \\1',
> class_name).lower().strip()
>

Sem duvida nenhuma a melhor opção do ponto de vista da leitura a
melhor opção é a definição da função. Me sobram 2 sugestões e uma
duvida:

1. Não seria interessante subir isso pra django-dev?
2. Por questões de performance, não valeria a pena fazer o cacheamento
do verbose_name com base no class_name (acredito que não devido a essa
função ser chamado poucas vezes e praticamente apenas no admin)
3. (Duvida) Existe algum ganho de performance -significante- em manter
o lambda ou em utilizar o def? Acredito que não mas não tenho nenhum
embasamento, é puro "achometro"

> [ ]s
> Luciano
>
>
> --
> """
> Many were increasingly of the opinion that they'd all made a big
> mistake in coming down from the trees in the first place. And some
> said that even the trees had been a bad move, and that no one should
> ever have left the oceans. (DA/HHGTTG)
> """
>

Vanderson Mota dos Santos

unread,
Feb 5, 2010, 7:12:20 PM2/5/10
to django...@googlegroups.com
1. Não seria interessante subir isso pra django-dev?
 +1. Esse lambda complicou a leitura desnecessariamente, como o Luciano falou.
Vanderson Mota dos Santos

Rafael Sierra

unread,
Feb 5, 2010, 7:22:59 PM2/5/10
to django...@googlegroups.com
2010/2/5 Vanderson Mota dos Santos <vanders...@gmail.com>:

> 1. Não seria interessante subir isso pra django-dev?
>  +1. Esse lambda complicou a leitura desnecessariamente, como o Luciano
> falou.

Tomei a liberdade de criar um ticket sobre isso:

http://code.djangoproject.com/ticket/12796

Reply all
Reply to author
Forward
0 new messages