On 7 Jul, 2013, at 19:20, Larry Hastings <la...@hastings.org> wrote:

> On 07/07/2013 01:42 PM, Ronald Oussoren wrote:
>> On 7 Jul, 2013, at 13:35, Larry Hastings <la...@hastings.org>
>>  wrote:
>> 
>>> On 07/07/2013 07:25 AM, Ronald Oussoren wrote:
>>> 
>>>> Signature objects use a name in angled brackets to indicate that a 
>>>> parameter is positional only, for example "input(<prompt>)". That might be 
>>>> an alternative to adding a "/" in the argument list in pydoc's output.
>>>> 
>>>> 
>>> I wasn't aware that Signature objects currently had any support whatsoever 
>>> for positional-only parameters.  Yes, in theory they do, but in practice 
>>> they have never seen one, because positional-only parameters only occur in 
>>> builtins and Signature objects have no metadata for builtins.  (The very 
>>> problem Argument Clinic eventually hopes to solve!)
>>> 
>>> Can you cite an example of this, so I may examine it?
>>> 
>> I have a branch of PyObjC that uses this: 
>> <https://bitbucket.org/ronaldoussoren/pyobjc-3.0-unstable/overview>
>> . That branch isn't quite stable yet, but does add a __signature__ slot to 
>> objc.selector and objc.function (basicly methods of Cocoa classes and 
>> automaticly wrapped global functions), both of which only have 
>> positional-only arguments. With the patch for pydoc/inspect I mentioned 
>> earlier I can then generate somewhat useful documentation for Cocoa classes 
>> using pydoc.
>> 
>> A word of warning though: the PyObjC source code isn't the most 
>> approachable, the code that generates the Signature object is actually in 
>> python (callable_signature in pyobjc-core/Lib/objc/_callable_docstr.py)
>> 
> 
> Ah.  In other words, you have proposed it yourself in an external project.  I 
> thought you were saying this was something Python itself already did.

I wasn't clear enough in what I wrote.  The stdlib contains support for 
positional-only arguments in Signature objects (see Lib/inspect.py, line 1472, 
which says "_POSITIONAL_ONLY        = _ParameterKind(0, 
name='POSITIONAL_ONLY')".  The __str__ of Parameter amongst other says:

        if kind == _POSITIONAL_ONLY:
            if formatted is None:
                formatted = ''
            formatted = '<{}>'.format(formatted)

That is, it adds angled brackets around the names of positional-only 
parameters.  I pointed to PyObjC as an example of code that actually creates 
Signature objects with positional-only arguments, as far as I know the stdlib 
never does this because the stdlib can only create signatures for plain python 
functions and those cannot have such arguments.

> In that case, I think I will stick with Guido's suggested syntax.  Consider 
> window.border in the curses module: eight positional-only parameters, each in 
> its own optional parameter group.  Adding sixteen angle-brackets to that 
> already unreadable morass will make it even worse.  But with "/" we add only 
> a single extra character, in an easy-to-find place (the end).

Using Guido's suggestion is fine by me, I agree that there is a clear risk of 
angle-bracket overload for functions with a lot of arguments. I do think that 
the __str__ for Signatures should be changed to match the convention. 

And to be clear: I'm looking forward to having Argument Clinic and 
__signature__ objects on built-in functions, "funcname(...)" in the output 
pydoc is somewhat annoying, especially for extensions where the author hasn't 
bothered to provide a docstring. That's one reason I wrote the __signature__ 
support in PyObjC in the first place (and the patch for pydoc to actually use 
the signature information)

Ronald

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to