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

태그 %sname변수 로 대체됩니다 . 인쇄 기능 태그를 살펴보십시오. 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.