Python para Desenvolvedores

2ª edição, revisada e ampliada

Respostas dos exercícios V


1. Implementar uma classe Animal com os atributos: nome, espécie, gênero, peso, altura e idade. O objeto derivado desta classe deverá salvar seu estado em arquivo com um método chamado “salvar” e recarregar o estado em um método chamado “desfazer”.

Solução:

In [1]:
import pickle

class Animal(object):
    """
    Classe que representa um animal.
    """

    attrs = ['nome', 'especie', 'genero', 'peso', 'altura', 'idade']

    def __init__(self, **args):

        # Crie os atributos no objeto a partir da lista
        # Os atributos tem None como valor default
        for attr in self.attrs:
            setattr(self, attr, args.get(attr, None))
    
    def __repr__(self):

        dic_attrs = {}
        for attr in self.attrs:
            dic_attrs[attr] = getattr(self, attr)
        return 'Animal: %s' % str(dic_attrs)

    def salvar(self):

        """
        Salva os dados do animal.
        """
        dic_attrs = {}
        for attr in self.attrs:
            dic_attrs[attr] = getattr(self, attr)

        pickle.dump(dic_attrs, file('a.pkl', 'w'))

    def desfazer(self):

        """
        Restaura os últimos dados salvos.
        """
        attrs = pickle.load(file('a.pkl'))

        for attr in attrs:
            setattr(self, attr, attrs[attr])

# Teste
gato = Animal(nome='Tinker', especie='Gato', genero='m',
    peso=6, altura=0.30, idade=4)

gato.salvar()
gato.idade = 5
print gato
gato.desfazer()
print gato
Animal: {'especie': 'Gato', 'genero': 'm', 'nome': 'Tinker', 'peso': 6, 'idade': 5, 'altura': 0.3}
Animal: {'especie': 'Gato', 'genero': 'm', 'nome': 'Tinker', 'peso': 6, 'idade': 4, 'altura': 0.3}

2. Implementar uma função que formate uma lista de tuplas como tabela HTML.

Solução:

In [ ]:
# O módulo StringIO implementa uma classe
# de strings que se comportam como arquivos
import StringIO

def table_format(dataset):
    """
    Classe que representa um animal.
    """

    out = StringIO.StringIO()
    out.write('<table>')

    for row in dataset:
        out.write('<tr>')
        for col in row:
            out.write('<td>%s</td>' % col)
        out.write('</tr>')

    out.write('</table>')
    out.seek(0)
    return out.read()

3. Implementar uma aplicação Web com uma saudação dependente do horário (exemplos: “Bom dia, são 09:00.”, “Boa tarde, são 13:00.” e “Boa noite, são 23:00.”).

Solução:

In [ ]:
import time
import cherrypy

class Root(object):
    """
    Raiz do site.
    """

    @cherrypy.expose
    def index(self):
        """
        Exibe a saudação conforme o horário do sistema.
        """

        # Lê a hora do sistema
        hour = '%02d:%02d' % time.localtime()[3:5]

        if '06:00' < hour <= '12:00':
            salute = 'Bom dia'
        elif '12:00' < hour <= '18:00':
            salute = 'Boa tarde'
        else:
            salute = 'Boa noite'

        # Retorna a mensagem para o browser
        return '%s, são %s.' % (salute, hour)

cherrypy.quickstart(Root())

4. Implementar uma aplicação Web com um formulário que receba expressões Python e retorne a expressão com seu resultado.

Solução:

In [ ]:
import traceback
import cherrypy

class Root(object):

    # Modelo para a página HTML
    template = '''
    <html><body>
    <form action="/">
    <input type="text" name="exp" value="%s" />
    <input type="submit" value="enviar">
    <pre>%s</pre>
    </body></html>'''

    @cherrypy.expose
    def index(self, exp=''):

        out = ''
        if exp:

            # Tente avaliar a expressão
            try:
                out = eval(exp)

            # Se der errado, mostre a mensagem do erro
            except:
                out = traceback.format_exc()

        return self.template % (exp, out)

cherrypy.quickstart(Root())
In [1]:
 
Out[1]: