Ruby의 문자열 보간에 해당하는 Python이 있습니까?


343

루비 예 :

name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."

성공적인 파이썬 문자열 연결은 나에게 장황하게 보입니다.


2
여기서 문제 name는 문자열에있는 로컬 변수이며, 파이썬에서는 로컬 변수 사전을 문자열 포맷터에 명시 적으로 전달해야합니다.
— Katriel

이것은 원래의 문제는 아니지만 감사합니다. 귀하의 의견은 가변 범위 (아직도 여전히 얻고있는 것)에 대해 조금 더 잘 이해하게했습니다. :)
— Caste

1
그렇다면 이것에 대해 어떻게 생각하십니까? stackoverflow.com/questions/16504732/…
— SalchiPapa


2
3.6의 정확한 기능에 대해서는 stackoverflow.com/a/33264516/55721 을 참조하십시오
— dss539

답변:


413

Python 3.6은 Ruby의 문자열 보간과 유사한 리터럴 문자열 보간 을 추가 합니다. 해당 버전의 Python (2016 년 말 출시 예정)부터 "f-strings"에 표현식을 포함시킬 수 있습니다.

name = "Spongebob Squarepants"
print(f"Who lives in a Pineapple under the sea? {name}.")

3.6 이전에는 가장 가까운 거리는

name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? %(name)s." % locals())

이 %연산자는 파이썬에서 문자열 보간 에 사용될 수 있습니다 . 첫 번째 피연산자는 보간 할 문자열이며 두 번째 피연산자는 "매핑"을 포함하여 필드 이름을 보간 할 값에 매핑하는 등 다른 유형을 가질 수 있습니다. 여기서는 로컬 변수 사전을 사용하여 locals()필드 이름 name을 로컬 변수 값 에 매핑했습니다 .

.format()최신 Python 버전 의 방법을 사용하는 동일한 코드 는 다음과 같습니다.

name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? {name!s}.".format(**locals()))

도있다 string.Template클래스 :

tmpl = string.Template("Who lives in a Pineapple under the sea? $name.")
print(tmpl.substitute(name="Spongebob Squarepants"))

@Caste 여기를 참조하십시오 : docs.python.org/library/stdtypes.html#string-formatting 자세한 내용이 필요하면 후속 의견을 게시하십시오
— mikej

나는 그것의 기본 요지를 이해하지만 문서의 예제에서 발견 된 모든 추가 기호와 텍스트를 완전히 이해하지는 못합니다. 여기에서 문자열로 변환을 사용하는 이유 : % (language) s '03d'의 3은 무엇을 의미합니까? 왜 문자열 뒤에 % \가 있습니까? 인쇄 식 후 변수 할당 (사실 변수 인 경우) 도 혼란 스럽습니다. 이것이 고통이라면 죄송합니다!
— Caste

1
예제에서 사용 된 두 가지 기본 형식 %s은 문자열과%03d 앞에 0이 붙은 3 자리 숫자로 된 형식입니다. 그냥 쓸 수 있습니다 print "%s has %03d" % ("Python", 2). 그런 다음 %문자열 뒤에 순서 키를 사용하지 않고 자리 표시 자에 의미있는 이름을 지정하는 방법 인 뒤에 매핑 키를 대괄호 안에 넣습니다 . 그런 다음 키 이름을 해당 값에 매핑하는 사전을 전달합니다. 스벤은 사용하는 이유 locals()는지도 있도록 모든 로컬 변수를 포함하는 딕셔너리를 반환하는 기능 name이름의 값
— mikej

변환 유형의 필수 사용법은 처음 혼란 스러웠습니다. 따라서 문서 용어를 사용합니다. %는 지정자를 시작합니다. (언어)에 대한 변환 플래그가 없으며 변환 유형 (마지막 's') 만 있습니다. 그러나 (숫자)에는 '0'(및 '3') 인 하나 또는 두 개의 변환 플래그가 있습니다. 'd'는 변환 유형이며 정수임을 나타냅니다. 내가 제대로 이해 했습니까?
— Caste

