인라인 변수로 여러 줄 Python 문자열을 어떻게 생성합니까?


102

여러 줄 Python 문자열 내에서 변수를 사용하는 깨끗한 방법을 찾고 있습니다. 다음을 수행하고 싶다고 가정합니다.

string1 = go
string2 = now
string3 = great

"""
I will $string1 there
I will go $string2
$string3
"""

$Python 구문에서 변수를 나타내는 Perl 과 비슷한 것이 있는지 확인하고 있습니다 .

그렇지 않다면-변수로 여러 줄 문자열을 만드는 가장 깨끗한 방법은 무엇입니까?

답변:


158

일반적인 방법은 format()기능입니다.

>>> s = "This is an {example} with {vars}".format(vars="variables", example="example")
>>> s
'This is an example with variables'

여러 줄 형식 문자열에서 잘 작동합니다.

>>> s = '''\
... This is a {length} example.
... Here is a {ordinal} line.\
... '''.format(length='multi-line', ordinal='second')
>>> print(s)
This is a multi-line example.
Here is a second line.

변수와 함께 사전을 전달할 수도 있습니다.

>>> d = { 'vars': "variables", 'example': "example" }
>>> s = "This is an {example} with {vars}"
>>> s.format(**d)
'This is an example with variables'

(구문 측면에서) 요청한 것과 가장 가까운 것은 템플릿 문자열 입니다. 예를 들면 :

>>> from string import Template
>>> t = Template("This is an $example with $vars")
>>> t.substitute({ 'example': "example", 'vars': "variables"})
'This is an example with variables'

이 format()기능은 쉽게 사용할 수 있고 가져 오기 라인이 필요하지 않기 때문에 더 일반적이라고 덧붙여 야합니다 .


2
사용할 수 vars()또는 locals()문제의 사전으로
— 이스마일 바다 위를

2
@isbadawi 명시적인 것이 암시적인 것보다 낫습니다. 필요한 변수 만 전달하는 것이 좋습니다. 문자열이 사용자에 의해 제공되기 때문에 필요한 것이 무엇인지 모른다면 "변수"는 dict어쨌든 항목이어야 합니다.
— agf 2011-04-11

두 번째 솔루션은 가장 깨끗한 IMO입니다. 여러 줄 스팅 내에서 사전의 명확한 변수 이름과 함께 사전. 이 방법을 사용하겠습니다. 감사. 아래에도 많은 훌륭한 답변이 있지만 이것은 완벽했습니다.
— evolution

@SimeonVisser, "string".format (...)은 레거시 Python 버전 (예 : 2.4)에서 유효하지 않습니다
— Oz123

중괄호를 사용하는 경우 {{this}}.
— Jonny

53

참고 : Python에서 문자열 형식 지정을 수행하는 권장 방법 은 수락 된 답변에format() 설명 된대로을 사용 하는 것 입니다. 이 답변은 또한 지원되는 C 스타일 구문의 예로 유지됩니다.

# NOTE: format() is a better choice!
string1 = "go"
string2 = "now"
string3 = "great"

s = """
I will %s there
I will go %s
%s
""" % (string1, string2, string3)

print(s)

일부 읽기 :


2
OP가 위치 매개 변수가 아닌 명명 된 매개 변수를 원하기 때문에 이것은 실제로 동일하지 않습니다.
— Ismail Badawi 2011

2
여전히 좋은 솔루션이며 여러 줄 보간의 경우 더 직접적입니다. 아무것도 가져올 필요가 없으며 일반 파이썬 보간을 사용합니다.
— unflores

4
" 당신은 아마 인터넷 검색 조금이 한 대답 수도 ... 우리가 인터넷 검색 후 해당 게시물을 찾지 못했음을 암시을"
— Stevoisiak

32

여러 줄 또는 긴 한 줄 문자열 내부의 변수에 Python 3.6의 f- 문자열 을 사용할 수 있습니다 . 를 사용하여 개행 문자를 수동으로 지정할 수 있습니다 .\n

여러 줄 문자열의 변수

string1 = "go"
string2 = "now"
string3 = "great"

multiline_string = (f"I will {string1} there\n"
                    f"I will go {string2}.\n"
                    f"{string3}.")

