为什么__rmod__不适合字符串?

时间:2017-10-20 17:56:57

标签: python python-3.x string-formatting subclassing

>>> class MyInt(int):
...     def __rmod__(self, other):
...         return 42
...     
>>> class MyStr(str):
...     def __rmod__(self, other):
...         return 'wat'
...     
>>> 0 % MyInt()
42
>>> '%r' % MyStr()
"''"

为什么int子类能够从反射端控制此BinOp,但str不能?这似乎与记录的datamodel相矛盾。

我希望使用该功能创建一个非侵入式和向后兼容的扩展,为logging框架提供大括号样式的处理程序/格式化程序,但这阻碍了我的发展。那是一个错误吗?

Linux上的Python 3.6.0 。使用collections.UserString作为基类也存在问题。使用bytes作为基础不会。

1 个答案:

答案 0 :(得分:3)

这是Python issue 28598。字节码评估循环中的% {{1}}字符串格式化不检查字符串子类。它是fast path,所以请将Python更新为v3.6.1 +。