Что я должен рефакторинг в моем классе Python? - PullRequest
0 голосов
/ 30 марта 2011

Я довольно новичок в 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?

Нужны некоторые подсказки.

BestС уважением,

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

Как ясно показывает вывод, ваш код вызывает исключение twitter.TwitterError. Вы ловите это так:

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

Теперь, когда вы пишете свой первый класс и не знаете, как перехватывать исключения в языке, вы не пытаетесь получить обновления Twitter и сохранить их в базе данных. Вы печатаете "Hello World!" . Пойди сделай урок: D.

2 голосов
/ 30 марта 2011

Одной из возможностей может быть написание функции, которая подключается к базе данных и отключается от нее, а во время подключения выполняет некоторые функции.Это может выглядеть примерно так:

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

Теперь параметр Func и args фактически взаимодействует с базой данных.Например, что-то вроде этого:

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

1 голос
/ 30 марта 2011

Первое, что нужно изменить, это вывести этот код из класса. Ему абсолютно не нужно быть в одном. Это должен быть модуль с автономными функциями.

Редактировать, чтобы добавить больше объяснений В Python большая часть кода естественно группируется в модули. Классы в основном полезны, когда вам нужны отдельные экземпляры, каждый со своими данными. Это не тот случай - вы просто используете класс в качестве заполнителя для связанного кода. Вот для чего нужны модули.

Если, например, вы хотите смоделировать отдельный твит, который знает о своем собственном контенте и о том, как сохранить себя в базе данных, это действительно хорошее применение ООП. Но «материал, связанный с Twitter» - это не класс, а модуль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...