>>> 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
作为基础不会。
答案 0 :(得分:3)
这是Python issue 28598。字节码评估循环中的%
{{1}}字符串格式化不检查字符串子类。它是fast path,所以请将Python更新为v3.6.1 +。