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)
"""
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!
--
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/>
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
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
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)
> """
>
Tomei a liberdade de criar um ticket sobre isso:
http://code.djangoproject.com/ticket/12796