如何直接使用 `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__(其中xSimpleClass 实例)时,Python 会找到SimpleClass__repr__ 属性,但随后无法将其识别为SimpleClass方法 - 不支持描述符协议(字符串方法没有__get__ 属性)。

似乎在 3.4 中,使用 lambda 会起作用,尽管我可以发誓它在以前的版本中必须是一个真正的函数。 functools.partial 不起作用。但是无论如何,您确实应该使用真正的功能。抱歉,它不像您想要的那样干燥。

【讨论】:

Lambdas 可以在 2.7 中做到这一点 感谢您的解释,但您确定使用__get__ 论证吗?根据我的发现,它与__self__ 属性有关。不管怎样,我得研究一下为什么方法绑定是这样设计的。 啊哈,真的是__get__。可惜官方文档里好像没有,我只好看了几篇博文。

以上是关于如何直接使用 `str.format` 作为 `__repr__`?的主要内容,如果未能解决你的问题,请参考以下文章

python字符串的format函数如何使用?

在vs2010 MFC 项目中使用int i=5;CString str;str.Format("%d",i);编译时报错,提示str.Format参数不对

c++中string str;str.Format(_T("%d"),num)"%d"是啥意思啊??

CString.Format汉字问题

str.Format(_T("%lf"),n1),转换的字符串会出现小数点后的一长串零,怎么去掉?

Python使用string.format添加前导零[重复]