매개 변수 이름이 지정된 문자열?


134

나는 그것이 간단한 질문이라는 것을 알고 있지만 그것을 구글하는 방법을 모른다.

어떻게해야합니까

print '<a href="%s">%s</a>' % (my_url)

그래서 my_url두 번 사용됩니까? 필자는 "이름" %s을 지정하고 매개 변수에 dict를 사용해야 한다고 가정 하지만 올바른 구문을 확신하지 못합니까?


참고로, my_url매개 변수에서 두 번만 사용할 수 있다는 것을 알고 있지만 그게 요점이 아닙니다. :)


질문의 제목은 약간 오해의 소지가 있습니다. 이것은 문자열 보간이 작동하는 방식과 관련하여 print 문과 관련이 없습니다.
Greg Ball

구글 검색 방법을 모른다면 python.org/doc 검색을 사용하십시오 . 한 가지 중요한 이유로 Google보다 낫습니다.
S.Lott

S. 로트 @ 그의 정말 도움 / s의
mpen

답변:


79

Python 2.6 이상 및 Python 3에서는 최신 문자열 형식화 방법을 사용하도록 선택할 수 있습니다.

print('<a href="{0}">{0}</a>'.format(my_url))

인수를 반복하지 않아도됩니다. 또는

print('<a href="{url}">{url}</a>'.format(url=my_url))

명명 된 매개 변수를 원하는 경우

print('<a href="{}">{}</a>'.format(my_url, my_url))

이것은 엄청나게 위치 적이며 format () 인수는 명명되지 않은 args가 먼저 와야하고 명명 된 인수가 뒤 따르는 * args (목록 또는 튜플과 같은 시퀀스), * kwargs (dict) 당신에게 좋은 것이 무엇인지 알고 있다면 문자열로 입력하십시오.). 보간 점은 이름이 지정된 값을 레이블로 대체 한 다음 남은 것부터 위치를 지정하여 결정됩니다. 그래서, 당신은 또한 이것을 할 수 있습니다 ...

print('<a href="{not_my_url}">{}</a>'.format(my_url, my_url, not_my_url=her_url))

그러나 이것은 ...

print('<a href="{not_my_url}">{}</a>'.format(my_url, not_my_url=her_url, my_url))

영향이 ++에서 #으로 바뀌는 것을 보는 것이 좋습니다.
cod3monk3y

3
위의 방법은 명명 된 문자열 형식 이 아니며 위치 문자열 형식입니다. 따라서 이것은 실제로 질문에 대답하지 않습니다.
jaapz

"literal {arg1}".format(arg1="arg!")terser는 반면라는 이름의 형식은 파이썬 3.5와 함께 작동합니다 f"literal {arg1}"파이썬 3.6 이상, AFAIK에서 새로운 혁신이다.
MarkHu

218
print '<a href="%(url)s">%(url)s</a>' % {'url': my_url}

3
나는 kwargs로 dict를 만드는 것을 선호합니다 :'<a href="%(url)s">%(url)s</a>' % dict(url=my_url)
schlamar

11
왜 당신이 그 schmlamar를 선호하는지 궁금합니다? OP가 사용하는 dict의 일반적인 선언과 비교했을 때 그 의미를 쉽게 알지 못했을 것입니다.
GreenAsJade

1
문서는 이 도입되었을 때 말을하지 않기 때문에 모든 파이썬 2 버전에서 아마.
Evgeni Sergeev

2
가능하면 format ()을 사용하십시오. 더 많은 곳에서 더 잘 작동합니다. 반드시 %를 사용하십시오.
uchuugaka

39

Python 3.6 이상 솔루션

파이썬 3.6 소개 리터럴 문자열 형식이 되어 문자열 외부에서 명명 된 매개 변수를 반복하지 않고도 명명 된 매개 변수의 서식 을 지정할 수 있습니다.

print(f'<a href="{my_url:s}">{my_url:s}</a>')

