Skip to content

[C API] Add PySys_GetAttr() function #129367

Description

@vstinner

Feature or enhancement

Proposal:

The existing PySys_GetObject() function has two issues:

  • It returns a borrowed reference.
  • It ignores errors.

I propose adding new functions PySys_GetAttr() and PySys_GetAttrString() to get a sys module attribute which return a strong reference and don't ignore errors.

API:

PyObject *PySys_GetAttr(PyObject *name)
PyObject *PySys_GetAttrString(const char *name)
  • Return a new object (strong reference) on success.

  • Set an exception and return NULL on error:

    • Set an AttributeError if the attribute doesn't exist.
    • Set a RuntimeError if the sys module cannot be retrieved.

Has this already been discussed elsewhere?

No response given

Links to previous discussion of this feature:

No response

Linked PRs

Activity

  1. added a commit that references this issue on Jan 27, 2025
  2. vstinner commented on Jan 27, 2025

    @vstinner
    MemberAuthor

    An alternative would be to accept an object and add a String function for the const char* argument:

    PyObject *PySys_GetAttr(PyObject *name)
    PyObject *PySys_GetAttrString(const char *name)
    

    I'm not sure if it's worth it to have an alternative with PyObject*.

    UPDATE: I added PySys_GetAttrString(). @serhiy-storchaka conducted a code analysis in 2023 and found that we need a function which takes a PyObject* name.

    By the way, I'm also proposing to add PyImport_ImportModuleAttrString(mod_name, attr_name) which is similar: PyImport_ImportModuleAttrString("sys", "path") can be used to get sys.path for example. See issue #128911.

    IMO it's still relevant to add PySys_GetAttrString(name) even if PyImport_ImportModuleAttrString(mod_name, attr_name) is added: PySys_GetAttrString(name) is faster, it doesn't have to go into the importlib machinery.

  3. vstinner commented on Jan 27, 2025

    @vstinner
    MemberAuthor

    See also #108512 "C API: Add a replacement for PySys_GetObject".

  4. serhiy-storchaka commented on Jan 28, 2025

    @serhiy-storchaka
    Member

    Isn't it a duplicate of #108512? That issue turned out to be more complex, because we have at least 4 different functions that implements this with different particularities.

  5. vstinner commented on Jan 28, 2025

    @vstinner
    MemberAuthor

    Isn't it a duplicate of #108512?

    Right. I close my issue.

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