-
-
Notifications
You must be signed in to change notification settings - Fork 30.2k
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
Argument Clinic: support for simple expressions? #64425
Comments
Take for example select.epoll.__new__(): static PyObject *
pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
int flags = 0, sizehint = FD_SETSIZE - 1;
static char *kwlist[] = {"sizehint", "flags", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii:epoll", kwlist,
&sizehint, &flags))
return NULL; How should that be handled? Currently I can't specify |
See also a discussion in bpo-20193. zlib needs this in many functions. |
Yes, this is supported, just undocumented (for now). The magic you want is, for example in Modules/_sre.c: endpos: Py_ssize_t(c_default="PY_SSIZE_T_MAX") = sys.maxsize |
Nice, thanks. |
The attached patch extends Argument Clinic and the inspect module: now you may use simple (!) expressions as default values. So for example "sys.maxsize - 1" should now work fine.
Other changes in this diff:
The docs still need work. More tests would be good too but I'm already overwhelmed by work--could one of you guys contribute some tests? |
Larry, nice. I am verified that your latest patch fixes my third sqlite3 |
Just confirmed that this patch fixes the traceback I was getting from winreg in bpo-20172, but this has a new oddity: >>> help(winreg)
...
ConnectRegistry(computer_name=<object object at 0x0190E148>, key=<object object at 0x0190E148>)
... Every param of every function has this kind of thing, positional or keyword, default or no. I'll try to look into it, but my hopes aren't high (much of clinic's inner workings are still mysterious to me). |
That's okay, email me a sample at larry at hastings dot org and I'll take a look at it. Be sure to tell me which patch(es) were applied at the time. (Note: all you need to send is the Clinic block.) |
Actually, I can reproduce on tip with just this patch applied; os.chmod shows it. And I was wrong, params that have a default are correct, it's just ones without. |
I'd prefer it if you emailed me as I asked. That will help me get to it a lot quicker. |
Okay, I have a fix for the help(os.chmod) problem, that'll be in the next refreshed patch. |
Why not allow arbitrary string as py_default? |
Isn't that what it does? I may actually remove py_default. Nobody uses it, and I don't think you need it--you just specify what you want as the real default value. |
Second rollup patch. More small fixes, many suggested by other folks. |
It would be better if you commit a patch which changes PyTuple_Size to PyTuple_GET_SIZE in separate commit. |
Excellent! I'm rewriting the zlib module and the code becomes much cleaner with this patch. There is one problem left -- Py_buffer doesn't support default value at all. Such code /[clinic input] produces error: When you specify a named constant ('unspecified') as your default value, But this code /[clinic input] produces error too: The only legal default value for Py_buffer is None. And specifying c_default=None returns first error. |
Py_buffer is currently inflexible. The only default value it accepts is None. If you want it to be required, give it no default value. If you want it to be optional, give it a default value of None. Do you have a use case for any other default value? |
Third patch, changes based on Georg's review. Thanks, Georg! |
Rietveld doesn't like your new patch? |
Sorry, forgot to update trunk, here you go. |
Thx! (without soundcheck) |
New changeset abf87e1fbc62 by Larry Hastings in branch 'default': |
Done! Georg: Thanks for the suggestion, and for the reviews! Argument Clinic is improved this day. |
New changeset cd3fdf21a6e4 by Larry Hastings in branch 'default': |
* You may now specify an expression as the default value for a parameter! Example: "sys.maxsize - 1". This support is intentionally quite limited; you may only use values that can be represented as static C values. * Removed "doc_default", simplified support for "c_default" and "py_default". (I'm not sure we still even need "py_default", but I'm leaving it in for now in case a use presents itself.) * Parameter lines support a trailing '\\' as a line continuation character, allowing you to break up long lines. * The argument parsing code generated when supporting optional groups now uses PyTuple_GET_SIZE instead of PyTuple_GetSize, leading to a 850% speedup in parsing. (Just kidding, this is an unmeasurable difference.) * A bugfix for the recent regression where the generated prototype from pydoc for builtins would be littered with unreadable "=<object ...>"" default values for parameters that had no default value. * Converted some asserts into proper failure messages. * Many doc improvements and fixes. GitHub-Issue-Link: python/cpython#64425
* You may now specify an expression as the default value for a parameter! Example: "sys.maxsize - 1". This support is intentionally quite limited; you may only use values that can be represented as static C values. * Removed "doc_default", simplified support for "c_default" and "py_default". (I'm not sure we still even need "py_default", but I'm leaving it in for now in case a use presents itself.) * Parameter lines support a trailing '\\' as a line continuation character, allowing you to break up long lines. * The argument parsing code generated when supporting optional groups now uses PyTuple_GET_SIZE instead of PyTuple_GetSize, leading to a 850% speedup in parsing. (Just kidding, this is an unmeasurable difference.) * A bugfix for the recent regression where the generated prototype from pydoc for builtins would be littered with unreadable "=<object ...>"" default values for parameters that had no default value. * Converted some asserts into proper failure messages. * Many doc improvements and fixes. GitHub-Issue-Link: python/cpython#64425
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:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: