469,306 Members | 1,903 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,306 developers. It's quick & easy.

Manipulating sets from the 2.4 C API?

I just looked through the Python/C API reference for 2.4.3 and didn't
see anything about using sets. I'd been expecting things like PySet_New,
PySet_Check etc.

If I want to handle sets should I just use a dictionary's keys and
ignore the values, or is there some more explicit set support somewhere
I'm not seeing?

Thanks,
Dave Opstad
Apr 11 '06 #1
4 1145
On Tue, Apr 11, 2006 at 09:29:10AM -0700, Dave Opstad wrote:
I just looked through the Python/C API reference for 2.4.3 and didn't
see anything about using sets. I'd been expecting things like PySet_New,
PySet_Check etc.
There is a public C API starting in 2.5, the progression for sets was
pure-python in 2.3, C in 2.4, and polished in 2.5 after it was better
understood how people use them. If Hettinger is around he'll correct me
if that explanation is off.
If I want to handle sets should I just use a dictionary's keys and
ignore the values, or is there some more explicit set support somewhere
I'm not seeing?


There are people that use sets from C-code but I don't know if they use
the slotted methods, the 2.5 version, or a special build.

-Jack
Apr 11 '06 #2
Dave Opstad wrote:
If I want to handle sets should I just use a dictionary's keys and
ignore the values, or is there some more explicit set support somewhere
I'm not seeing?


Indeed, there is. To create a new set, do

PyObject_Call(PySet_Type, "");

To, say, invoke the add method, do

PyObject_CallMethod(s, "add", "O", o);

HTH,
Martin
Apr 11 '06 #3
Em Ter, 2006-04-11 *s 18:55 +0200, "Martin v. Löwis" escreveu:
Dave Opstad wrote:
If I want to handle sets should I just use a dictionary's keys and
ignore the values, or is there some more explicit set support somewhere
I'm not seeing?


Indeed, there is. To create a new set, do

PyObject_Call(PySet_Type, "");

To, say, invoke the add method, do

PyObject_CallMethod(s, "add", "O", o);


I don't know much about the C API, but I'll ask anyway: the methods,
say, PySet, would be included for clarity/brevity or for performance
reasons?

--
Felipe.

Apr 11 '06 #4
Dave Opstad wrote:
I just looked through the Python/C API reference for 2.4.3 and didn't
see anything about using sets. I'd been expecting things like PySet_New,
PySet_Check etc.
In Py2.4, there was not a custom set C API because the module was still
ungoing significant development. For 2.4, the best way to access sets
from C is to use the abstract API:

s=PyObject_CallObject(PySet_Type, NULL) // s=set()
PyObject_TypeCheck(o, &PySet_Type) // isinstance(o, set)
PyObject_GetIter(s) // iter(s)
PyObject_Hash(f) // hash of frozenset
PyObject_Length(s) // len(s)
PyNumber_Subtract(s,t) // s - t
PyObject_CallMethod(s, "pop", NULL) // s.pop()

If I want to handle sets should I just use a dictionary's keys and
ignore the values, or is there some more explicit set support somewhere
I'm not seeing?


In Py2.4, set objects are based on dictionaries so the performance is
about the same, so the only advantage of using set objects instead of
dictionaries is that they provide methods like union, intersection, etc
which are not defined for dictionaries.

In Py2.5, set objects are no longer based on dictionaries and tend to
have better speed/space performance than equivalent dictionary code.
There is also a more full-blown C API including PySet_New(),
PySet_Size(), PySet_Add(), PySet_Contains(), ...

Apr 11 '06 #5

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

21 posts views Thread by Raymond Hettinger | last post: by
5 posts views Thread by Raymond Hettinger | last post: by
1 post views Thread by Gerrit Holl | last post: by
7 posts views Thread by Steve | last post: by
2 posts views Thread by James Dean | last post: by
1 post views Thread by JosAH | last post: by
reply views Thread by suresh191 | last post: by
reply views Thread by harlem98 | last post: by
1 post views Thread by Geralt96 | last post: by
reply views Thread by harlem98 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.