--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2008/03/02

gmail の未読数のやつをちょっと改善した

改善点:

  • ネット接続なしで起動すると、そこで死ぬことへの対処
  • 出力先の切り替えをもう少しエレガントに

ソースコード:

retry_interval = 60 #a minute
account = None
while account == None:
    try:
        account = libgmail.GmailAccount('%s@gmail.com'%(username), password)
        account.login()
    except URLError:
        sys.stderr.write(\
        'not found connetion... \
        retry after a minute later.\n')
        time.sleep(retry_interval)
    except GmailLoginFailure, e:
        raise e

#port_open = lambda: sys.stdout
port_open = lambda: file('/path/to/.gmail_stats', 'w')
def output_msg_info(not_read_mails):
    port = port_open()
    try:
        #print out, not read mails count
        port.write('not read count:%d\n' % (len(not_read_mails)))
        port.flush()
    finally:
        port.close()

変えたとこだけ。もう少し詳細にまとめると、

  • URLError(接続エラー)でログイン失敗したときは、任意の間隔でリトライする。
  • 出力先(port)を返す関数を定数として定義する。書き出す時はその関数を評価することで、出力先を得る。出力先を切り替えたいときは関数だけ切り替えればいい。

さっき気づいたんだけど、sys.stdout の close も呼び出されることになる。どうなるんだろう。やってみた。

python -c 'import sys; sys.stdout.close(); sys.stdout.write(str(1))'
Traceback (most recent call last):
  File "<string>", line 1, in 
ValueError: I/O operation on closed file

ダメらしい。当然か。うーむ。

3分くらい悩んで、close したくないやつに関しては出力先ポートをラップするクラスを使うことにした。なんかめんどくさくなってきたし、この辺はもう触れないことにしよう。

#!/usr/bin/env python

import sys

f = lambda: NonClosePort(sys.stdout)
#f = lambda: file('/path/to/file', 'w')

class NonClosePort:
    def __init__(self, port):
        self.port = port

    def write(self, msg):
        self.port.write(msg)

    def flush(self):
        self.port.flush()

    def close(self):
        pass

port = f()
for i in range(2):
    try:
        port.write('%d\n'%(i))
        port.flush()
    finally:
        port.close()
スポンサーサイト

comment

post




上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。