json.dumps ()는 python 2.7에서 str의 하위 클래스 변수를 전달할 때 예기치 않은 결과를 제공합니다.

건장한

다음과 같이 str 하위 클래스를 작성했습니다.

class URL(str):
    def __init__(self, url):
        u = normalize_url(url)
        print u
        super(URL, self).__init__(string=u)

normalize_url()함수는 URL 인코딩과 같은 작업을 수행하는 데 사용됩니다. 내가 사용할 때까지 모든 것이 괜찮습니다 json.dumps(). 내 테스트 코드는 다음과 같습니다.

>>> u = URL('https://example.com/path contains space.html')
https://example.com/path%20contains%20space.html
>>> json.dumps(u)
'"https://example.com/path contains space.html"'

json.dumps()' https://example.com/path%20contains%20space.html '을 제공하지 않은 이유

앤서니 소 타일

str (다른 불변 객체와 마찬가지로) 초기화합니까? __new__

파이썬에서 객체를 구성하는 것은 대략 다음과 같습니다.

inst = cls.__new__(cls, *args, **kwargs)
cls.__init__(inst, *args, **kwargs)

귀하의 예에서을 호출 __init__했지만 너무 늦었습니다. 객체가 이미 설정되었습니다.__new__

그러나 이것을 고칠 수 있습니다! :

class URL(str):
    __slots__ = ()

    def __new__(cls, val):
         val = val.replace(' ', '%20')
         return super(URL, cls).__new__(cls, val)

이제 작동합니다!

>>> x = URL('foo bar')
>>> x
'foo%20bar'
>>> json.dumps(x)
'"foo%20bar"'

내가 가진 __slots__ = ()불변성을 복원하기 위해 추가 했습니다 str.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관