Manipulating sets from the 2.4 C API?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Dave Opstad

    #1

    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
  • Jack Diederich

    #2
    Re: Manipulating sets from the 2.4 C API?

    On Tue, Apr 11, 2006 at 09:29:10AM -0700, Dave Opstad wrote:[color=blue]
    > 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.[/color]

    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.
    [color=blue]
    > 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?[/color]

    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

    Comment

    • Martin v. Löwis

      #3
      Re: Manipulating sets from the 2.4 C API?

      Dave Opstad wrote:[color=blue]
      > 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?[/color]

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

      PyObject_Call(P ySet_Type, "");

      To, say, invoke the add method, do

      PyObject_CallMe thod(s, "add", "O", o);

      HTH,
      Martin

      Comment

      • Felipe Almeida Lessa

        #4
        Re: Manipulating sets from the 2.4 C API?

        Em Ter, 2006-04-11 às 18:55 +0200, "Martin v. Löwis" escreveu:[color=blue]
        > Dave Opstad wrote:[color=green]
        > > 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?[/color]
        >
        > Indeed, there is. To create a new set, do
        >
        > PyObject_Call(P ySet_Type, "");
        >
        > To, say, invoke the add method, do
        >
        > PyObject_CallMe thod(s, "add", "O", o);[/color]

        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.

        Comment

        • Raymond Hettinger

          #5
          Re: Manipulating sets from the 2.4 C API?

          Dave Opstad wrote:[color=blue]
          > 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.[/color]

          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_Call Object(PySet_Ty pe, NULL) // s=set()
          PyObject_TypeCh eck(o, &PySet_Type) // isinstance(o, set)
          PyObject_GetIte r(s) // iter(s)
          PyObject_Hash(f ) // hash of frozenset
          PyObject_Length (s) // len(s)
          PyNumber_Subtra ct(s,t) // s - t
          PyObject_CallMe thod(s, "pop", NULL) // s.pop()

          [color=blue]
          > 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?[/color]

          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( ), ...

          Comment

          Working...