gpt4 book ai didi

python - 在 python 中使用 str.format() 女巫类

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:13 27 4
gpt4 key购买 nike

我有一个带有 __getitem__() 函数的类,它可以像字典一样订阅。但是,当我尝试将它传递给 str.format() 时,我得到了一个 TypeError。我如何在 python 中使用带有 format() 函数的类?

>>> class C(object):
id=int()
name=str()

def __init__(self, id, name):
self.id=id
self.name=name

def __getitem__(self, key):
return getattr(self, key)

>>> d=dict(id=1, name='xyz')
>>> c=C(id=1, name='xyz')
>>>
>>> #Subscription works for both objects
>>> print(d['id'])
1
>>> print(c['id'])
1
>>>
>>> s='{id} {name}'
>>> #format() only works on dict()
>>> print(s.format(**d))
1 xyz
>>> print(s.format(**c))
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
print(s.format(**c))
TypeError: format() argument after ** must be a mapping, not C

最佳答案

正如一些评论提到您可以从 dict 继承,它不起作用的原因是:

If the syntax **expression appears in the function call, the expression must evaluate to a mapping, the contents of which are treated as additional keyword arguments. In the case of a keyword appearing in both expression and as an explicit keyword argument, a TypeError exception is raised.

要使其正常工作,您需要实现映射 ABC。类似这样的事情:

from collections.abc import Mapping


class C(Mapping):

id=int()
name=str()

def __init__(self, id, name):
self.id = id
self.name = name

def __iter__(self):
for x in self.__dict__.keys():
yield x

def __len__(self):
return len(self.__dict__)

def __getitem__(self, key):
return self.__dict__[key]

这样你就可以使用 s = '{id}{name}'.format(**c)
而不是 s = '{id}{name}'.format(**c.__dict__)

如果您希望能够像在字典中那样更改您的类变量,您还可以使用 collections.abc 模块中的 MutableMapping。 MutableMapping 还需要实现 __setitem____delitem__

关于python - 在 python 中使用 str.format() 女巫类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57181452/

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