2017-10-20 9 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'도 기지로 문제가 있습니다. 기본으로 '바이트'하지 않습니다. – wim

답변

2

이것은 Python issue 28598입니다. 바이트 코드 평가 루프에서 % 문자열 형식화에 대한 fast path은 문자열 하위 클래스를 확인하지 않았습니다. fixed now이므로 Python을 v3.6.1 이상으로 업데이트하십시오.

+1

2.7과 3.5로 수정 사항을 백 포트했습니다. 그것은 2.7.14와 3.5.4의 일부입니다. –