더북(TheBook)

str 형식화 문자열에 bytes 인스턴스를 넘길 수는 있지만, 이 경우에는 여러분의 예상과 다르게 작동한다.

print('red %s' % b'blue')

>>>
red b'blue'

이 코드는 실제로 bytes 인스턴스의 __repr__ 메서드를 호출한(Better way 75: ‘디버깅 출력에는 repr 문자열을 사용하라’ 참고) 결과로 %s를 대신한다. 따라서 b'blue'가 출력에도 그대로 남는다.

두 번째 문제점은 (내장 함수인 open을 호출해 얻은) 파일 핸들과 관련한 연산들이 디폴트로 유니코드 문자열을 요구하고 이진 바이트 문자열을 요구하지 않는다는 것이다. 이로 인해 코드가 실행되지 않아 놀랄 수도 있다. 특히 파이썬 2에 익숙한 프로그래머라면 더 그렇다. 예를 들어 이진 데이터를 파일에 기록하고 싶다고 하자. 다음과 같이 간단해 보이는 코드도 오류가 발생한다.

with open('data.bin', 'w') as f:
    f.write(b'\xf1\xf2\xf3\xf4\xf5')

>>>
Traceback ...
TypeError: write() argument must be str, not bytes
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.