• PEP 498 – Literal String Interpolation | Python.org in Python 3.6
  • ‘f’ 또는 ‘F’ 를 앞에 붙인 문자열 리터럴

    bar = 'World'
    
    f'Hello {bar}'
    # 'Hello World'

  • Formatted String Literals 또는 f-sting 이라고 부른다

  • 중괄호 {}로 감싸진 필드 안에 변수가 치환되며, 일반적인 파이썬 표현식도 실행된다. 심지어 Lambda 도 사용할 수 있다

    bar = ['a', 'b', 'c']
    
    # 파이썬 표현식 실행
    f'{(",".join(bar))}'
    # 'a,b,c'
    
    # Lambda 표현식
    f'{(lambda x: x*2)(3)}'
    
    # '6'

  • triple-quoted 을 통해 줄바꿈 문자열도 사용할 수 있다

    f'''안녕하세요
    저는 조은우입니다.
    반갑습니다.'''
    
    # '안녕하세요\n저는 조은우입니다.\n반갑습니다.'

  • f-string 표현식를 제외한 나머지는 보통 문자열이고, 이중 중괄호 {{, }}는 하나의 중괄호로 취급된다

    bar = 'Awesome Python'
    
    f'{{ {bar} }}'
    # '{ Awesome Python }'

  • 문자열 부분에서는 \n 같은 이스케이프 된 문자들도 사용할 수 있지만, f-string 표현식 안에서는 백슬래시를 사용할 수 없을 수도 있다

    ##### 잘못된 방법 #####
    f'{\'quoted string\'}'
    
    # 에러 출력 결과
    # File "<stdin>", line 1
    # SyntaxError: f-string expression part cannot include a backslash
    
    ##### 올바른 방법 #####
    # 다른 타입의 quote를 사용한다
    f'{"quoted string"}'
    # 'quoted string'
    
    # quote 를 출력하기 위해서는 따로 변수에서 선언한 후 치환 필드에서 사용한다
    bar = '\'quoted string\''
    
    f'{bar}'
    # "'quoted string'"

  • f-string 표현식 내 _conversion flag_와 format specifier 를 추가 할 수 있다.

    • Conversion Flag
      • !r - repr() 사용해서 변환
      • !s - str() 사용해서 변환
        import datetime
        bar = datetime.datetime.now()
        
        str(bar)
        # '2018-10-02 1109.189744'
        
        f'{bar}'
        # '2018-10-02 1109.189744'
        
        f'{bar!s}'
        # '2018-10-02 1109.189744'
        
        repr(bar)
        # 'datetime.datetime(2018, 10, 2, 11, 25, 9, 189744)'
        
        f'{bar!r}'
        # 'datetime.datetime(2018, 10, 2, 11, 25, 9, 189744)'
    • Format Specifier
      bar = 2
      
      f'{bar:10.2f}'
      # '      2.00'
      
      
      import datetime
      bar = datetime.datetime.now()
      
      f'{bar: %Y-%m-%d %H:%M:%S}'
      # ' 2018-10-02 1109'
  • Raw F-String 으로 선언하려면 ‘fr’ 접두사를 붙인다

    fr'안녕하세요\n저는 조은우입니다.\n반갑습니다.'
    # '안녕하세요\\n저는 조은우입니다.\\n반갑습니다.'

  • f-string 은 % 포맷팅과 .format() 메소드보다 빠르다

  • 참고 자료