Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

__text_signature__ parser doesn't handle globals in extension module #82062

Closed
anntzer mannequin opened this issue Aug 18, 2019 · 1 comment
Closed

__text_signature__ parser doesn't handle globals in extension module #82062

anntzer mannequin opened this issue Aug 18, 2019 · 1 comment
Labels
3.13 bugs and security fixes stdlib Python modules in the Lib dir

Comments

@anntzer
Copy link
Mannequin

anntzer mannequin commented Aug 18, 2019

BPO 37881
Nosy @ericsnowcurrently, @anntzer

Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

Show more details

GitHub fields:

assignee = None
closed_at = None
created_at = <Date 2019-08-18.13:33:56.559>
labels = ['extension-modules']
title = "__text_signature__ parser doesn't handle globals in extension module"
updated_at = <Date 2020-10-08.11:34:43.922>
user = 'https://github.com/anntzer'

bugs.python.org fields:

activity = <Date 2020-10-08.11:34:43.922>
actor = 'pitrou'
assignee = 'none'
closed = False
closed_date = None
closer = None
components = ['Extension Modules']
creation = <Date 2019-08-18.13:33:56.559>
creator = 'Antony.Lee'
dependencies = []
files = []
hgrepos = []
issue_num = 37881
keywords = []
message_count = 1.0
messages = ['349919']
nosy_count = 3.0
nosy_names = ['eric.snow', 'Antony.Lee', 'Eric Wieser']
pr_nums = []
priority = 'normal'
resolution = None
stage = None
status = 'open'
superseder = None
type = None
url = 'https://bugs.python.org/issue37881'
versions = []

Linked PRs

@anntzer
Copy link
Mannequin Author

anntzer mannequin commented Aug 18, 2019

Starting from the custom2 example at https://docs.python.org/3/extending/newtypes_tutorial.html#adding-data-and-methods-to-the-basic-example, change the methods table to

static PyMethodDef Custom_methods[] = {
    {"foo", (PyCFunction) Custom_foo, METH_VARARGS,
    "foo(x=ONE)\n--\n\nFoos this."
    },
    {NULL}  /* Sentinel */
};

and add a global ONE to the module dict:

    PyModule_AddObject(m, "ONE", PyLong_FromLong(1));

Building and running e.g. pydoc on this module results in

    Traceback (most recent call last):
    File ".../lib/python3.7/inspect.py", line 2003, in wrap_value
        value = eval(s, module_dict)
    File "<string>", line 1, in <module>
    NameError: name 'ONE' is not defined

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File ".../lib/python3.7/inspect.py", line 2006, in wrap_value
        value = eval(s, sys_module_dict)
    File "<string>", line 1, in <module>
    NameError: name 'ONE' is not defined

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File ".../lib/python3.7/runpy.py", line 193, in _run_module_as_main
        "__main__", mod_spec)
    <elided>
    File ".../lib/python3.7/inspect.py", line 2008, in wrap_value
        raise RuntimeError()
    RuntimeError

I think the fix is fairly simple; one needs to replace

    module_name = getattr(obj, '__module__', None)

in inspect.py::_signature_fromstr by

    module_name = (getattr(obj, '__module__', None)
                   or getattr(getattr(obj, '__objclass__'), '__module__', None))

(This is a less general but simpler solution than https://bugs.python.org/issue23967.)

@anntzer anntzer mannequin added the extension-modules C modules in the Modules dir label Aug 18, 2019
@ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
skirpichev added a commit to skirpichev/cpython that referenced this issue Feb 11, 2024
… inspect.signature()

The ``__module__`` attribute is missing for instance methods in extension
modules, so instead we use in this case ``__objclass__.__module__``.
skirpichev added a commit to skirpichev/cpython that referenced this issue Feb 26, 2024
serhiy-storchaka pushed a commit that referenced this issue May 2, 2024
…odules (GH-115270)

Now inspect.signature() supports references to the module globals in
parameter defaults on methods in extension modules.  Previously it was
only supported in functions.  The workaround was to specify the fully
qualified name, including the module name.
@serhiy-storchaka serhiy-storchaka added stdlib Python modules in the Lib dir 3.13 bugs and security fixes and removed extension-modules C modules in the Modules dir labels May 2, 2024
SonicField pushed a commit to SonicField/cpython that referenced this issue May 8, 2024
…sion modules (pythonGH-115270)

Now inspect.signature() supports references to the module globals in
parameter defaults on methods in extension modules.  Previously it was
only supported in functions.  The workaround was to specify the fully
qualified name, including the module name.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.13 bugs and security fixes stdlib Python modules in the Lib dir
Projects
None yet
Development

No branches or pull requests

1 participant