0

enum.Flag 型のインスタンス変数を持つクラスがあります。__getattr__名前で指定されたフラグのブール状態を返すことができるように実装します。

デバッグなしで実行すると、コードは正常に機能し、期待される出力が生成されます。

デバッグなしで実行されるコード サンプル。 コンソール出力。

ただし、Visual Studio デバッガー (VS 2019、16.7.4、Python 3.6、64 ビット) を使用して実行すると、常に__getattr__メソッドで停止し、正常に続行できるまで 100 回続行する必要があります。ブレークポイントが設定されていません。

__getattr__ で停止する VS 2019 デバッガー

IDLE でまったく同じコードをテストしました。IDLE は、デバッグ中にgetattrで停止しません!

デバッグ セッションを邪魔する迷惑な誤検知を取り除くにはどうすればよいですか?

from enum import Flag, auto
from copy import deepcopy

class MyFlags(Flag):
    FOO = auto()
    BAR = auto()
    BAZ = auto()

class Features:
    __slots__ = ('_features', )
    
    def __init__(self, bitmask):
        self._features = bitmask

    @property
    def bitmask(self):
        return self._features

    def __getattr__(self, attr):
        try:
            return bool(MyFlags[attr].value & self._features)

        except:
            raise AttributeError(attr)

f = Features(5)

print(f.bitmask)
print(f.FOO)
print(f.BAR)
print(f.BAZ)

f = Features(3)

print(f.bitmask)
print(f.FOO)
print(f.BAR)
print(f.BAZ)

g = deepcopy(f)

print(f.bitmask)
print(f.FOO)
print(f.BAR)
print(f.BAZ)
4

0 に答える 0