Re: Can't get iterator in the C API
Thank you for clarifying that. Now on to getting the iterator from the method. Jen Feb 8, 2022, 18:10 by pyt...@mrabarnett.plus.com: > On 2022-02-09 01:12, Jen Kris via Python-list wrote: > >> I am using the Python C API to load the Gutenberg corpus from the nltk >> library and iterate through the sentences. The Python code I am trying to >> replicate is: >> >> from nltk.corpus import gutenberg >> for i, fileid in enumerate(gutenberg.fileids()): >> sentences = gutenberg.sents(fileid) >> etc >> >> where gutenberg.fileids is, of course, iterable. >> >> I use the following C API code to import the module and get pointers: >> >> int64_t Call_PyModule() >> { >> PyObject *pModule, *pName, *pSubMod, *pFidMod, *pFidSeqIter,*pSentMod; >> >> pName = PyUnicode_FromString("nltk.corpus"); >> pModule = PyImport_Import(pName); >> >> if (pModule == 0x0){ >> PyErr_Print(); >> return 1; } >> >> pSubMod = PyObject_GetAttrString(pModule, "gutenberg"); >> pFidMod = PyObject_GetAttrString(pSubMod, "fileids"); >> pSentMod = PyObject_GetAttrString(pSubMod, "sents"); >> >> pFidIter = PyObject_GetIter(pFidMod); >> int ckseq_ok = PySeqIter_Check(pFidMod); >> pFidSeqIter = PySeqIter_New(pFidMod); >> >> return 0; >> } >> >> pSubMod, pFidMod and pSentMod all return valid pointers, but the iterator >> lines return zero: >> >> pFidIter = PyObject_GetIter(pFidMod); >> int ckseq_ok = PySeqIter_Check(pFidMod); >> pFidSeqIter = PySeqIter_New(pFidMod); >> >> So the C API thinks gutenberg.fileids is not iterable, but it is. What am I >> doing wrong? >> > Look at your Python code. You have "gutenberg.fileids()", so the 'fileids' > attribute is not an iterable itself, but a method that you need to call to > get the iterable. > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
Re: Can't get iterator in the C API
On 2022-02-09 01:12, Jen Kris via Python-list wrote: I am using the Python C API to load the Gutenberg corpus from the nltk library and iterate through the sentences. The Python code I am trying to replicate is: from nltk.corpus import gutenberg for i, fileid in enumerate(gutenberg.fileids()): sentences = gutenberg.sents(fileid) etc where gutenberg.fileids is, of course, iterable. I use the following C API code to import the module and get pointers: int64_t Call_PyModule() { PyObject *pModule, *pName, *pSubMod, *pFidMod, *pFidSeqIter,*pSentMod; pName = PyUnicode_FromString("nltk.corpus"); pModule = PyImport_Import(pName); if (pModule == 0x0){ PyErr_Print(); return 1; } pSubMod = PyObject_GetAttrString(pModule, "gutenberg"); pFidMod = PyObject_GetAttrString(pSubMod, "fileids"); pSentMod = PyObject_GetAttrString(pSubMod, "sents"); pFidIter = PyObject_GetIter(pFidMod); int ckseq_ok = PySeqIter_Check(pFidMod); pFidSeqIter = PySeqIter_New(pFidMod); return 0; } pSubMod, pFidMod and pSentMod all return valid pointers, but the iterator lines return zero: pFidIter = PyObject_GetIter(pFidMod); int ckseq_ok = PySeqIter_Check(pFidMod); pFidSeqIter = PySeqIter_New(pFidMod); So the C API thinks gutenberg.fileids is not iterable, but it is. What am I doing wrong? Look at your Python code. You have "gutenberg.fileids()", so the 'fileids' attribute is not an iterable itself, but a method that you need to call to get the iterable. -- https://mail.python.org/mailman/listinfo/python-list
Can't get iterator in the C API
I am using the Python C API to load the Gutenberg corpus from the nltk library and iterate through the sentences. The Python code I am trying to replicate is: from nltk.corpus import gutenberg for i, fileid in enumerate(gutenberg.fileids()): sentences = gutenberg.sents(fileid) etc where gutenberg.fileids is, of course, iterable. I use the following C API code to import the module and get pointers: int64_t Call_PyModule() { PyObject *pModule, *pName, *pSubMod, *pFidMod, *pFidSeqIter,*pSentMod; pName = PyUnicode_FromString("nltk.corpus"); pModule = PyImport_Import(pName); if (pModule == 0x0){ PyErr_Print(); return 1; } pSubMod = PyObject_GetAttrString(pModule, "gutenberg"); pFidMod = PyObject_GetAttrString(pSubMod, "fileids"); pSentMod = PyObject_GetAttrString(pSubMod, "sents"); pFidIter = PyObject_GetIter(pFidMod); int ckseq_ok = PySeqIter_Check(pFidMod); pFidSeqIter = PySeqIter_New(pFidMod); return 0; } pSubMod, pFidMod and pSentMod all return valid pointers, but the iterator lines return zero: pFidIter = PyObject_GetIter(pFidMod); int ckseq_ok = PySeqIter_Check(pFidMod); pFidSeqIter = PySeqIter_New(pFidMod); So the C API thinks gutenberg.fileids is not iterable, but it is. What am I doing wrong? -- https://mail.python.org/mailman/listinfo/python-list