Programming/Python

[Python] Multi-line string Cheet Sheet

Jonghyuk Baek 2022. 1. 10. 21:00

Introduction

가끔 그럴 때가 있다.

 

95자나 105자 같이 PEP 8 규약 (참고) 혹은 팀에서 정해놓은 한 줄 길이 제한에 맞추어 코드를 작성해야 하는데, 어떻게 작성하려 해도 explainability를 유지한 채로 한 줄에 다 못 넣겠는 경우가 있다.

 

특히 베이스로 들어가 있는 인덴트 (하나당 네 칸을 잡아먹는다) 갯수가 많을 수록 문제는 심각해진다.

 

일반적인 코드야 새 변수를 선언하고 괄호로 예쁘게 묶고 하는 식으로 무조건 해결할 수 있는 편인데, 뭔가 에러를 raise 하면서 같이 출력해야 하는 에러 메시지 처럼 긴 스트링을 작성해야 하는 경우엔 도통 어떻게 잘라서 줄나눔을 해야 하는지 굉장히 헷갈리는 경우가 많다.

assert isinstance(dataset, ConcatDataset), "CustomDataLoader class only supports ConcatDataset class."

길다......

 

그래서.. 오늘은 파이썬에서 스트링을 여러 줄에 걸쳐 작성할 수 있는 방법들을 정리해 보려고 한다. 본인 치트시트 용도로도 쓸 생각이다.

 

일정이 급한 사람은 맨 아래의 CheetSheet 항목으로 바로 스킵하도록 하자!


1. Triple quotes

s = """This is a
Multi-line
String!"""
print(s)

>>>
This is a
Multi-line
String!

Triple quotes (""" 혹은 ''') 로 여러 줄에 걸친 라인을 감싸면 그대로 여러 줄에 걸쳐 출력되는 스트링으로 만들어 준다. 본인은 triple quotes가 독스트링에만 쓰이는 것인 줄 알았는데 이런 식으로 다중 라인을 한 번에 작성하고 출력할 때도 쓰이는 것 같다. (독스트링 참고)

 

스트링 안에서의 줄띄움은 그대로 반영되기 때문에, 줄띄움을 포함시키고 싶지 않다면 다른 방법을 사용하거나 아래처럼 newline 캐릭처 (\n) 를 빈칸이나 "" 로 replace 시켜 주어야 한다.

print(s.replace("\n", " "))
>>> This is a Multi-line String!

다만 이 방법의 치명적인 단점은 가독성을 위한 indent도 모조리 스트링에 반영된다는 것이다... 예쁘게 꾸미기가 불가능하다고 볼 수 있다.

s = """
    This is a
    Multi-line
    String!
    """
print(s)

>>>
    This is a         
    Multi-line        
    String!

기본 인덴트가 있으면 하나 당 공백 4개씩으로 인식하고 스트링에 넣어버린다..........

2. Parentheses

s = (
    "This is a "
    "Multi-line "
    "String!"
)
print(s)

>>>
This is a Multi-line String!

괄호를 이용해 여러 스트링을 묶으면, 모두 묶어서 하나의 스트링으로 만들어 준다. 묶일 때는 띄어쓰기가 패딩되어 들어가지 않고 바로 이어져 버리기 때문에, 만약 띄어서 붙이고 싶다면 위 예시처럼 스트링 뒷 단에 빈 칸을 넣어 주어야 한다.

 

만약 줄 띈 채로 묶고 싶다면 아래처럼 뒷단에 \n을 넣어주면 된다.

s = (
    "This is a\n"
    "Multi-line\n"
    "String!"
)
print(s)

>>>
This is a
Multi-line
String!

이런 식으로 괄호로 묶는 경우, 런타임이 아닌 컴파일 시점에서 string concatenation이 진행된다는 특징이 있다.

3. Backslash

s = "This is a " \
    "Multi-line " \
    "String!"
print(s)

>>>
This is a Multi-line String!

s = "This is a\n" \
    "Multi-line\n" \
    "String!"
print(s)

>>>
This is a
Multi-line
String!

여러 라인 사이에 백슬래시 (\) 를 넣어도 이어서 한 스트링을 만들어 준다. 여기서도 중간에 줄띄움이나 공백이 필요할 경우 알아서 넣어 주어야 한다.

4. join( )

s = "".join(
    (
        "This is a ",
        "Multi-line ",
        "String!"
    )
)
print(s)

>>>
This is a Multi-line String!

join() 내장 함수를 이용해서 스트링을 이을 수도 있다. 이 경우에는 join의 대상이 되는 스트링에 빈 스트링 "" 대신 빈칸이 하나 포함된 스트링 " " 이나 줄띄움이 적힌 스트링 "\n" 을 넣을 경우 스트링들 사이에 공백이나 줄띄움을 자동으로 넣어줄 수 있다.

s = " ".join(
    (
        "This is a",
        "Multi-line",
        "String!"
    )
)
print(s)

>>>
This is a Multi-line String!

s = "\n".join(
    (
        "This is a",
        "Multi-line",
        "String!"
    )
)
print(s)

>>>
This is a
Multi-line
String!

5. + operator

s = (
    "This is a "
    + "Multi-line " 
    + "String!"
)
print(s)

>>>
This is a Multi-line String!

s = (
    "This is a\n"
    + "Multi-line\n" 
    + "String!"
)
print(s)

>>>
This is a 
Multi-line
String!

스트링 간 덧셈 연산으로 여러 줄의 스트링을 이을 수도 있다. 다만 이 경우 + 단독으로는 줄띄움이 불가능하므로, 괄호 등으로 묶어 주는 수고를 들여야 한다. 마찬가지로 공백이나 \n은 수동으로 넣어 주어야 한다.

 

괄호로 묶는 케이스와 달리 이 경우엔 런타임 시점에서 concatenation이 진행된다.

 

.

.

.

 

마지막으로 모든 내용을 한 장에 정리하고 마치겠다.

 

Multi-line string Cheet Sheet

Concatenated version

## Print output: This is a Multi-line String!

# 1. Triple quote
s = """This is a
Multi-line
String!""".replace("\n", " ")

# 2. Parentheses
s = (
    "This is a "
    "Multi-line "
    "String!"
)

# 3. Backslash
s = "This is a " \
    "Multi-line " \
    "String!"

# 4-1. join()
s = "".join(
    (
        "This is a ",
        "Multi-line ",
        "String!"
    )
)

# 4-2. join()
s = " ".join(
    (
        "This is a",
        "Multi-line",
        "String!"
    )
)

# 5. + operator
s = (
    "This is a "
    + "Multi-line " 
    + "String!"
)

New-line version

## Print output: This is a\nMulti-line\nString!

# 1. Triple quote
s = """This is a
Multi-line
String!"""

# 2. Parentheses
s = (
    "This is a\n"
    "Multi-line\n"
    "String!"
)

# 3. Backslash
s = "This is a\n" \
    "Multi-line\n" \
    "String!"

# 4. join()
s = "\n".join(
    (
        "This is a",
        "Multi-line",
        "String!"
    )
)

# 5. + operator
s = (
    "This is a\n"
    + "Multi-line\n" 
    + "String!"
)

아래는 참고할 만한 사이트이다.

References

Pythonic way to create a long multi-line string

https://stackoverflow.com/questions/10660435/pythonic-way-to-create-a-long-multi-line-string

Multiline String in Python with Examples

https://www.techbeamers.com/python-multiline-string/

반응형