Python: !r 문자열 형식과 __repr__() 및 __str__() 메서드.

11966 단어 reprformatstrpython
!r 문자열 형식은 특정한 경우에 사용하기에 편리한 형식입니다. 이는 __repr__() dunder 메서드와 밀접하게 관련되어 있습니다. 이 메서드와 __str__()은 종종 함께 논의됩니다. 이 게시물에서는 __repr__() 및 __str__() 메서드와 !r 문자열 형식을 검토합니다.

문자열 형식 !r의 사용 예:

fmt_data = '{!r:^12} {!r:^15} {!r:^10}'


!r에서 PEP 3101 – Advanced String Formatting 상태:

!r - convert the value to a string using repr().

https://peps.python.org/pep-3101/#explicit-conversion-flag



repr() 및 str() 공식 문서는 다음 링크에서 찾을 수 있습니다. ="_blank">객체.__str_(자신)

원래:

  • repr(object) 호출 class str(object='') ; 우리는 나중에 우리 자신의 코드로 구현합니다.

  • object.__repr_(self) 호출 https://docs.python.org/3/reference/datamodel.html#object ; 우리는 나중에 우리 자신의 코드로 구현합니다.

  • repr(object)의 목적은 객체 인스턴스에 대해 사람이 읽을 수 있는 친숙한 문자열 표현을 제공하는 것입니다.

  • object.__repr__(self)의 목적은 개체 인스턴스의 문자열 표현을 제공하는 것이며, class str(object='') 함수는 이 문자열을 가져와 문자열이 생성된 동일한 원래 개체 인스턴스로 변환할 수 있어야 합니다.

  • 예를 들어 설명하겠습니다.

    class Person( object ):
        def __init__( self, given_name, surname ):
            self.__given_name = given_name
            self.__surname = surname
    
        def __repr__( self ):
            fmt = u"{}(given_name='{}', surname='{}')"
    
            return fmt.format( self.__class__.__name__, \
                self.__given_name, self.__surname )
    
        def __str__( self ):
            fmt = u"{}: Given Name: '{}', Surname: '{}')"
    
            return fmt.format( self.__class__.__name__, \
                self.__given_name, self.__surname )
    


    -- 이 예제를 다른 곳에서 복사했는지 궁금할 경우를 대비하여... 😂, 이 주제를 설명하는 데 사용되는 매우 인기 있는 예제이며 약간의 조정도 했습니다.

    작동 방식을 살펴보겠습니다.

    person = Person( 'Văn Bé Hai', 'Nguyễn' ) 
    # My full name, written in Vietnamese: Nguyễn Văn Bé Hai 😂
    
    print( person.__str__() )
    print( str( person ) )
    print( '---' )
    print( person.__repr__() )
    print( repr( person ) )
    


    예상대로 object_instance.__str__() 및 str( object_instance ) 의 출력은 동일합니다. object_instance.__repr__() 및 repr( object_instance )도 마찬가지입니다.

    Person: Given Name: 'Văn Bé Hai', Surname: 'Nguyễn')
    Person: Given Name: 'Văn Bé Hai', Surname: 'Nguyễn')
    ---
    Person(given_name='Văn Bé Hai', surname='Nguyễn')
    Person(given_name='Văn Bé Hai', surname='Nguyễn')
    


    계속해서 person.__repr__()이 object.__str__(self)과 어떻게 작동하는지 살펴보겠습니다.

    repr_str = person.__repr__()
    person1 = eval( repr_str )
    print( str( person1 ) )
    


    예상대로 작동합니다.

    Person: Given Name: 'Văn Bé Hai', Surname: 'Nguyễn')
    


    이제 객체 인스턴스 person 및 person1을 사용하여 !r 문자열 형식을 시도합니다.

    print( '"person" instance reads: {!r}'.format(person) )
    print( '"person1" instance reads: {!r}'.format(person1) )
    


    그리고 우리는 다음을 얻습니다.

    "person" instance reads: Person(given_name='Văn Bé Hai', surname='Nguyễn')
    "person1" instance reads: Person(given_name='Văn Bé Hai', surname='Nguyễn')
    


    -- !r 형식은 결국 __repr__()을 호출합니다.

    Person 클래스로 돌아가서 두 변수 fmt에서 중괄호 쌍( '{}') 주위의 큰 작은따옴표를 제거하고 {!r}을 사용할 수 있습니다.

    class Person( object ):
        ...
    
        def __repr__( self ):
            # fmt = u"{}(given_name='{}', surname='{}')"
            fmt = u"{}(given_name={!r}, surname={!r})"
            ...     
    
        def __str__( self ):
            # fmt = u"{}: Given Name: '{}', Surname: '{}')"
            fmt = u"{}: Given Name: {!r}, Surname: {!r})"
            ...     
    


    마지막으로 이 게시물의 시작 부분에 나열된 예를 살펴보겠습니다. fmt_data = '{!r:^12} {!r:^15} {!r:^10}' -- 이 공식 문서를 참조하십시오object.__str__(self). 훨씬 더 많은 정보를 위해. 간단히 말해서 ^는 지정된 너비 내에서 문자열을 중앙에 배치합니다. 이 예에서 너비는 각각 12, 15 및 10입니다. 세 개의 부울 필드가 있고 중간에 테이블 형식으로 표시하고 싶습니다. 길이가 다른 3개의 헤더 중:

    create_own = False
    create_other = False 
    view_own = True
    
    fmt_header = '{:^12} {:^15} {:^10}'
    fmt_data = '{!r:^12} {!r:^15} {!r:^10}'
    
    print( fmt_header.format('Create Own', 'Create Other', 'View Own' ) )
    print( fmt_data.format(create_own, create_other, view_own) )
    


    출력은 다음과 같습니다.

     Create Own   Create Other    View Own
       False          False         True
    


    이것이 "!r 문자열 형식은 특정 경우에 사용하기에 편리한 형식입니다."에서 의미하는 바입니다.

    Python은 문자열 형식화 측면에서 많은 것을 제공하는 것 같습니다. 저는 이 정보가 매우 유용하다고 생각합니다. 그리고 당신도 그러길 바랍니다. 나는 확실히 이 포스트를 쓰는 것을 즐긴다. 읽어주셔서 감사하고 항상 안전하세요.

    좋은 웹페이지 즐겨찾기