[Python-Dev] pep 362 - 5th edition (original) (raw)
Nick Coghlan ncoghlan at gmail.com
Wed Jun 20 04:31:45 CEST 2012
- Previous message: [Python-Dev] pep 362 - 5th edition
- Next message: [Python-Dev] pep 362 - 5th edition
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On Wed, Jun 20, 2012 at 12:15 PM, Yury Selivanov <yselivanov at gmail.com> wrote:
On 2012-06-19, at 10:06 PM, Nick Coghlan wrote:
True, the check for name clashes in Signature (and the implied numeric "names") will cover the BoundArguments.parameters case Nick, I also would like to keep Parameter.name being required. I understand that currently we have no parameter names specified for builtin methods, but we don't have any mechanisms to introspect them too.
Sure, so long as the name requirement is enforced at construction time
- the current code will happily accept None as the first argument to parameter.
Now, in 3.3 (I hope) we introduce a brand new mechanism, and, probably, in 3.4 we have way to define Signatures for builtins. Why not do it right? This whole positional-only case is just a weird anachronism of CPython.
No, it's a characteristic of any FFI - not all target languages will support keyword arguments. CPython just happens to use such an FFI as part of its implementation (due to the nature of the PyArg_Parse* APIs).
There have been serious (albeit failed so far) attempts at coming up with an acceptable language level syntax for positional only arguments on python-ideas, since they're a useful concept when you want to avoid name clashes with arbitrary keyword arguments and you can effectively implement them in Python using a nested function call to get the correct kind of error:
def _positional_only(a, b, c):
return a, b, c
def f(*args, **kwds): # "a", "b", "c" are supported as values in "kwds"
a, b, c = _positional_only(*args)
With PEP 362, we can at least represent the above API cleanly, even though there's still no dedicated syntax:
>>> def _param(name): return Parameter(name, Parameter.POSITIONAL_ONLY)
>>> s = Signature([_param("a"), _param("b"), _param("c"),
Parameter("kwds", Parameter.VAR_KEYWORD]) >>> str(s) (, , , **kwds)
If a syntax for positional only parameters is ever defined in the future, then the Signature str implementation can be updated to use it at the time.
Cheers, Nick.
-- Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
- Previous message: [Python-Dev] pep 362 - 5th edition
- Next message: [Python-Dev] pep 362 - 5th edition
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]