Python __str__ 및 목록


107

Java에서 List.toString ()을 호출하면 List 내의 각 객체에 대해 toString () 메서드가 자동으로 호출됩니다. 예를 들어, 내 목록에 o1, o2 및 o3 객체가 포함 된 경우 list.toString ()은 다음과 같습니다.

"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"

Python에서 유사한 동작을 얻을 수있는 방법이 있습니까? 클래스에서 __str __ () 메서드를 구현했지만 다음을 사용하여 객체 목록을 인쇄 할 때 :

print 'my list is %s'%(list)

다음과 같이 보입니다.

[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]

파이썬이 목록 내의 각 요소 (또는 그 문제에 대한 dict)에 대해 자동으로 __str__을 호출하도록 할 수 있습니까?


답변:


133

파이썬 목록에서 문자열을 호출하면 __repr__내부의 각 요소에 대한 메서드가 호출 됩니다. 일부 항목 __str____repr__동일합니다. 해당 동작을 원하면 다음을 수행하십시오.

def __str__(self):
    ...
def __repr__(self):
    return self.__str__()

7
로 식별 __str__하는 __repr__것은 일반적으로 Python 데이터 모델 과 일치하지 않으므로 @ daniel-lew가 제안한 목록 이해 솔루션은 더 비단뱀 적입니다.
Ioannis Filippidis 2014-04-04

2
논쟁이 없습니다. 나는 질문에 대답했는데, 그것은 종종 파이썬을 처음 접하는 사람들이 문제에 대해 생각하고 싶어하는 방법이지만 그것이 대답하는 가장 좋은 방법이라는 의미는 아닙니다.
David Berger

1
Python은 자체 데이터 모델과 일치해야하며 모든 기본 요소와 집계에 대해 동일한 작업을 수행해야합니다.
Terrence Brannon

2
파이썬 목록의 기본 동작이 잘못되었다고 생각합니다. 내부의 각 개별 요소에 대해 str()반환되는 목록에서 기대할 수 str()있습니다.
SuperGeo

21

목록 이해 를 사용하여 각 항목이 str () 'd 자동으로 새 목록을 생성 할 수 있습니다 .

print([str(item) for item in mylist])

6
또는 단지 print(map(str, mylist))- 그것은 작은 조금 짧은
anula

4
myList에있는 항목도 목록 수 있습니다 경우이 한 가지 문제는
Breandán 달튼

7

당신이 할 수있는 두 가지 쉬운 일은 map기능을 사용하거나 이해력을 사용하는 것입니다.

그러나 그것은 문자열이 아닌 문자열 목록을 얻습니다. 따라서 현을 함께 연결해야합니다.

s= ",".join( map( str, myList ) )

또는

s= ",".join( [ str(element) for element in myList ] )

그런 다음이 복합 문자열 객체를 인쇄 할 수 있습니다.

print 'my list is %s'%( s )

4

해당 출력을 사용하려는 대상에 따라 __repr__더 적절할 수 있습니다.

import unittest

class A(object):
    def __init__(self, val):
        self.val = val

    def __repr__(self):
        return repr(self.val)

class Test(unittest.TestCase):
    def testMain(self):
        l = [A('a'), A('b')]
        self.assertEqual(repr(l), "['a', 'b']")

if __name__ == '__main__':
    unittest.main()

3

나는 이것을하기 위해 목록 이해력을 사용하는 것에 대한 이전 답변에 동의하지만, 그것이 당신의 보트를 떠 다니는 것이면 함수 뒤에 숨길 수 있습니다.

def is_list(value):
    if type(value) in (list, tuple): return True
    return False

def list_str(value):
    if not is_list(value): return str(value)
    return [list_str(v) for v in value]

재미를 위해 list_str ()을 재귀 적으로 str () 목록에 포함 된 모든 것을 만들었습니다.


구현할 때 +1 유용 __str__하고 __repr__개별적으로
빈센트는 엄숙


0

이것으로 충분합니다.