print(multiline_string)

내가 거기 가서
내가 지금 갈 것이다
큰

긴 한 줄 문자열의 변수

string1 = "go"
string2 = "now"
string3 = "great"

singleline_string = (f"I will {string1} there. "
                     f"I will go {string2}. "
                     f"{string3}.")

print(singleline_string)

나는 거기에 갈 것이다. 이제 갈거야. 큰.


또는 삼중 따옴표로 여러 줄 f- 문자열을 만들 수도 있습니다.

multiline_string = f"""I will {string1} there.
I will go {string2}.
{string3}."""

이렇게하면 소스 코드가 예쁘게 보이게됩니다. Python3.6 이전 버전에서는 이렇게하는 것만으로 동일한 효과를 얻을 수 있습니다 (추가 괄호 세트와 +연결에 사용). stackoverflow.com/a/54564926/4561887
— Gabriel Staples

삼중 인용이 매우 선호됩니다. 먼저 해당 양식을 제시해야합니다.
— jpmc26

@ jpmc26 필자는 PEP 8의 코드 들여 쓰기 지침을 기반으로 괄호 스타일을 먼저 제시했습니다 . 삼중 인용이 선호되는 이유는 무엇입니까?
— Stevoisiak

10

이것이 당신이 원하는 것입니다.

>>> string1 = "go"
>>> string2 = "now"
>>> string3 = "great"
>>> mystring = """
... I will {string1} there
... I will go {string2}
... {string3}
... """
>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, 'string3': 'great', '__package__': None, 'mystring': "\nI will {string1} there\nI will go {string2}\n{string3}\n", '__name__': '__main__', 'string2': 'now', '__doc__': None, 'string1': 'go'}
>>> print(mystring.format(**locals()))

I will go there
I will go now
great

삼중 따옴표 """는 개행을 보존 합니다. 즉, 전후에 추가 개행이 있음을 의미합니다mystring
— Stevoisiak

.strip(), .rstrip()또는 .lstrip(), 또는 ue를 사용 하여 삼중 따옴표 안에 백래시를 사용하여 개행 문자를 만들지 않도록 할 수 있습니다. mystring = "" "\ ABC \" ""
— Havok

6

사전을에 전달할 수 있으며 format()각 키 이름은 연관된 각 값에 대한 변수가됩니다.

dict = {'string1': 'go',
        'string2': 'now',
        'string3': 'great'}

multiline_string = '''I'm will {string1} there
I will go {string2}
{string3}'''.format(**dict)

print(multiline_string)


또한 목록을에 전달할 수 있으며이 경우 format()각 값의 인덱스 번호가 변수로 사용됩니다.

list = ['go',
        'now',
        'great']

multiline_string = '''I'm will {0} there
I will go {1}
{2}'''.format(*list)

print(multiline_string)


위의 두 솔루션 모두 동일하게 출력됩니다.

나는 거기 갈 것이다 나는 지금 갈
것이다
위대하다


0

누군가가 python-graphql 클라이언트에서 개체를 변수로 전달하는 솔루션을 찾고있는 경우 여기에 내가 사용한 것입니다.

query = """
{{
  pairs(block: {block} first: 200, orderBy: trackedReserveETH, orderDirection: desc) {{
    id
    txCount
    reserveUSD
    trackedReserveETH
    volumeUSD
  }}
}}
""".format(block=''.join(['{number: ', str(block), '}']))

 query = gql(query)

"{{", "}}"와 같이 모든 중괄호는 이스케이프해야합니다.


0

"형식화 된 문자열 리터럴"이라고도하는 f-stringsf 는 시작 부분에 가있는 문자열 리터럴입니다 . 값으로 대체 될 표현식을 포함하는 중괄호.

f- 문자열은 런타임에 평가됩니다.

따라서 코드를 다음과 같이 다시 작성할 수 있습니다.

string1="go"
string2="now"
string3="great"
print(f"""
I will {string1} there
I will go {string2}
{string3}
""")

그리고 이것은 다음과 같이 평가됩니다.

I will go there
I will go now
great

여기에서 자세히 알아볼 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.