2017-10-20 15 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() 
"''" 

intのサブクラスは、このBinOpを反射側から制御することができますが、strはできないのですか?これは文書化されたdatamodelと矛盾しているようです。文字列に対して__rmod__が正しく動作しないのはなぜですか?

この機能を使用して、loggingフレームワークの中括弧スタイルのハンドラ/フォーマッタを提供する、非侵入型の下位互換性のある拡張機能を作成したいと考えていましたが、それはバグですか?

+1

[This](https://bugs.python.org/issue28598)が適切と思われます。 – vaultah

+0

LinuxのPython 3.6.0。ベースとしての 'collections.UserString'にも問題があります。ベースとなる 'bytes'はそうではありません。 – wim

答えて

2

これはPython issue 28598です。 %fast pathバイトコード評価ループでの文字列書式設定では、文字列サブクラスのチェックが行われていませんでした。それはfixed nowだから、あなたのPythonをv3.6.1 +にアップデートしてください。

+1

私は修正を2.7と3.5にもバックポートしました。それは2.7.14と3.5.4の一部です。 –

関連する問題