@Caste : 네, 기본적으로 맞습니다. s파이썬은 항상 변환 유형으로 사용할 수 있습니다-파이썬은 거의 모든 것을 문자열로 변환 할 수 있습니다. 그러나 다른 변환 유형의 특수한 형식 지정 기능은 손실됩니다.
— Sven Marnach

143

Python 2.6.X부터 다음을 사용할 수 있습니다.

"my {0} string: {1}".format("cool", "Hello there!")

27
있습니다 %문자열 보간 운영자가되어 있지 파이썬 3.x에서 사용되지 않습니다 docs.python.org/dev/py3k/whatsnew/… 는 %3.1부터 더 이상 사용되지 않을 계획을 발표 했지만, 결코 그런 일은 없었습니다.
— Sven Marnach

8
% - 구문 여전히 파이썬 3에 살아 (파이썬 3.2의 추천되지 않음)
— 코리 골드버그

9
참고 사항 : 숫자를 {}제거 할 수 있습니까?
— 그릴

32

파이썬에서 문자열 보간 을 가능하게 하는 interpy 패키지를 개발했습니다 .

를 통해 설치하십시오 pip install interpy. 그런 다음 # coding: interpy파일 시작 부분에 줄 을 추가하십시오 !

예:

#!/usr/bin/env python
# coding: interpy

name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n#{name}."

3
이것은 실제로 안전하지 않은 것 같습니다.
— d33tah

@ d33tah : 아니오, 컴파일 타임에 문자열이 알려진 한.
— Clément

28

파이썬의 문자열 보간은 C의 printf ()와 유사합니다

시도하면 :

name = "SpongeBob Squarepants"
print "Who lives in a Pineapple under the sea? %s" % name

태그 %s가 name변수 로 대체됩니다 . 인쇄 기능 태그를 살펴보십시오. http://docs.python.org/library/functions.html


1
2 변수로 어떻게 이런 식으로 할 수 있습니까?
— Julio Marins

16
@JulioMarins 튜플을 사용하십시오 : print "First is %s, second is %s" % (var1, var2).
— kirbyfan64sos 2016

28

문자열 보간은 PEP 498에 지정된대로 Python 3.6에 포함됩니다 . 당신은 이것을 할 수있을 것입니다 :

name = 'Spongebob Squarepants'
print(f'Who lives in a Pineapple under the sea? \n{name}')

스폰지 밥이 싫어서 작성하는 것이 약간 고통 스럽습니다. :)


그 스폰지 밥 참조 (/ 거리)에 대한 Thx : 이제 이것을 찬성해야합니다.
— javadba

4

당신은 또한 이것을 가질 수 있습니다

name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n{name}.".format(name=name)

http://docs.python.org/2/library/string.html#formatstrings


OP #가 인쇄 예정이라고 생각하지 않습니다 . 그들은 루비 구문을 사용하고 있습니다.
— jaynp

네가 옳아. 나는 대답을 편집했다. 루비에 익숙하지 않기 때문에 #캐릭터가 인쇄 될 것이라고 생각했습니다 .
— Quan To

3
import inspect
def s(template, **kwargs):
    "Usage: s(string, **locals())"
    if not kwargs:
        frame = inspect.currentframe()
        try:
            kwargs = frame.f_back.f_locals
        finally:
            del frame
        if not kwargs:
            kwargs = globals()
    return template.format(**kwargs)

용법:

a = 123
s('{a}', locals()) # print '123'
s('{a}') # it is equal to the above statement: print '123'
s('{b}') # raise an KeyError: b variable not found

추신 : 성능에 문제가있을 수 있습니다. 프로덕션 로그가 아닌 로컬 스크립트에 유용합니다.

중복 :


2

오래된 Python (2.4에서 테스트 됨)의 경우 최고의 솔루션이 그 길을 가리 킵니다. 당신은 이것을 할 수 있습니다 :

import string

def try_interp():
    d = 1
    f = 1.1
    s = "s"
    print string.Template("d: $d f: $f s: $s").substitute(**locals())

try_interp()

그리고 당신은 얻을

d: 1 f: 1.1 s: s

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