When it’s ready.

出来るまで出来ない

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