On 18 Feb 2008, at 19:39, Talin wrote:

> Arnaud Delobelle wrote:
>>
[...]
>> Unconvincingly yours,
>
> Well, that is certainly a logical continuation of the train of  
> thought behind the 'single *' syntax.

> I'd be curious to know which parts of 3102 people are finding most  
> useful. You see, the itch that I was originally attempting to  
> scratch concerned just the narrow use case of combining a 'varargs'  
> function with optional keywords. I've seen/written a lot of code  
> where you have a function that takes a list of arguments, with a  
> couple of optional keywords that control how that list is handled,  
> and 3102 was intended to make that case much easier to handle.

Another use would be allowing the '_cache trick' with a varargs  
function, i.e.

def f(*args, _cache={}):
        ...

Personally I don't like this trick though...

> I was never all that interested in 'forcing' some of the arguments  
> to a non-varargs function to be specified by keyword. I am perfectly  
> comfortable with the idea that the caller always gets to choose  
> whether to pass something positionally or via keyword, and limiting  
> the caller's choice seems vaguely unpythonic to me. However, I  
> included that part in the PEP based on the feedback from here.
>
> In any case, limiting arguments to being specified by keyword-only  
> or positional-only was not part of my original 'itch', and I am  
> curious as to what are the use cases for it that people are  
> envisioning.
>

A typical use of positional-only arguments is with a function

def f(x, y=1, **kwargs):
        ...

where keyword arguments are potentially anything at all, including x  
and y.  For example: dict.update().  In fact it is a fairly  
symmetrical itch to yours: without positional only arguments, the  
above must be written something like:

def f(*args, **kwargs):
        nargs = len(args)
        if 1 <= nargs <= 2:
                x = args[0]
                y = args[1] if nargs==2 else 1
        else:
                raise blah
        ...

whereas with positional-only arguments (using the syntax I put  
forward) one could write simply:

def f(**kwargs, x, y=1)

Just like

def f(*args, a, b=1):
        ...

had to be written pre-PEP 3102 as something like:

def f(*args, **kwargs):
        a = kwargs.pop('a')
        b = kwargs.pop('b', 1)
        if kwargs:
                raise blah      

Both itches are about not having to unpack something: **kwargs in the  
case of PEP 3102, *args in the case of positional-only arguments.


-- 
Arnaud

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

Reply via email to