2013-01-16 1 views
2

% r을 튜플과 함께 사용할 때 왜 다음과 같은 오류가 발생하는지 설명 할 수 있습니까?% r을 튜플과 함께 사용할 때 "모든 인수가 변환되지 않았습니다"라는 메시지가 나타나는 이유는 무엇입니까?

>>> repr((1,2)) 
'(1, 2)' 
>>> class Foo(object): 
...  def __init__(self,vals): 
...    self.vals=vals 
...  def __repr__(self): 
...    return "Foo(%r)" % self.vals 
... 
>>> foo = Foo((1,2)) 
>>> foo 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 5, in __repr__ 
TypeError: not all arguments converted during string formatting 

__repr__을 인쇄하는 적절한 방법은 무엇입니까? 대신 %srepr(self.vals)을 사용해야합니까?

+0

'% s'을 사용할 때 일어나는 일에 대해 쉽게 확인할 수 있습니다. 어떻게 물어보기 위해 여기에 왔어야한다고 생각하니? –

+2

@InbarRose :'%'문자열 형식 지정 연산자에 익숙하지 않은 사람에게는 예상치 못한 동작입니다. –

+0

@Inbar "튜플과 함께 % r을 사용할 때 왜 다음과 같은 오류가 발생하는지 설명 할 수 있습니까?" 나는이 질문을 한 이유 다. 왜 오류가 발생했는지 이해하고 가장 적절한 (Pythonic) 방법을 이해하는 데 관심이 있습니다. – Tim

답변

6

% 연산자는 튜플 자체를합니다, 그래서 당신은 기본적으로이 일을 :

가 하나의 요소 튜플에
'Foo(%r)' % (1, 2) 

self.vals가 :

는 원칙적으로
'Foo(%r)' % (self.vals,) 

는 당신이 문자열이 정의 사용할 수를 또한 변수 :

REPRFORMAT % (self.vals,) 

이 경우 해당 변수를 그대로두고 싶습니다. (구성 파일에서 가져온 것일 수도 있음) self.vals의 형식은 %r 또는 %s 일 수 있습니다.

또한 사용할 수있는 .format() method 대신 :

return 'Foo({0!r})'.format(self.vals) 

이 형식은 당신에게 주어진 입력에 더 많은 유연성을 제공; 당신은 예를 들어, vals 튜플에서 개별 항목을 해결할 수 : 귀하의 예를 들어 입력 Foo((0001, 04)) 초래

return 'Foo(({0[0]:04d}, {0[1]:02d}))'.format(self.vals) 

합니다.

+0

"권장"접근법에 대한 합의가 이루어 졌습니까? 개인적으로 나는 "Foo (% s)"% repr (self.vals)가 읽기 쉽다고 생각하지만 위에 언급했듯이 왜 % r을 사용하는지 궁금해합니다. – Tim

+1

@Tim :'.format()'문자열 형식화 메소드가'%'를 대체하기 위해 추가되었지만, 후자의 구문은 여전히 ​​파이썬 3에 매달려 있습니다. –

+0

@Tim : '% r'. –

관련 문제