2011-03-18 17 views
27

C python uzantım var ve bazı tanılamaları yazdırmak istiyorum.Python: PyObject'in dize olarak gösterimini al?

Bir dize PyObject * olarak alıyorum.

Bu nesnenin bir dize temsilcisi elde etmenin kuralsal yolu nedir, böylece bir const char * olarak kullanılabilir; Const char * olarak erişimi vurgulamak için açıklığa kavuşturuldu.

update:

cevap

36

Kullanım PyObject_Reprconst char* olarak kullanabilirsiniz yapabilirsiniz ve genellikle gerektiği (char * almak için PyString_AsString çağrı sonra (str taklit etmek) ya da PyObject_Str (Python'un repr fonksiyonunu taklit etmek) ve, örneğin:

PyObject* objectsRepresentation = PyObject_Repr(yourObject); 
const char* s = PyString_AsString(objectsRepresentation); 

Bu yöntem herhangi PyObject için Tamam sen yourObject bir Pyth kesinlikle eminseniz. dize değil, başka bir şey gibi örneğin bir takım, ilk satır atlayıp sadece yapabilirsiniz:

static void reprint(PyObject *obj) { 
    PyObject* repr = PyObject_Repr(obj); 
    PyObject* str = PyUnicode_AsEncodedString(repr, "utf-8", "~E~"); 
    const char *bytes = PyBytes_AS_STRING(str); 

    printf("REPR: %s\n", bytes); 

    Py_XDECREF(repr); 
    Py_XDECREF(str); 
} 
+2

Python 3 için PyBytes_AsString (yourObject) çalışıyorum ve TypeError alıyorum: beklenen bytes, str bulundu –

+0

Hatta benim yanıtımda PyBytes_AsString bahsetmedim. Cevabımda önerdiğim şeyi denediniz mi? – piokuc

+7

Py3.x'te çalıştı. PyString PyBytes ile değiştirildi ancak aynı işlevde değil. Ben kullanarak sona erdi: PyUnicode_AsUTF8 (objectsRepresentation) –

5

PyObject_Repr veya PyObject_Str (Python en str taklit) (Python en repr taklit) deneyin.

Dokümanlar:

Compute a string representation of object o. Returns the string representation on success, NULL on failure. This is the equivalent of the Python expression repr(o). Called by the repr() built-in function.

+0

bu görünüyor: Burada

const char* s = PyString_AsString(yourObject); 

+0

PyBytes_AS_STRING, PyUnicode_AS_STRING, ... –

3

Python 3 kullanıyorsanız Doğru cevap İhtiyacım olan şey gibi ... Bir kez bu işlevlerden biri tarafından döndürülen PyObject'i aldım, bunu C-dostu bir şekilde (örn. printf, vb)