2011年8月24日水曜日

Pythonで演算子オーバーロード

今更ながらPythonの演算子オーバーロード について調べたのでメモ。
クラスのメソッドを作成するだけなので 簡単にできますね。


class OverLoadTest(object):
    def __init__(self, a):
        self.a = a

    # +
    def __add__(self, b):
        self.a = self.a + b
    # -
    def __sub__(self, b):
        self.a = self.a - b
    # /
    def __div__(self, b):
        self.a = self.a / b
    # *
    def __mul__(self, b):
        self.a = self.a * b

    def __repr__(self):
        return str(self.a)

if __name__ == "__main__":
    o = OverLoadTest(5)
    print o
    o + 5
    print o
    o - 5
    print o
    o / 5
    print o


普段はJavaで書いているから演算子オーバーロードが頭にないなー。

使ってるライブラリでも演算子オーバーロード見たことない気がする。
(知らないだけか?)
効果的に使えるようになりたいですね。

2011年8月7日日曜日

FlaskでStreaming

久々にFlaskドキュメントページ見てたら、
Streamingのsnipetが掲載されてました。
(もしかして結構前から?)

Werkzeugには0.5から機能としてはあるみたいなんで、
きっと昔からできたんでしょう。

なかなか使い道ないけどTwitterのようなStreamingAPIとかかっこ良いですよね。

つーことでコード。

from flask import Flask
from flask import Response
import time

app = Flask(__file__)

@app.route("/streaming")
def streaming():
    def generate():
        while True:
            time.sleep(1)
            yield "test\n"
    return Response(generate(),direct_passthrough=True,mimetype='text/plain')

if __name__ == "__main__":
    app.run()


ResponseにStreamingするためのジェネレータを渡すだけ。
direct_passthroughはジェネレータを変更させないための引数らしい、wrapして返すため、後で変更されても影響を受けないようになると思われる(WSGIの仕様っぽい)。
mime/typeはお好きなものを。






それにしても簡単だなー。