3623
Comentário:
|
5228
|
Deleções são marcadas assim. | Adições são marcadas assim. |
Linha 56: | Linha 56: |
class CherryPyIni(IniFile): | class SimpleIni(IniFile): |
Linha 65: | Linha 65: |
O tipo TypedAttribute é um atributo especial, que quando colocado dentro de um Template, gera automaticamente uma 'property' que checa o tipo do argumento. O tipo é inferido a partir do valor default. Assim, as seguintes atribuições serão tratadas de formas diferentes: {{{ ini = SimpleIni() ini.server.socketPort = 10 # aceito -> 10 é um inteiro ini.staticContent.bitmaps = 0 # gera exceção -> 0 não é string }}} == Funcionamento == O sistema de templates depende de algumas regras básicas para garantir o funcionamento transparente. As regras são: * Todas as classes aninhadas devem ser herdadas de Template. Classes não herdadas de Template poderão ser aninhadas, mas sem garantia de comportamento correto. * Os atributos aninhados que não forem classes devem ser herdeiros de GenericAttribute. Esta classe já tem o código necessário para operar em conjunto com o GenericTemplate. * Os atributos simples (strings, inteiros, etc.) podem ser especificados diretamente no código. A metaclasse que cria o GenericTemplate processa automaticamente estes valores, e os encapsula dentro de um atributo genérico (sem tipo). * O TypedAttribute é um herdeiro do atributo genérico, que verifica o tipo do argumento nas chamadas ao método __set__. == Código fonte == De que vale esta conversa sem o código fonte? (Ainda não coloquei a licença; preciso de ajuda com isso! aceito sugestões!) PS: os comentários e nomes estão em inglês. O código se propõe a ser de uso livre, e não faria sentido escrevê-lo em português. Espero que todos compreendam. {{{ }}} |
Introdução
O projeto TemplatesGenéricos visa disponibilizar uma biblioteca geral para expressar estruturas de dados complexas em código Python. Trata-se ainda de uma abordagem experimental. O conceito básico é simples:
class Pessoa(GenericTemplate): nome = 'José da Silva' class endereco(GenericTemplate): rua = 'Rua das Bobos, 0' cidade = 'Patópolis' class documentos(GenericTemplate): cpf = '00.000.000-00' rg = '0.000.000'
A princípio, o template acima é bastante similar a qualquer outro escrito em XML, ou em um dicionário Python. Qual seriam as vantagens, então?
Legibilidade: o código em Python é bem estruturado e legível. Já o código em XML não é tão legível, e é mais difícil de editar manualmente. O dicionário também se torna confuso, porque muitas definições ficam dentro de strings, o que polui o código com aspas e chaves que não são nada 'pitônicas';
Integração: o código pode residir dentro de um arquivo convencional Python. Não há necessidade de ler a descrição de outro lugar.
Orientação a objeto: é muito fácil criar novas classes e construir estruturas dinâmicas e inteligentes, que processam os atributos de forma automatizada. Estas estruturas podem ser herdadas e reutilizadas dentro do ambiente normal de programação Python.
Aplicações
O sistema foi criado a partir de uma idéia ambiciosa: um ambiente de desenvolvimento de aplicações comerciais, capaz de converter definições de telas de entrada em múltiplos formatos de saída. Para viabilizar o desenvolvimento, optamos pelo crescimento gradual. A biblioteca de templates está sendo focada em duas aplicações até o momento:
Templates para Web: permite a especificação de páginas com layouts complexos, incluindo forms de entrada de dados. A descrição final é facilmente legível, e o uso de objetos facilita a composição de telas complexas, com vários elementos, em tempo de execução. Exemplos:
class Page(htmlcontainer.HtmlPage): class head(htmlcontainer.HtmlPage.head): stylesheet = CSSStyleSheet class body(htmlcontainer.HtmlPage.body): contents = """ Hello World! """ class FormEdicaoUsuario(Form): title = 'Dados do usuário' class dadosbasicos(Panel): style = 'form-section' apelido = EditBox(caption = 'Identificação', size = 15) senha = EditBox(caption = 'Senha', size = 10, password = True) nome = EditBox(caption = 'Nome completo', size = 40) class endereco(Panel): style = 'form-section' endereco = EditBox(caption = 'Endereço', size = 40) bairro = EditBox(caption = 'Bairro', size = 40) cidade = EditBox(caption = 'Cidade', size = 40) class extras(Panel): style = 'form-section' observacao= EditBox(caption = 'Observações', multiline= True, rows = 10, cols = 40)
Arquivos de inicialização (.ini): permite a especificação de uma estrutura de arquivo de inicialização .ini, com a divisão em seções. Cada atributo pode ter seu tipo e um valor default definido de forma simples e legível:
class SimpleIni(IniFile): class server(IniSection): socketPort = TypedAttribute(8080) threadPool = TypedAttribute(10) class staticContent(IniSection): bitmaps = TypedAttribute('c:/work/sidercom/bitmaps') class session(IniSection): storageType = TypedAttribute('ram')
O tipo TypedAttribute é um atributo especial, que quando colocado dentro de um Template, gera automaticamente uma 'property' que checa o tipo do argumento. O tipo é inferido a partir do valor default. Assim, as seguintes atribuições serão tratadas de formas diferentes:
ini = SimpleIni() ini.server.socketPort = 10 # aceito -> 10 é um inteiro ini.staticContent.bitmaps = 0 # gera exceção -> 0 não é string
Funcionamento
O sistema de templates depende de algumas regras básicas para garantir o funcionamento transparente. As regras são:
- Todas as classes aninhadas devem ser herdadas de Template. Classes não herdadas de Template poderão ser aninhadas, mas sem garantia de comportamento correto.
Os atributos aninhados que não forem classes devem ser herdeiros de GenericAttribute. Esta classe já tem o código necessário para operar em conjunto com o GenericTemplate.
Os atributos simples (strings, inteiros, etc.) podem ser especificados diretamente no código. A metaclasse que cria o GenericTemplate processa automaticamente estes valores, e os encapsula dentro de um atributo genérico (sem tipo).
O TypedAttribute é um herdeiro do atributo genérico, que verifica o tipo do argumento nas chamadas ao método set.
Código fonte
De que vale esta conversa sem o código fonte? (Ainda não coloquei a licença; preciso de ajuda com isso! aceito sugestões!)
PS: os comentários e nomes estão em inglês. O código se propõe a ser de uso livre, e não faria sentido escrevê-lo em português. Espero que todos compreendam.