gpt4 book ai didi

python - 如果转换为序列或映射,则要进行不同转换的类

转载 作者:行者123 更新时间:2023-12-01 00:47:05 25 4
gpt4 key购买 nike

考虑以下玩具类:

class Something(object):
def __init__(self, a, b):
self.a = a
self.b = b

def __iter__(self):
yield ('a', self.a)
yield ('b', self.b)

x = Something(1, 2)

print(tuple(x))
# (('a', 1), ('b', 2))
print(dict(x))
# {'a': 1, 'b': 2}

但是,我希望它的行为如下:

print(tuple(x))
# (1, 2)
print(dict(x))
# {'a': 1, 'b': 2}

我怎样才能做到这一点?

<小时/>

编辑

我很清楚这可以明确实现,例如(遵循dict()命名约定):

class Something(object):
def __init__(self, a, b):
self.a = a
self.b = b

def items(self):
yield ('a', self.a)
yield ('b', self.b)

def values(self):
yield self.a
yield self.b

但显然,某些对象在分别转换为 dict()tuple() 时,行为确实有所不同。例如, dict() 本身的行为(还有,例如 collections.OrderedDict 以及 collections 模块中的其他映射)类似的东西(使用,而我想获得)就好了:

import collections

dd = collections.OrderedDict((('a', 1), ('b', 2)))

print(dict(dd))
{'a': 1, 'b': 2}

print(tuple(dd))
('a', 'b')

print([x for x in dd])
['a', 'b']

编辑2:

另一种看待这个问题的方式是,当某些东西通过 dict() 时,它的行为会有所不同,具体取决于 __iter__type 或外观就像有时它依赖于__iter__,有时它依赖于其他东西。问题是其他东西是什么(或者在这个级别发生什么样的类型检查),如何访问这种替代行为并最终讨论潜在的限制。

我很可能最终无法用 Python 制作一个具有我所描述的行为的自定义类 Something,因为例如__iter__ 必须返回映射的键。

最佳答案

要么声明专用方法:

class Something(object):
def __init__(self, a, b):
self.a = a
self.b = b

def to_dict(self):
return dict(self)

def to_tuple(self):
return tuple((y for _, y in self))

def __iter__(self):
yield ('a', self.a)
yield ('b', self.b)

x = Something(1, 2)

print(x.to_tuple())
# (1, 2)
print(x.to_dict())
# {'a': 1, 'b': 2}

或者您稍微修改一下将类转换为元组的方式:

print(tuple((y for _, y in x)))
# (1, 2)
print(dict(x))
# {'a': 1, 'b': 2}

But the behaviour you would like your class to have would lead to a very tricky stituation, where the output of your __iter__ method would be different following the type you are converting this output afterward...

关于python - 如果转换为序列或映射,则要进行不同转换的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56882899/

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