Каковы лучшие практики для расширения существующего модуля Python – в этом случае, я хочу расшириться python-twitter
пакет путем добавления новых методов к основному классу API.
Я посмотрел на tweepy
, и мне нравится этот также; я просто нахожу python-twitter
легче понять и расшириться с функциональностью я хочу.
Мне уже записали методы – я пытаюсь выяснить большую часть Pythonic и наименее разрушительный способ добавить их в python-twitter
модуль пакета, не изменяя ядро этих модулей.
Несколько способов.
Простой способ:
Не расширяйте модуль, расширяйте классы.
exttwitter.py
import twitter
class Api(twitter.Api):
pass
# override/add any functions here.
Оборотная сторона: каждый класс в твиттере должен быть в exttwitter.py, даже если это просто заглушка (как указано выше)
Более сложный (возможно, не питонический) способ:
Импорт * из python-twitter в модуль, который вы затем расширяете.
Например:
basemodule.py
class Ball():
def __init__(self,a):
self.a=a
def __repr__(self):
return "Ball(%s)" % self.a
def makeBall(a):
return Ball(a)
def override():
print "OVERRIDE ONE"
def dontoverride():
print "THIS WILL BE PRESERVED"
extmodule.py
from basemodule import *
import basemodule
def makeBalls(a,b):
foo = makeBall(a)
bar = makeBall(b)
print foo,bar
def override():
print "OVERRIDE TWO"
def dontoverride():
basemodule.dontoverride()
print "THIS WAS PRESERVED"
runscript.py
import extmodule
#code is in extended module
print extmodule.makeBalls(1,2)
#returns Ball(1) Ball(2)
#code is in base module
print extmodule.makeBall(1)
#returns Ball(1)
#function from extended module overwrites base module
extmodule.override()
#returns OVERRIDE TWO
#function from extended module calls base module first
extmodule.dontoverride()
#returns THIS WILL BE PRESERVED\nTHIS WAS PRESERVED
Я не уверен, что двойной импорт в extmodule.py питонический - вы можете удалить его, но тогда вы не обрабатываете вариант использования, когда хотите расширить функцию, которая была в пространстве имен базового модуля.
Что касается расширенных классов, просто создайте новый класс API (basemodule.API) для расширения модуля Twitter API.
Не добавляйте их в модуль. Подклассифицируйте классы, которые вы хотите расширить, и используйте свои подклассы в своем собственном модуле, не изменяя исходный материал вообще.
Могу я предложить здесь не изобретать Колесо заново? Я создаю Twitter-клиент со строкой> 6k в течение 2 месяцев, сначала я тоже проверил python-twitter, но он сильно отстает от последних изменений API. (по крайней мере, когда я последний раз проверял) нет поддержки OAuth / xAuth).
Итак, после небольшого поиска я обнаружил tweepy:
http://github.com/joshthecoder/tweepy
Плюсы: Активная разработка, OAauth / xAuth и обновление с API.
Скорее всего, все, что вам нужно, уже есть.
Так что я предлагаю пойти с этим, это работает для меня, единственное, что мне нужно было добавить, это xAuth (который получил слияние с tweepy :)
Ах, бессовестная вилка, если вам нужно разбирать твиты и / или отформатируйте их в HTML, используя мою версию python библиотек twitter-text- *:
http://github.com/BonsaiDen/twitter-text-python
Эта вещь unittestetd гарантированно анализирует твиты так же, как Twitter.com делает это.