이것은 평가 my_url되므로 정의되지 않은 경우 a가 표시 NameError됩니다. 실제로, 대신 my_url문자열로 평가되는 한 임의의 파이썬 표현식을 작성할 수 있습니다 (:s 형식화 코드로 . 문자열이 아닐 수있는 표현식의 결과에 대해 문자열 표현을 원하면 다음으로 대체하십시오 :s.!s 사전 리터럴 문자열 서식, 그냥 평범한와 같은을,.

리터럴 문자열 형식에 대한 자세한 내용 은 처음 도입 된 PEP 498을 참조하십시오 .


1
PEP가 모든 포맷터를 다루지는 않습니다. 나는 그것들이 여기에 문서화 된 str.format과 같다고 생각합니다 : docs.python.org/3.4/library/string.html#formatstrings
mpen

6

당신은 구문에 중독됩니다.

또한 C # 6.0 인 EcmaScript 개발자도이 구문을 잘 알고 있습니다.

In [1]: print '{firstname} {lastname}'.format(firstname='Mehmet', lastname='Ağa')
Mehmet Ağa

In [2]: print '{firstname} {lastname}'.format(**dict(firstname='Mehmet', lastname='Ağa'))
Mehmet Ağa

5

HTML 페이지를 만들 때는 간단한 문자열 보간이 아닌 템플릿 엔진을 사용하려고합니다.


2
Django의 템플릿 엔진은 이메일을 보내는 데 이상적인 도구 일 수도 있습니다.
Mike Graham

6
Django 템플릿을 사용하여 전자 메일 본문을 생성하는 render()방법 을 방해하는 이유는 무엇입니까 ? 템플릿 출력을에 공급해야한다고 말하는 것은 없습니다 HttpResponse(). Django는 매우 다재다능합니다.
Mike DeSimone

1
@ Mike : Django가 이것에 대한 해결책을 가지고 있다고 생각 했지만 아직 찾지 못했습니다 : p 아마 전자 메일을 템플릿으로 옮길 것입니다! 감사. 어쩌면 나는 '지각 적이지만, 일부 지역에서는 그것이 매우 단단하다는 것을 알았습니다.
mpen

2
이 의견을 읽는 @random 사람들 :이 작업을 수행하는 방법에 대한 자세한 내용은 rossp.org/blog/2006/jul/11/sending-e-mails-templates
mpen

1
질문에 댓글을 달려면 답변이 아닌 댓글을 사용하려고합니다.
suriv

2

사전 방식뿐만 아니라 다음 형식을 아는 것이 유용 할 수 있습니다.

print '<a href="%s">%s</a>' % (my_url, my_url)

여기서는 중복성이 없으며 코드를 수정할 때 사전 방법으로 오류가 발생하기 쉽지 않지만 여러 삽입에 튜플을 사용할 수 있습니다. 첫 %s번째 요소는 튜플의 첫 번째 요소로 %s대체되고 두 번째 요소는 튜플의 두 번째 요소로 대체되는 방식으로 튜플의 각 요소가 대체됩니다.


방금이 제안을 한 남자에게 말했다 :) 그는 자신의 게시물을 삭제합니다. 나는 지금 기분이 나쁘다. 그렇습니다, 나는 이것을 할 수 있다는 것을 알고 있습니다. 그러나 그것은 내가 찾고있는 것이 아닙니다. 당신이 말했듯이, 그것은 중복적이고 my_url실제로 두 번 평가되고 싶지 않은 함수 호출입니다. 두 번 그렇게 나쁘지는 않지만 20 번이나
쉬웠을 것입니다

5
다른 사람에게 도움이 될 경우를 대비하여 내 것을 지키겠다고 생각했습니다. 사전 방법이 가장 좋은 방법 일 것입니다. 그러나 중복성을 (get_my_url(), )*20위해 함수를 한 번만 호출하고 20 번 복제합니다.
Ponkadoodle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.