2010-03-11 2 views
3

바이트 문자열을 처리하는 Python C 확장을 작성하려고하는데 기본적으로 Python 2.x 및 Python 3.x에서 작동합니다.PyArg_ParseTuple() "s"형식 지정자는 Python 3.x C API에서 유용합니까?

if (!PyArg_ParseTuple(args, "s#:in_bytes", &src_ptr, &src_len)) 
    ... 

나는 s# 형식 지정자 유니 코드 문자열과 바이트 문자열을 모두 받아들이는주의 사항 : 파이썬 2.x에서 코드

내 기능의 시작 근처에, 나는 현재 라인. 난 그냥 바이트 문자열을 받아 들일 유니 코드를 거부 싶어요. 파이썬 2.x의 경우, "충분하다"- 표준 hashlib은 유니 코드뿐만 아니라 바이트 문자열을 받아들이는 것처럼 보입니다. 그러나 Python 3.x는 유니 코드/바이트 문자열 혼란을 없애고 둘을 교환 할 수 없도록합니다.

따라서 에 대한 in Python 3.x, the s format specifiers은 여전히 ​​유니 코드를 받아 들여 유니 코드의 "기본 인코딩 된 문자열 버전"을 제공하는 것으로 나타났습니다. 이것은 파이썬 3.x의 원칙에 반하는 것으로 보이며 실제로는 s 형식 지정자를 사용할 수 없게 만듭니다. 내 분석이 맞습니까, 아니면 제가 빠진 것이 있습니까? (예를 들어 md5module.c, 기능 MD5_update()GET_BUFFER_VIEW_OR_ERROUT() 매크로의 사용 참조) 나는 그것이 s 형식 지정을 피할 것을 볼, 단지 일반 객체 (O 지정)를 취 파이썬 3.x를위한 hashlib의 구현을 보면

및 그런 다음 GET_BUFFER_VIEW_OR_ERROUT() 매크로를 사용하여 다양한 명시 적 유형 검사를 수행합니다. 우리가해야 할 일인가요?

답변

3

나는 당신에게 동의한다. 이것은 파이썬 3의 C API 마이그레이션이 파이썬 코더로 볼 수있는 부분과 같이 조심스럽고 신중하게 설계되지 않은 여러 곳 중 하나이다. 또한 아마도 최선의 해결 방법은 매크로에 대한 "버퍼 뷰"에 초점을 맞추는 것입니다. 미래의 파이썬 C API에 뭔가 이상적으로 설계되지 않는 한 (숨이 멈추지 않도록 기다리지 말고, 그래도;-).

관련 문제