日別アーカイブ: 2010/01/16

IronPython IDisposable and Python Context Management

What is the equivalent of the C# “using” block in IronPython? – Stack Overflow

IronPython で using てか IDisposable が利用できたんだ。
知らなかった、てゆーか with, as って何だ?
私が買った Python の本にはこんなの書いていなかった気がするんだが。

with – odz buffer

Python 2.5 以降で使えるらしい、IronPython だけというわけでは無いようで。
やっぱり知っている人は少ないのか、もう少し調べてみよう。

3.10 コンテキストマネージャ型

__ext__ 指定だけだと例外になった、__enter__ と常に対にする必要あり。
試しに何か書いてみよう、と思ったけど IronPython で思いつかなかった(ぉい!

で、PyGtk の gtk.MessageDialog は destroy() メソッドを呼ぶ必要があるので

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python
#-*- coding:utf-8 -*-
 
import gtk
 
class MessageBox(gtk.MessageDialog):
    def __init__(self, parent=None, flags=0, type=gtk.MESSAGE_INFO,
                  buttons=gtk.BUTTONS_NONE, message_format=None):
        gtk.MessageDialog.__init__(self, parent, flags, type, buttons, message_format)
    def __enter__(self):
        #print 'enter' # debug
        return self
    def __exit__(self, *excinfo):
        #print 'exit %s' % repr(excinfo) # debug
        self.destroy()
 
def messagebox(text):
    with MessageBox(buttons=gtk.BUTTONS_OK, message_format=text) as dlg:
        dlg.run() 
 
messagebox("Test !")

おぉ!確かにこれで解放処理を書かずに関数が使える。
でも try, finally のほうが解りやすいと思うんですけど…
組込みなら使うけど自分で書くかは少し微妙。