2012年11月14日水曜日

pythonの特殊メソッド__iadd__を使ってみる

mbedマイクロプロセッサでのC/C++の動作確認の為に、pythonで同等のプログラムを書いている時に、
変数がオーバーフローしないので動作に違いが発生する時がある。例えば8ビットuint8_t型の場合に
インクリメントして255を超えたら0に戻って欲しい。変数を更新するたびに0xffでマスクすればいいのだが、
もっとうまい方法がないかと調べてみた。

ctypesモジュールのc_ubyteクラスを使えばよさそうだが、当然ながら数値エミュレートまでは
実装されていない。ちょっと試しに派生して、+=操作だけを追加してみた。

profileしてみたがメソッド変数に直接アクセスするに比べて非常に遅い。
それと、GAEではctypesは使えない。



import ctypes
import types

class uint8_t(ctypes.c_ubyte):
    def __iadd__(self, other):  # +=
        if type(other) == types.IntType:
            self.value += other
        else:
            self.value += other.value
        return self

    def __int__(self):  # int()
        return self.value

    def __str__(self):
        return str(self.value)


(2012/11/14)
---

0 件のコメント: