我应该在Python类中重构什么?

时间:2011-03-30 14:08:48

标签: python exception-handling

我对Python很新。这是我的第一堂课:

import config   # Ficheiro de configuracao
import twitter
import random
import sqlite3
import time
import bitly_api #https://github.com/bitly/bitly-api-python

class TwitterC:
    def logToDatabase(self, tweet, timestamp):
        # Will log to the database
        database      = sqlite3.connect('database.db') # Create a database file
        cursor        = database.cursor() # Create a cursor
        cursor.execute("CREATE TABLE IF NOT EXISTS twitter(id_tweet INTEGER AUTO_INCREMENT PRIMARY KEY, tweet TEXT, timestamp TEXT);") # Make a table
        # Assign the values for the insert into
        msg_ins       = tweet
        timestamp_ins = timestamp
        values        = [msg_ins, timestamp_ins]
        # Insert data into the table
        cursor.execute("INSERT INTO twitter(tweet, timestamp) VALUES(?, ?)", values)
        database.commit() # Save our changes
        database.close() # Close the connection to the database

    def shortUrl(self, url):
        bit = bitly_api.Connection(config.bitly_username, config.bitly_key) # Instanciar a API
        return bit.shorten(url) # Encurtar o URL

    def updateTwitterStatus(self, update): 
        short   = self.shortUrl(update["url"]) # Vou encurtar o URL
        update  = update["msg"] + short['url']
        # Will post to twitter and print the posted text
        api     = twitter.Api(consumer_key=config.consumer_key, 
                                   consumer_secret=config.consumer_secret, 
                                   access_token_key=config.access_token_key, 
                                   access_token_secret=config.access_token_secret)
        status  = api.PostUpdate(update) # Fazer o update
        msg     = status.text # Vou gravar o texto enviado para a variavel 'msg'
        # Vou gravar p a Base de Dados
        self.logToDatabase(msg, time.time())
        print msg # So p mostrar o texto enviado. Comentar esta linha de futuro.

x = TwitterC()
x.updateTwitterStatus({"url": "http://xxxx.com/?cat=49", "msg": "Searching for some ....? "})

我的问题。我应该在这个丑陋的代码中重构一下(我想)?

例如。当我尝试复制Twitter更新时出现此错误:

Traceback (most recent call last):
  File "C:\Users\anlopes\workspace\redes_sociais\src\twitterC.py", line 42, in <module>
    x.updateTwitterStatus({"url": "http://xxx.com/?cat=49", "msg": "Searching for some ...? "})
  File "C:\Users\anlopes\workspace\redes_sociais\src\twitterC.py", line 35, in updateTwitterStatus
    status  = api.PostUpdate(update) # Fazer o update
  File "C:\home_python\python_virtualenv\lib\site-packages\twitter.py", line 2549, in PostUpdate
    self._CheckForTwitterError(data)
  File "C:\home_python\python_virtualenv\lib\site-packages\twitter.py", line 3484, in _CheckForTwitterError
    raise TwitterError(data['error'])
twitter.TwitterError: Status is a duplicate.

我如何在Python中捕获此错误?

需要一些线索。

最诚挚的问候,

3 个答案:

答案 0 :(得分:3)

由于输出状态清楚,您的代码正在引发twitter.TwitterError异常。你这样抓住它:

try:
    # yadda yadda
except twitter.TwitterError:
    # exception code
else:
    # happy flow code, optionally.
finally:
    # must-run code, optionally

现在,当您编写第一个类并且不知道如何捕获语言中的异常时,您不会尝试获取Twitter更新并将其保存在数据库中。你打印“Hello World!”。去做一个教程:D。

答案 1 :(得分:2)

一种可能性是编写一个连接到数据库并与数据库断开连接的函数,并在连接期间执行一些操作。它可能看起来像这样:

class DBFactory(object):
    def DBConnection(self, Func, args):
        database      = sqlite3.connect('database.db') # Create a database file
        cursor        = database.cursor() # Create a cursor

        Func(cursor, args)

        database.commit() # Save our changes
        database.close() # Close the connection to the database

现在Funcargs参数实际上与数据库进行交互。例如:

def CreateTable(cursor, args):
    cursor.execute("CREATE TABLE IF NOT EXISTS {0};".format(args)) # Make a table

现在,如果您想创建一个表,您只需进行此调用:

f = DBFactory()
f.DBConnection(CreateTable, "twitter(id_tweet INTEGER AUTO_INCREMENT PRIMARY KEY, tweet TEXT, timestamp TEXT)"

您可以与数据库的其他交互类似地进行操作,例如插入或删除条目。每次调用DBConnection方法。这应该会更好地模块化你的课程。至少在我看来。

请注意,我没有尝试使用此代码,因此可能会有拼写错误,但我希望您明白这一点。我希望这有助于你

Cherio
Woltan

答案 2 :(得分:1)

重构的第一件事是从类中获取此代码。它绝对没有必要在一个。这应该是一个具有独立功能的模块。

编辑以添加更多解释在Python中,大多数代码自然地分组到模块中。当您需要离散实例(每个实例都有自己的数据)时,类主要是有用的。这不是这种情况 - 您只是将该类用作相关代码的占位符。这就是模块的用途。

例如,如果您想要建模一个知道自己内容以及如何将自己保存到数据库中的个人推文,那么确实可以很好地利用OOP。但是“与Twitter相关的东西”不是一个类,它是一个模块。