str.format_map ()을 사용할 때 최대 문자열 재귀를 초과했습니다.

아르망 그릴 렛

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 코드를 수정하는 것을 선호합니다.

Martijn Pieters

__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"구문 분석됩니다 . 저두 요 필드 이름,하지만 항목에 대한 조회."bonjourso[...]

마지막 두 개는 메서드를 사용하여 래퍼 객체를 반환하여 접근 할 수 있지만 제한된 경우에만 가능합니다.__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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

모듈을 설치할 때 Python 최대 재귀 깊이를 초과했습니다.

분류에서Dev

메서드 이름을 인쇄 할 때 Python 개체를 호출하는 동안 최대 재귀 깊이를 초과했습니다.

분류에서Dev

범주 형 변수를 요약 할 때 최대 재귀 깊이를 초과했습니다.

분류에서Dev

생성 할 때 Django 모델에서 최대 재귀 깊이를 초과했습니다.

분류에서Dev

RuntimeError : 기본 해시 방법을 사용하여 최대 재귀 깊이를 초과했습니다.

분류에서Dev

다른 사용자 이름으로 로그인 할 때 "이 주체에 대한 최대 세션 1 개를 초과했습니다."

분류에서Dev

Sqlalchemy를 사용하여 최대 재귀 깊이를 초과했습니다.

분류에서Dev

오류 : 반응 후크를 사용할 때 최대 업데이트 깊이를 초과했습니다.

분류에서Dev

재귀를 사용하여 최대 n 개 용어의 합계를 찾을 때 'shell이 -1073741571'을 반환했습니다.

분류에서Dev

RecursionError : 스레드를 사용하는 동안 최대 재귀 깊이를 초과했습니다.

분류에서Dev

Entity Framework 6.1 IndexAttribute 특성을 사용하여 문자열 필드 키를 선언 할 때 최대 길이를 지정 하시겠습니까?

분류에서Dev

두 개체를 비교하는 동안 최대 재귀 수준을 초과했습니다.

분류에서Dev

재귀를 사용할 때 return 문에 대한 혼란

분류에서Dev

MySQL은 사용자 최대 연결을 초과했다고 말합니다.

분류에서Dev

str.translate를 부분 문자열 대체에 사용할 수 있습니까?

분류에서Dev

127을 초과하는 값을 반환하는 문자에 대해 작업을 수행 할 때 분할 오류가 발생했습니다.

분류에서Dev

문자열 ID를 사용할 때보기를 찾을 수 없습니다.

분류에서Dev

잡히지 않은 RangeError : jQuery에서 .map 함수를 사용할 때 최대 호출 스택 크기가 초과되었습니다.

분류에서Dev

문자열 분할에 대해 맵을 사용할 때 유형을 추론 할 수 없습니다.

분류에서Dev

문자열 보간을 사용할 때 문자열 리소스를 혼합 할 수 있습니까?

분류에서Dev

v-dialog를 사용할 때 최대 호출 스택 크기가 초과되었습니다.

분류에서Dev

서비스 작업 수가 75 개를 초과하면 XML 데이터를 읽는 동안 최대 이름 테이블 문자 수 할당량 (16384)을 초과했습니다.

분류에서Dev

Pandas는 열의 문자열 수가 최대 일 때 groupby를 사용하여 데이터 프레임을 변환합니다.

분류에서Dev

awk 배열을 사용할 때 언급 된 질문에 대해 큰 숫자를 합하고 모든 소수점과 함께 결과를 인쇄합니다.

분류에서Dev

mysql DATE_FORMAT을 사용할 때 구문 오류가 발생했습니다.

분류에서Dev

"make"명령을 사용할 때 Java의 최대 힙 크기를 늘립니다.

분류에서Dev

Font Awesome을 사용할 때 문자를 볼 수 없습니다

분류에서Dev

