gpt4 book ai didi

python - hashables 的瘦代理类

转载 作者:行者123 更新时间:2023-11-28 21:53:47 31 4
gpt4 key购买 nike

我需要某种薄包装对象来标记字典键,例如:

d = {
Required('name'): str,
Optional('age'): int,
}

并且这些包装器的行为应该像被包装的对象(比较、散列等):

marked = Required('name')
marked == 'name' #-> True
d[marked] = 'hello'
d['name'] #-> 'hello'

有一个额外的属性:它应该记住添加的类:

isinstance(marked, Required)  #-> True

并且添加的类应该有自定义方法。

这实际上类似于可哈希对象的混合。


我不喜欢那些重量级的Proxy Patterns它模仿所有特殊属性并考虑以下想法:

class Wrapper(object):
def __new__(cls, value):
value_type = type(value)
Type = type(
value_type.__name__, # same name
(cls, value_type), # Wrapper + bases
{})
Type.__new__ = value_type.__new__ # prevent recursion
return Type(value)

# Override method
def __repr__(self):
return 'Wrapper({})'.format(self)

更好的想法?

最佳答案

您的 Wrapper 类可以工作,是的。但是,如果您想要的 只是一个包装器来充当具有额外方法的替代键,那么我将创建一个专用类。 此处显式优于隐式

这个类只需要代理 __eq____hash__方法:

class HashableProxy(object):
def __init__(self, wrapped):
self._wrapped = wrapped

def __eq__(self, other):
return self._wrapped == other

def __hash__(self):
return hash(self._wrapped)

class Required(HashableProxy):
pass

class Optional(HashableProxy):
pass

您可以根据需要向其中添加方法。

演示:

>>> marked = Required('name')
>>> marked == 'name'
True
>>> d = {}
>>> d[marked] = 'hello'
>>> d['name']
'hello'
>>> isinstance(marked, Required)
True

关于python - hashables 的瘦代理类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25510668/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com