2

Python 2.6の記述子プロトコルは、クラス定義に対してのみ定義されているため、インスタンスでのみ使用できます。

グローバルのget/setをインストルメント化するのに相当するものはありますか?

ホストシステムと相互作用するモジュールのインポートを高速化しようとしているため、ホストの高価なプロービングを実行する必要があります。(高価な)プローブの結果は、インポート時に初期化されるグローバルモジュールに保存されます。だから私は絶対に必要になるまで初期化を遅らせようとしています。

グローバルが悪であるというコメントはありません。私はそれらが何であるか、そしてそれらをいつ使用するかを知っています。

私の現在の計画は、記述子を使用するグローバルインスタンスを作成し、現在のすべてのグローバルをこのインスタンスの属性に移動することです。これでうまくいくと思います。私はただ別の方法があるかどうか尋ねています。

4

2 に答える 2

2

私の現在の計画は、記述子を使用するグローバルインスタンスを作成し、現在のすべてのグローバルをこのインスタンスの属性に移動することです。これでうまくいくと思います。私はただ別の方法があるかどうか尋ねています。

それはまさに私がすることです。クラス外の記述子に相当するものはありません。

私が時々使用した他のオプションは、変数名の代わりに次のような関数を使用することです。

_expensive_to_compute = None
def get_expensive_to_compute():
    global _expensive_to_compute
    if _expensive_to_compute is None:
        _expensive_to_compute = do_computation()
    return _expensive_to_compute

すでに@memoizeどこかにデコレータが定義されている場合は、上記を大幅に簡略化できます。

于 2010-08-23T16:48:13.733 に答える
1

あなたが本当にこれをしたいのなら、このリンクは実装するためのかなりクールな方法を提供します。唯一の注意点は、eval / exec/execfileを使用してコードを実行する必要があることです。

https://mail.python.org/pipermail/python-ideas/2011-March/009657.html

class MyDict:
    def __init__(self, mapping):
        self.mapping = mapping
    def __getitem__(self, key):
        value = self.mapping[key]
        if hasattr(value, '__get__'):
            print('Invoking descriptor on', key)
            return value.__get__(key)
        print('Getting', key)
        return value
    def __setitem__(self, key, value):
        self.mapping[key] = value

class Property:
    def __init__(self, getter):
        self.getter = getter
    def __get__(self, key):
        return self.getter(key)

if __name__ == '__main__':   
    md = MyDict({})
    md['x'] = 10
    md['_y'] = 20
    md['y'] = Property(lambda key: md['_'+key])
    print(eval('x+y+1', {}, md))

少し面倒ですが、とてもかっこいいと思いました。

于 2014-07-01T01:51:56.293 に答える