使用Python中的元数据标记任意值

时间:2012-05-10 12:26:21

标签: python

我设计了一个恶意方案,通过以下方式继承向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方式来做。

有更好的方法吗?上述方法有什么问题吗?

0 个答案:

没有答案