오류 : 최대 업데이트 수준을 초과했습니다. 이는 구성 요소가 componentWillUpdate 또는 componentDidUpdate 내에서 setState를 반복적으로 호출 할 때 발생할 수 있습니다.

분류에서Dev

문자열에서 여러 문자열 대체를 수행 할 때 var 사용을 피하는 방법

Related 관련 기사

  1. 1

    모듈을 설치할 때 Python 최대 재귀 깊이를 초과했습니다.

  2. 2

    메서드 이름을 인쇄 할 때 Python 개체를 호출하는 동안 최대 재귀 깊이를 초과했습니다.

  3. 3

    범주 형 변수를 요약 할 때 최대 재귀 깊이를 초과했습니다.

  4. 4

    생성 할 때 Django 모델에서 최대 재귀 깊이를 초과했습니다.

  5. 5

    RuntimeError : 기본 해시 방법을 사용하여 최대 재귀 깊이를 초과했습니다.

  6. 6

    다른 사용자 이름으로 로그인 할 때 "이 주체에 대한 최대 세션 1 개를 초과했습니다."

  7. 7

    Sqlalchemy를 사용하여 최대 재귀 깊이를 초과했습니다.

  8. 8

    오류 : 반응 후크를 사용할 때 최대 업데이트 깊이를 초과했습니다.

  9. 9

    재귀를 사용하여 최대 n 개 용어의 합계를 찾을 때 'shell이 -1073741571'을 반환했습니다.

  10. 10

    RecursionError : 스레드를 사용하는 동안 최대 재귀 깊이를 초과했습니다.

  11. 11

    Entity Framework 6.1 IndexAttribute 특성을 사용하여 문자열 필드 키를 선언 할 때 최대 길이를 지정 하시겠습니까?

  12. 12

    두 개체를 비교하는 동안 최대 재귀 수준을 초과했습니다.

  13. 13

    재귀를 사용할 때 return 문에 대한 혼란

  14. 14

    MySQL은 사용자 최대 연결을 초과했다고 말합니다.

  15. 15

    str.translate를 부분 문자열 대체에 사용할 수 있습니까?

  16. 16

    127을 초과하는 값을 반환하는 문자에 대해 작업을 수행 할 때 분할 오류가 발생했습니다.

  17. 17

    문자열 ID를 사용할 때보기를 찾을 수 없습니다.

  18. 18

    잡히지 않은 RangeError : jQuery에서 .map 함수를 사용할 때 최대 호출 스택 크기가 초과되었습니다.

  19. 19

    문자열 분할에 대해 맵을 사용할 때 유형을 추론 할 수 없습니다.

  20. 20

    문자열 보간을 사용할 때 문자열 리소스를 혼합 할 수 있습니까?

  21. 21

    v-dialog를 사용할 때 최대 호출 스택 크기가 초과되었습니다.

  22. 22

    서비스 작업 수가 75 개를 초과하면 XML 데이터를 읽는 동안 최대 이름 테이블 문자 수 할당량 (16384)을 초과했습니다.

  23. 23

    Pandas는 열의 문자열 수가 최대 일 때 groupby를 사용하여 데이터 프레임을 변환합니다.

  24. 24

    awk 배열을 사용할 때 언급 된 질문에 대해 큰 숫자를 합하고 모든 소수점과 함께 결과를 인쇄합니다.

  25. 25

    mysql DATE_FORMAT을 사용할 때 구문 오류가 발생했습니다.

  26. 26

    "make"명령을 사용할 때 Java의 최대 힙 크기를 늘립니다.

  27. 27

    Font Awesome을 사용할 때 문자를 볼 수 없습니다

  28. 28

    오류 : 최대 업데이트 수준을 초과했습니다. 이는 구성 요소가 componentWillUpdate 또는 componentDidUpdate 내에서 setState를 반복적으로 호출 할 때 발생할 수 있습니다.

  29. 29

    문자열에서 여러 문자열 대체를 수행 할 때 var 사용을 피하는 방법

뜨겁다태그

보관