如何直接使用 `str.format` 作为 `__repr__`?
Posted
技术标签:
【中文标题】如何直接使用 `str.format` 作为 `__repr__`?【英文标题】:How can I use `str.format` directly as `__repr__`? 【发布时间】:2014-12-10 06:42:38 【问题描述】:假设我想调试一个带有属性myattribute
的简单类。我创建了一个像这样的repr
方法:
class SimpleClass:
def __repr__(self):
return "0.myattribute".format(self)
感觉有点多余,所以我宁愿直接用format
:
class SimpleClass:
__repr__ = "0.myattribute".format
...但是以IndexError: tuple index out of range
失败。我知道format
无法访问self
参数,但我不明白为什么。
我是不是做错了什么,这是 CPython 的限制 - 还是其他什么?
【问题讨论】:
你可以这样做__repr__ = lambda self: "0.myattribute".format(self)
,但我认为它比def
更糟糕
注意:不要那样做。
我的手动解释是,它可能与绑定和未绑定方法之间的区别有关。
【参考方案1】:
"0.myattribute".format
已经是字符串对象 ("0.myattribute"
) 上的绑定方法。因此,当调用代码尝试查找x.__repr__
(其中x
是SimpleClass
实例)时,Python 会找到SimpleClass
的__repr__
属性,但随后无法将其识别为SimpleClass
方法 - 不支持描述符协议(字符串方法没有__get__
属性)。
似乎在 3.4 中,使用 lambda
会起作用,尽管我可以发誓它在以前的版本中必须是一个真正的函数。 functools.partial
不起作用。但是无论如何,您确实应该使用真正的功能。抱歉,它不像您想要的那样干燥。
【讨论】:
Lambdas 可以在 2.7 中做到这一点 感谢您的解释,但您确定使用__get__
论证吗?根据我的发现,它与__self__
属性有关。不管怎样,我得研究一下为什么方法绑定是这样设计的。
啊哈,真的是__get__
。可惜官方文档里好像没有,我只好看了几篇博文。以上是关于如何直接使用 `str.format` 作为 `__repr__`?的主要内容,如果未能解决你的问题,请参考以下文章
在vs2010 MFC 项目中使用int i=5;CString str;str.Format("%d",i);编译时报错,提示str.Format参数不对
c++中string str;str.Format(_T("%d"),num)"%d"是啥意思啊??