Как стать автором
Обновить

Комментарии 31

Нет, к сожалению, не мой :)
WHAT?! NINE THOUSAND?!
Некоторые рекомендации по коду:
— избавление от global очень положительно сказывается на понимании сути мироздания
— не плохо было бы ловить KeyboardInterrupt и останавливать запущенные треды
— если хочется написать несколько одинаковых print bla-bla… некоторые из которых находятся в except, то самое время подумать про logging
Приму к сведению, спасибо.
global в сочетании с Threading приведут вас в ад…
Простите, больше так не буду :( Честно :(
А как передать список replyed треду? Так, чтобы он мог вносить в него изменения, и чтобы этот список был доступен другим тредам.
Ну, первое что бы я сделал — это выпилил бы Threading вообще выдал каждому треду свою уникальную копию api. Т.е. сделал бы так, чтобы init() возвращал tweepy.API(auth) типа

def init():
    ....
    return tweepy.API(auth)


И сделал бы так, чтобы init вызывался в начале run() функции
def run (self):
    api=init()

Так мы избавимся от race — conditions в tweepy.

А для записи айдишников твитов, на которые мы уже отвечали нужно использовать threading.Lock ну и так и быть — глобальную переменную или переменную класса:

class TwiBot(threading.Thread):
    replyed=set() # set гарантирует уникальность и проверка in работает быстрее
    replyed_lock=threading.Lock()

    def run():
        ....
        need_reply=[] # будущий список твитов, на которые нужно ответить.
        # захватываем блокировку replyed и быстро проходим по списку твитов
        # составляя список тех, на которые нужно ответить
        with TwiBot.replyed_lock:
            for i in request: #XXX: почему request? response ведь!!!
                if i.from_user!='thevar1able' and i.id not in TwiBot.replyed:
                    need_reply.append(i)
                    TwiBot.replyed.add(i.id)
        # тут блокировка уже снята и другой поток может писать в replyed
        # а наш поток может не спеша слать ответы.
        for i in need_reply:
            ...
            Tweet('@'+i.from_user+self.answer,i.id)
            ...
        
А действительно, зачем тут Threading…
Блин, так обрадовался, думал что приду домой — реализую давно задуманного твиттер бота, а тут злые дадьки в комментах говорят что я попаду в ад, если буду использовать «global в сочетании с Threading»

Просто я не программист(в нормальном понимании этого слова), может у кого есть ссылка на хорошую и простую статью про написание твиттер-ботов(можно и на php)

Спасибо!
НЛО прилетело и опубликовало эту надпись здесь
Можете сильно не заморачиваться, для непрограммиста и этот код вполне на уровне.

Но для улучшения мыслительной кармы посмотрите сюда — www.python.org/dev/peps/pep-0020/
artifex.org/~hblanks/talks/2011/pep20_by_example.html
docs.python.org/tutorial/

Причем, это вовсе не сугубо к Питону относится, но и ко многим другим языкам.
Упс, а текст тут я не умею форматировать :(
Спасибо)
В Python принято использовать конструкции вида:
if __name__ == '__main__:
main()

А вот в функции main уже делать вашу инициализацию и запуск тредов
> принято использовать конструкции

И сразу бы писали почему. Чтобы модуль можно было использовать и самостоятельно и как подключаемую библиотеку.
НЛО прилетело и опубликовало эту надпись здесь
Просто было скучно :)
НЛО прилетело и опубликовало эту надпись здесь
А почему плохо склеивать строки плюсом? Они же приведены к одному типу данных.
НЛО прилетело и опубликовало эту надпись здесь
Спасибо, приму к сведению.
мило
давайте и я занудно попинаю
< if len(twit)<=140 and len(twit)>0:
> if 0<len(twit)<=140:
Это ж питон, и вас должно было напрячь, что вычисляете одно и то же два раза подряд
Не могу найти запостенные скриптом твиты. Где они должны появляться?
Сорри, нашел
tweepy клёвая ^_^
а access_token выдаётся на вечно или протухает?
Навечно вроде
А что такое id_reply? Зачем он нужен?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации