1

次の方法で、継承を介して Python オブジェクトにタグを追加する邪悪なスキームを考案しました。

def tag(val, tag_cls):
    val_cls = type(val)
    class tagged_cls(val_cls, tag_cls):
        pass
    tagged_cls.__name__ = '{}({})'.format(tag_cls.__name__, val_cls.__name__)
    return tagged_cls(val)

# Example tags
class Foo: pass
class Bar: pass

def foo(val): return tag(val, Foo)
def bar(val): return tag(val, Bar)

したがって、値をこれらでラップすると、比較時に元の値とまったく同じように動作しますが、追加情報が含まれます。

>>> k = foo('key')
>>> k
'key'
>>> k == 'key'
True
>>> {'key': 'value'}[k]
'value'
>>> isinstance(k, Foo)
True
>>> isinstance(k, Bar)
False

上記は機能しますが、これは少し巧妙すぎると感じており、確かにもっとPythonicな方法があります。

もっと良い方法はありますか?上記のアプローチですぐに何か問題がありますか?

4

0 に答える 0