2017-10-20 7 views
0
>>> class MyInt(int): 
...  def __rmod__(self, other): 
...   return 42 
...  
>>> class MyStr(str): 
...  def __rmod__(self, other): 
...   return 'wat' 
...  
>>> 0 % MyInt() 
42 
>>> '%r' % MyStr() 
"''" 

Warum ist die int Unterklasse der Lage, diese BinOp von der reflektierten Seite zu kontrollieren, aber str nicht? Dies scheint dem dokumentierten datamodel zu widersprechen.Warum funktioniert __rmod__ nicht richtig für Strings?

Ich hatte gehofft, um die Funktion zu verwenden, um eine nicht-intrusive und rückwärtskompatible Erweiterung bietet geschweiften Klammern-Stil-Handler/Formatierer für die logging Rahmen zu schaffen, aber das hielt mich in meinen Tracks. Ist das ein Fehler?

+1

[This] (https://bugs.python.org/issue28598) scheint relevant. – vaultah

+0

Python 3.6.0 unter Linux. 'collections.UserString' als Basis hat auch das Problem. 'Bytes' als Basis nicht. – wim

Antwort

2

Dies ist Python issue 28598. Die fast path für % String-Formatierung in der Bytecode-Auswertungsschleife prüfte nicht auf String-Unterklassen. Es ist fixed now, also aktualisiere dein Python auf v3.6.1 +.

+1

Ich habe den Fix auch auf 2.7 und 3.5 zurückportiert; es ist Teil von 2.7.14 und 3.5.4. –

Verwandte Themen