On 10/08/2011 04:54 PM, "Martin v. Löwis" wrote:
      tmp = PyObject_CallMethod(result, "update", "O", other);

would be replaced with

       PyObject *tmp;
       Py_identifier(update);
       ...
       tmp = PyObject_CallMethodId(result,&PyId_update, "O", other);

An alternative I am fond of is to to avoid introducing a new type, and simply initialize a PyObject * and register its address. For example:

  PyObject *tmp;
  static PyObject *s_update;    // pick a naming convention

  PY_IDENTIFIER_INIT(update);
  tmp = PyObject_CallMethodObj(result, s_update, "O", other);

  (but also PyObject_GetAttr(o, s_update), etc.)

PY_IDENTIFIER_INIT(update) might expand to something like:

  if (!s_update) {
    s_update = PyUnicode_InternFromString("update");
    _Py_IdentifierAdd(&s_update);
  }

_PyIdentifierAdd adds the address of the variable to a global set of C variables that need to be decreffed and zeroed-out at interpreted shutdown.

The benefits of this approach is:
  * you don't need special "identifier" versions of functions such as
    PyObject_CallMethod. In my example I invented a
    PyObject_CallMethodObj, but adding that might be useful anyway.
  * a lot of Python/C code implements similar caching, often
    leaking strings.

Hrvoje
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to