Skip to content

[C API] Add PyDict_ContainsString() function #108314

Description

@vstinner

Feature or enhancement

Has this already been discussed elsewhere?

No response given

Links to previous discussion of this feature:

No response

Proposal:

Most, if not all, PyDict C APIs have a "String" flavor where the key argument is expressed as a UTF-8 encoded bytes string. But the PyDict_Contains() API is missing such variant.

I suppose that it was not proposed before since PyDict_GetItemString(dict, key) != NULL can already be used. My problem is that PyDict_GetItemString() ignores errors: I would like to report errors.

The newly added PyDict_GetItemStringRef() can be used to check if a dictionary has a key and report errors, but it requires calling Py_DECREF() which is not convenient. Example:

PyObject *value;
if (PyDict_GetItemStringRef(dict, key, &value) < 0) {
    // ... handle error ...
}
int has_value = (value != NULL);
Py_XDECREF(value);
// ... use has_value ...

I would like to be able to replace this code with:

int has_value = PyDict_ContainsString(dict, key);
if (has_value < 0) {    
    // ... handle error ...
}
// ... use has_value ...

There is no need to INCREF/DECREF just to check if a dictionary has a key.

Linked PRs

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions