読者です 読者をやめる 読者になる 読者になる

inspectでマクロもどき


inspect.currentframeを使うと、関数の呼び出し元のモロモロにアクセスできます。

ローカル変数の辞書にも。

すると、呼び出し元に好き勝手に変数を追加、つまりマクロ的なことが出来ちゃいます。



def def_getter(*names):
    frame = inspect.currentframe(1)
    locals = frame.f_locals
    for name in names:
        locals[name] = property(attrgetter("_" + name))
    
class AlphaBlend(object):
    def_getter(*"source dest sub".split())

    def __init__(self, source, dest, sub=False):
        self._source = source
        self._dest = dest
        self._sub = sub


AlphaBlendクラスに、source, dest, sub という、3つのプロパティを定義しています。

こうなるとRubyっぽいですね。



でも、果たしてinspectなんてヤバゲなモジュールを使った関数を使っていいものなのか?


それにしても、Pythonのプロパティは書きづらいですね。

デフォルトでは、自明なgetter, setterも手で書かないといけませんし。

新しい文法入れてでも改善して欲しいです。

それとも、プロパティなんて使うなってことなんでしょうか?