목록과 다른 컨테이너 클래스를 인쇄 할 때 포함 된 요소는 내부 객체 표현에 사용 __repr__되기 때문에를 사용하여 인쇄 __repr__됩니다. 전화하면 다음과 같이 help(object.__repr__)알려줍니다.

Help on wrapper_descriptor:

__repr__(self, /)
    Return repr(self).

그리고 호출 help(repr)하면 다음과 같이 출력됩니다.

Help on built-in function repr in module builtins:

repr(obj, /)
    Return the canonical string representation of the object.

    For many object types, including most builtins, eval(repr(obj)) == obj.

__str__객체에 대해 구현되고 그렇지 않은 경우 구현 __repr__되지 않은 경우 repr(obj)와 마찬가지로 기본 출력을 출력 하지 않습니다 print(obj).

따라서 유일한 방법은 __repr__클래스 를 구현 하는 것입니다. 이를 수행하는 한 가지 가능한 방법은 다음과 같습니다.

class C:           
    def __str__(self):
        return str(f"{self.__class__.__name__} class str ")

C.__repr__=C.__str__       
ci = C()    


print(ci)       #C class str 
print(str(ci))  #C class str 
print(repr(ci)) #C class str 

-3

당신이 얻는 출력은 객체의 모듈 이름, 클래스 이름, 그리고 다음과 같은 16 진수 메모리 주소입니다. __repr__ 함수가 재정의되지 않았기 .

__str__print를 사용할 때 객체의 문자열 표현에 사용됩니다. 그러나 객체 목록을 str인쇄하고 각 항목에 대한 메서드 를 호출 하기 위해 목록을 반복하지 않기 때문에 객체 표현을 인쇄합니다.

__str__함수를 호출 하려면 다음과 같이해야합니다.

'my list is %s' % [str(x) for x in myList]

__repr__함수 를 재정의하면 이전과 같이 인쇄 방법을 사용할 수 있습니다.

class cell:
    def __init__(self, id):
        self.id = id
    def __str__(self):
        return str(self.id) # Or whatever
    def __repr__(self):
        return str(self) # function invoked when you try and print the whole list.

myList = [cell(1), cell(2), cell(3)]
'my list is %s' % myList

그러면 my list is [1, 2, 3]출력으로 " "가 표시됩니다.


이 답변은 완전히 관련없는 질문에 대한 답변 인 것 같습니다. 올바른 위치에 놓았습니까?
Blckknght

yes Blckknght 내가 내 대답을주고 싶었던이 페이지에는 다른 게시물에서이 페이지에 대한 링크가있었습니다. 그래서 여기에 나를 안내했고 질문을 한 사람이 다시 여기로 와서 내 대답을 볼 것이라고 가정하여 여기에 대답합니다. 불편 함 !!!
panagiwtis koligas

다른 질문이이 질문의 중복으로 종료 된 경우 여기에 있는 기존 답변이 이미 다른 질문을 처리해야 한다고 가정합니다 . 그렇지 않은 경우 여기에 이해할 수없는 답변을 게시하는 대신 해당 질문을 다시 열도록 플래그를 지정해야합니다. 거의 확실하게 삭제됩니다. 이제 여기에있는 8 개의 다른 답변 중 하나에서 다루지 않는 말이있을 수 있지만, 답변하는 질문이므로이 페이지의 맥락에서 답을 이해할 필요가 있습니다. 그리고 두 개의 동일한 답변을 게시하지 마십시오!
Blckknght

1
오, 이제 다시 살펴 보았지만 @charliebeckwith가 설명 할 수없는 이유로 자신의 답변을 게시하는 대신 완전히 다른 게시물로 편집 한 것 같습니다. 즉 ... 일반적으로 방법 편집 작업이 아니다
Blckknght

@blckknght 나는 대답이 얼마나 떨어져 있는지 깨닫기 전에 그것을 편집하기 시작했습니다. 내가 왜 계속했는지 완전히 설명 할 수 없습니다.
charliebeckwith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.