str.format_map 을 사용하여 일부 문자열의 형식을 지정하고 있지만이 문자열에 이스케이프 된 따옴표가 포함되어 있으면 문제가 발생합니다. 다음은 코드입니다.
class __FormatDict(dict):
def __missing__(self, key):
return '{' + key + '}'
def format_dict(node, template_values):
template_values = __FormatDict(template_values)
for key, item in node.items():
if isinstance(item, str):
node[key] = item.format_map(template_values)
대괄호 또는 따옴표를 포함하지 않는 필수 문자열의 경우 작동하지만 같은 문자열의 "{\"libraries\":[{\"file\": \"bonjour.so\", \"modules\":[{\"name\": \"hello\"}]}]}"
경우 메시지와 충돌합니다 ValueError: Max string recursion exceeded
.
json.dumps(item)
서식을 지정하기 전에 사용하여 따옴표를 이스케이프 해도 문제가 해결되지 않습니다. 이 문제를 해결하려면 어떻게해야합니까? JSON 파일에서 얻은 문자열을 수정하고 있으며 사용하는 JSON 문서를 업데이트하는 대신 Python 코드를 수정하는 것을 선호합니다.
__missing__
JSON 데이터에는 트릭을 사용할 수 없습니다 . 여러 문제가 있습니다. {...}
대체 필드 내의 텍스트 가 단순히 문자열로 취급되지 않기 때문 입니다. 구문 문법을 살펴보십시오 .
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}" field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
대체 필드 내에서, !...
그리고 :...
너무 의미가! 이 섹션에 들어가는 것도 엄격한 제한이 있습니다.
재귀 오류는 {...}
자리 표시 자 내부의 자리 표시 자 내부에 중첩 된 여러 자리 표시 자에서 발생합니다. str.format()
및 str.format_map()
중첩 수준의 큰 숫자를 지원할 수 없습니다 :
>>> '{foo:{baz: {ham}}}'.format_map({'foo': 'bar', 'baz': 's', 'ham': 's'})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Max string recursion exceeded
그러나 여기에 다른 문제가 있습니다.
:
콜론은 나타내고 포맷 사양 전과 부분에서 그 물체 (키)에 전달된다 :
. __missing__
반환 값 __format__
을 복구하려면 메서드가 있는 래퍼 개체 를 제공해야합니다 .
.
또는 포함 [...]
된 필드 이름 도 특별한 의미를 갖습니다. 속성 과 함께 키로 "bonjour.so"
구문 분석됩니다 . 저두 요 필드 이름,하지만 항목에 대한 조회."bonjour
so
[...]
마지막 두 개는 및 및 메서드를 사용하여 래퍼 객체를 반환하여 접근 할 수 있지만 제한된 경우에만 가능합니다.__format__
__getitem__
__getattr__
>>> class FormatWrapper:
... def __init__(self, v):
... self.v = v
... def __format__(self, spec):
... return '{{{}{}}}'.format(self.v, (':' + spec) if spec else '')
... def __getitem__(self, key):
... return FormatWrapper('{}[{}]'.format(self.v, key))
... def __getattr__(self, attr):
... return FormatWrapper('{}.{}'.format(self.v, attr))
...
>>> class MissingDict(dict):
... def __missing__(self, key):
... return FormatWrapper(key)
...
>>> '{"foo.com": "bar[baz]", "ham": "eggs"}'.format_map(MissingDict())
'{"foo.com": "bar[baz]", "ham": "eggs"}'
>>> '{"foo .com": "bar [ baz ]", "ham": "eggs"}'.format_map(MissingDict())
'{"foo .com": "bar [ baz ]", "ham": "eggs"}'
이것은 '빈'속성에 대해 실패합니다.
>>> '{"foo...com": "bar[baz]", "ham": "eggs"}'.format_map(MissingDict())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Empty attribute in format string
요컨대, 형식은 {...}
중괄호 안에 포함 된 것에 대해 너무 많은 가정을하고 , 가정 JSON 데이터는 쉽게 깨집니다.
대신 string.Template()
클래스 를 사용하는 것이 좋습니다 . 하위 클래스로 분류 할 수있는 더 간단한 템플릿 시스템입니다. 기본값은 $identifier
문자열 을 찾아 바꾸는 것 입니다. 이 Template.safe_substitute()
방법 은 원하는대로 정확하게 수행합니다. 알려진 $identifier
자리 표시자를 바꾸 되 알 수없는 이름은 그대로 둡니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다