2012-10-28 2 views
0

이 질문은 이전의 question에서 온 것입니다.Python - bltinmodule.c의 builtin_print 메소드에 대한 인수

builtin_print()의 전체 구현을 변경할 필요가 없습니다. 나는 단순히 예를 들어 특별한 논증을 찾을 필요가있다. --- '파이썬'. 다음 문을 들어

- '파이썬'에 대한 인쇄를있을 때마다

from __future__ import print_function 
print('python') 

, 내 코드가 다른 뭔가를하고 싶어. 문제는 다음과 같습니다.

builtin_print(PyObject *self, PyObject *args, PyObject *kwds) 

args는 PyObject 유형입니다. 나는 strcmp 나 memcmp args [1]에 'Python'과 함께 접근 할 방법이 없다.

아이디어가 있으십니까?

+1

sys.stdout.write() 또는'print()'를 모든 파일에 겹쳐 써야합니까? 너 그냥 원숭이 패치 __builtin __. 인쇄 할 수 있습니까? – jfs

+0

서식 :'__builtin__' – jfs

+0

답장을 보내 주셔서 감사합니다. 명백하게, 나는 Monkey Patching을 모르고있다. 나는이 일을 끝내기 위해 하루 만 남았고 나는 매우 마지막 단계에 있으며, 나는 다음 날 Monkey Patching을 읽을 것입니다. – p0lAris

답변

0

파이썬 인터프리터가 처리하는 객체는 파이썬 객체이며 C 객체는 아닙니다. 따라서이 같은 C 문자열에 대한 비교 통역 특정 기능을 사용해야합니다 :

PyObject *o = PyTuple_GetItem(args, i); 
if (PyUnicode_CheckExact(o) && PyUnicode_CompareWithASCIIString(o, "Python")==0){ 
    printf("Do something else ..\n"); 
} else { 
    err = PyFile_WriteObject(o, file, Py_PRINT_RAW); 
    if (err) 
     return NULL; 
} 

current code의 장소에 추가합니다. 이전 2.7.3 릴리스,이 유니 코드 문자열을 처리하지 않습니다

if (PyUnicode_CheckExact(o)) { 
    PyObject* utf8 = PyUnicode_AsUTF16String(o); 
    if (strcmp(PyString_AsString(o), "Python")==0) { 
     printf("Do something else (unicode)\n"); 
    } 
    Py_DECREF(utf8); 
} else if (PyString_CheckExact(o) && strcmp(PyString_AsString(o), "Python")==0){ 
    printf("Do something else (str) ..\n"); 
} else { 
    err = PyFile_WriteObject(o, file, Py_PRINT_RAW); 
    if (err) 
     return NULL; 
} 

주 (u'Python')처럼 PyString * 함수의 가족을 사용해야하는 당신을 위해. 인쇄물 을 처리하는 case PRINT_ITEMModules/ceval.c으로 수정하는 데 관심이있을 수 있습니다.

파이썬 프로그램이 sys.stdout에 쓰거나 navtive (C) 함수가 인쇄를 수행하는 것을 포함하여 print을 호출하는 것보다 인쇄하는 다른 방법이 있습니다.

+0

좋아요, 좋아요. 엄청 고마워. – p0lAris

+0

코드를 적용했는데 경고가 나타납니다. 경고 : 암시 적으로 'PyUnicode_CompareWithASCIIString'함수가 선언되었습니다. 헤더 파일을 포함시켜야합니까? 감사합니다. – p0lAris

+0

@omniDETH 최신 hg 체크 아웃 ('a1cd431a71c6')에서 이것은 잘 작동합니다. 이전 버전의 소스 코드로 작업한다면, 그것을 수정해야 할 것입니다. (그리고 버전이 정말로 오래 되었으면 (2.x),'str'을 확인하기를 원할 것입니다. 2.x에서는'print (u'Python ')'과 만 일치합니다. 'PyUnicode_CompareWithASCIIString'는'Include/unicodeobject.h'에 있습니다. – phihag

관련 문제