인라인 변수로 여러 줄 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.