[Python-Dev] PEP 457: Syntax For Positional-Only Parameters
Benjamin Peterson
benjamin at python.org
Wed Oct 9 16:24:06 CEST 2013
2013/10/9 Larry Hastings <larry at hastings.org>:
>
> On 10/09/2013 03:31 AM, Benjamin Peterson wrote:
>
> 2013/10/8 Larry Hastings <larry at hastings.org>:
>
> This PEP proposes a backwards-compatible syntax that should
> permit implementing any builtin in pure Python code.
>
> This is rather too strong. You can certainly implement them; you just
> have to implement the argument parsing yourself.
>
>
> Can you suggest an alternative wording? What I was trying to say was, you
> cannot express many builtin's signatures in pure Python code. I guess
> "implement" is the bad word here--you can implement those semantics, but you
> cannot express it syntactically. So how about
>
> This PEP proposes a backwards-compatible syntax that should permit
> expressing the signature of any builtin as a Python function.
That's fine.
>
>
> Python's
> call/signature syntax is already extremely expressive, and resolving
> call arguments to formal parameters is already a complicated (and
> slow) process.
>
>
> Well, I did propose that the syntax not actually be implemented.
Yes, that's good.
>
>
> Implementing functions with such strange argument
> semantics is hardly common enough to justify the whole grouping syntax
> proposed in this PEP. -1 to that. I think I can live with "/", but
> YANGTNI still.
>
>
> On the contrary, I can tell you exactly when I'm going to need it.
>
> What happens when you run "help(foo)"? pydoc examines the signature of the
> function and generates the first line, the function's prototype. For
> builtins, pydoc currently sees that there is no introspection information
> and skips the generation, which is why docstrings for builtins by convention
> have a handwritten prototype as their first line.
>
> Let's assume that the Argument Clinic PEP is accepted, and my current
> implementation goes in, and I add introspection metadata for builtins. Once
> we have this metadata, pydoc will use it and generate that first line for
> builtins itself.
>
> Now: what happens when you run "help(curses.window.addch)"? *
>
> My first problem: Argument Clinic has to allow the core C developer to
> express the signature of addch. The syntax is Python-like, if you change
> the commas into newlines and enforce a few extra rules regarding leading
> whitespace. But Python's existing syntax can't communicate the semantics of
> addch. Nobody fought me on Clinic's need to express this sort of function,
> though I had plenty of bikeshedding on the syntax. Then Guido dictated a
> syntax at PyCon US 2013, and that was that.
>
> My second problem: I have to communicate the metadata in Argument Clinic's
> output to the CPython runtime. Almost nobody cares what this looks like, as
> it will be an implementation detail. But I suspect there will be one or two
> places where you can't use Clinic yet, so you'll be writing this metadata by
> hand. So it needs to be cogent and human readable. Barry Warsaw suggested
> that the best syntax--not only most readable, but most compact--was to just
> use Python's own syntax. Again, existing Python syntax can't communicate
> the semantics of addch. So I expect to use this syntax for the metadata of
> builtins.
>
> My third problem: I have to represent the signature of these functions with
> inspect.Signature. Parameter objects can be marked as having a "kind" of
> inspect.Parameter.POSITIONAL_ONLY, so inspect has at least tacit, vestigial
> support for positional-only parameters. In practice this is insufficient to
> express the semantics of addch. IIRC Brett said I could add a "group" field
> to inspect.Parameter indicating the "option group" of a parameter. (There's
> no way I'm modifying inspect.getargspec() or inspect.getfullargspec() to
> represent positional-only parameters.)
>
> My fourth problem: I have to modify pydoc so it uses inspect.signature()
> instead of inspect.getfullargspec(), then understands the new semantics of
> positional-only parameters. And then it needs to generate that first line.
> But what should that line look like--what should be its syntax? It's
> written in Python syntax, but Python existing syntax can't communicate the
> semantics of addch. So I expect to use this syntax for the first line
> generated by pydoc.
>
> And there you have it. I have to represent the semantics of addch in four
> places, and three of those are textual. Two are implementation details, but
> in practice they will use Python syntax. The third is documentation but
> should also be Python syntax.
>
>
> My goal with the PEP is to codify existing practice. I find it a bit
> perverse that we have functions callable in Python with call signatures one
> cannot express syntactically in Python, and with undocumented semantics
> (their parameters are positional-only but this is not mentioned). I
> understand it's all kind of a historical accident, but it is absolutely part
> of Python and it's not going away.
You can express any wild argument semantics you want in Python with
*args and **kwargs. If the "strange" C functions like range() and
addch() get signature objects, I don't think it's the end of world if
it looks like a Python *args, **kwargs signature.
>
> My proposed syntax is a little complex--but complex is better than
> complicated and inconsistent and undocumented and inconvenient, which is
> what we have now.
Certainly the argument conventions of these functions are not
undocumented, so wonder what is. Also, inconvenient for what? What
inconsistency problem does this PEP solve?
--
Regards,
Benjamin
More information about the Python-Dev
mailing list