pythonでバージョン混載。before25とafter26でそれぞれ動作するスクリプトを書く。
Pythonのバージョンが未だ標準では2.4だったりするOSもあれば、2.5のOSもある。
今後出てくるOSは2.6などが標準だったりする時代も来るわけで、ひょっとしたら3.0かも知れない。今の内に3.0の書き方を勉強するのは良いけれど、完全に切り替わるまでは、2.5でも3.0でも動くコードをかけなきゃイカンと言うことでやってみた。
vの字にコメントで、try使う方法教えて貰ったので、モジュールのインポートはtry使う。
まず、2.6のを読み込んでみて駄目だったら2.5のモジュールを読み込む感じ、名前はどっちにするか迷ったが、まだ2.5台のほうがなじみがありそうなので、そっちに名前を揃える。そのうち3.0の名前に揃えるべきだと思う。
try: from hashlib import sha1 as sha except: import sha
微妙にメソッドの使い方が変わってたりするので、それようのメソッドを作る。全くルールが分からないので前回mattnさんのまねして、'_'をつけたメソッドにしてみた。
try: from hashlib import sha1 as sha def _sha(args): return sha(args) except: import sha def _sha(args): return sha.new(args)
あとは、使いたい部分のメソッドに’_’を追加していけば、B25とA26で動きそうなスクリプトが出来る。
昨日の、hatenadを2.5 and 2.6 readyにしてみた。
http://bitbucket.org/yoshiori/hatenad/changeset/cf62ec375930/
このリビジョンに対するパッチ
diff -r cf62ec375930 hatenad.py --- a/hatenad.py Fri Feb 27 19:00:45 2009 +0900 +++ b/hatenad.py Sun Mar 01 13:06:50 2009 +0900 @@ -4,9 +4,16 @@ import base64 import random -import sha import urllib from datetime import date,datetime +try: + from hashlib import sha1 + def _sha(args): + return sha(args) +except ImportError: + from sha import sha + def _sha(args): + return sha.new(args) + + class WSSE : @@ -18,14 +25,15 @@ private = str(random.random()) now = datetime.now() timestamp = now.strftime('%Y-%m-%dT%H:%M:%SZ') - return '%s %s' % (timestamp, sha.new('%s:%s' % (timestamp, private)).hexdigest()) + return '%s %s' % (timestamp, _sha('%s:%s' % (timestamp, private)).hexdigest()) def get_wsse(self): nonce = self.get_nonce() base64_encoded_nonce = base64.encodestring(nonce).replace('\n', '') now = datetime.now() post_creation_time = now.strftime('%Y-%m-%dT%H:%M:%SZ') - password_digest = base64.encodestring(sha.new(nonce + post_creation_time + self.passwd).digest()).replace('\n', '') + password_digest = base64.encodestring(_sha(nonce + post_creation_time + self.passwd).digest()).replace('\n', '') + return 'UsernameToken Username="%s", PasswordDigest="%s", Created="%s", Nonce="%s"' \ % (self.userid, password_digest, post_creation_time, base64_encoded_nonce) @@ -74,6 +82,6 @@ from pit import Pit hatena_conf = Pit.get('hatena.ne.jp',{'require' : {'userid':'Your hatena.ne.jp userid','password':'Your hatena.ne.jp password'}}) diary = HatenaDiary(hatena_conf['userid'],hatena_conf['password']) - r = diary.postEntry('日本語','**日本語\n-ほげ\n-ふぉお\n>|python|\nimport sys\n||<',True) - print diary.delete(r).status + r = diary.postEntry('hatenadより、投稿33','**shaをsha1で置き換える!\n>|python|\nfrom hashlib import sha1 as sha\n||<\n テストなり',True) + #print diary.delete(r).status