[python] 부분 문자열 형식

문자열 템플릿 safe_substitute()함수 와 유사한 고급 문자열 서식 지정 방법을 사용하여 부분 문자열 서식을 수행 할 수 있습니까?

예를 들면 :

s = '{foo} {bar}'
s.format(foo='FOO') #Problem: raises KeyError 'bar'



답변

매핑을 덮어 써서 부분 서식으로 속일 수 있습니다.

import string

class FormatDict(dict):
    def __missing__(self, key):
        return "{" + key + "}"

s = '{foo} {bar}'
formatter = string.Formatter()
mapping = FormatDict(foo='FOO')
print(formatter.vformat(s, (), mapping))

인쇄

FOO {bar}

물론이 기본 구현은 기본적인 경우에만 올바르게 작동합니다.


답변

서식을 지정하는 순서를 알고있는 경우 :

s = '{foo} {{bar}}'

다음과 같이 사용하십시오.

ss = s.format(foo='FOO')
print ss
>>> 'FOO {bar}'

print ss.format(bar='BAR')
>>> 'FOO BAR'

당신은 지정할 수 없습니다 foobar같은 시간에 – 당신은 순차적으로 그것을 할 수 있습니다.


답변

짧고 가독성이 뛰어나며 코더의 의도를 설명하는 partial함수를 사용할 수 있습니다 functools.

from functools import partial

s = partial("{foo} {bar}".format, foo="FOO")
print s(bar="BAR")
# FOO BAR


답변

이 제한 .format()부분 대체를 할 수 없다는 저를 괴롭 혔습니다.

Formatter여기에 많은 답변에 설명 된대로 사용자 정의 클래스 작성을 평가 하고 lazy_format 과 같은 타사 패키지 사용을 고려한 후에도 훨씬 간단한 내장 솔루션을 발견했습니다. 템플릿 문자열을

유사한 기능을 제공하지만 부분 대체 safe_substitute()방법을 제공합니다 . 템플릿 문자열에는 $접두사 가 있어야 합니다 (조금 이상하게 느껴지지만 전반적인 솔루션이 더 낫다고 생각합니다).

import string
template = string.Template('${x} ${y}')
try:
  template.substitute({'x':1}) # raises KeyError
except KeyError:
  pass

# but the following raises no error
partial_str = template.safe_substitute({'x':1}) # no error

# partial_str now contains a string with partial substitution
partial_template = string.Template(partial_str)
substituted_str = partial_template.safe_substitute({'y':2}) # no error
print substituted_str # prints '12'

이를 기반으로 편의 래퍼를 형성했습니다.

class StringTemplate(object):
    def __init__(self, template):
        self.template = string.Template(template)
        self.partial_substituted_str = None

    def __repr__(self):
        return self.template.safe_substitute()

    def format(self, *args, **kws):
        self.partial_substituted_str = self.template.safe_substitute(*args, **kws)
        self.template = string.Template(self.partial_substituted_str)
        return self.__repr__()


>>> s = StringTemplate('${x}${y}')
>>> s
'${x}${y}'
>>> s.format(x=1)
'1${y}'
>>> s.format({'y':2})
'12'
>>> print s
12

마찬가지로 기본 문자열 형식을 사용하는 Sven의 답변을 기반으로 한 래퍼 :

class StringTemplate(object):
    class FormatDict(dict):
        def __missing__(self, key):
            return "{" + key + "}"

    def __init__(self, template):
        self.substituted_str = template
        self.formatter = string.Formatter()

    def __repr__(self):
        return self.substituted_str

    def format(self, *args, **kwargs):
        mapping = StringTemplate.FormatDict(*args, **kwargs)
        self.substituted_str = self.formatter.vformat(self.substituted_str, (), mapping)


답변

이것이 빠른 해결 방법인지 확실하지 않지만 어떻게

s = '{foo} {bar}'
s.format(foo='FOO', bar='{bar}')

? 🙂


답변

메서드 Formatter를 재정의하는 사용자 정의를 정의하면 정의 get_value되지 않은 필드 이름을 원하는대로 매핑하는 데 사용할 수 있습니다.

http://docs.python.org/library/string.html#string.Formatter.get_value

예를 들어, 당신은 매핑 할 수 있습니다 bar"{bar}"경우 barkwargs로 아닙니다.

그러나이를 위해서는 format()문자열의 format()메서드가 아닌 Formatter 개체 의 메서드 를 사용해야합니다 .


답변

>>> 'fd:{uid}:{{topic_id}}'.format(uid=123)
'fd:123:{topic_id}'

이것을 시도하십시오.