[Python-ideas] Positional only arguments

Steven Bethard steven.bethard at gmail.com
Wed May 16 19:17:30 CEST 2007

On 5/16/07, Guido van Rossum <guido at python.org> wrote:
> But I'd love to see better syntax for positional-only arguments. What
> I would like to be able to do is somehow write a signature like this:
>   def foo(abc, xyz=42): ...
> where both arguments (if present) *must* be given using positional
> notation, so that foo(42) and foo(42, 24) are legal, but foo(abc=42)
> and foo(42, xyz=24) are illegal. (Alas, I don't have any clever
> suggestions.)

I'd particularly like to see some way to do this because it would make
duplicating the dict() and dict.update() signatures easier.  Currently
you could write::

    class C(object):
        def __init__(self, obj=None, **kwargs):

but this breaks when you try something like::

    C(obj='foo', bar='baz')

and expect both keyword arguments to be caught in the **kwargs.  And
let's hope you never need to write something like::

    C(self=1, other=2)

where you'll get a::

    TypeError: __init__() got multiple values for keyword argument 'self'

The current correct version looks like::

    class C(object):
        def __init__(*args, **kwargs):
            self = args[0]
            if len(args) == 2:
                obj = args[1]
            elif len(args) == 1:
                obj = None
                raise TypeError()


I'm not *in*-sane. Indeed, I am so far *out* of sane that you appear a
tiny blip on the distant coast of sanity.
        --- Bucky Katt, Get Fuzzy

More information about the Python-ideas mailing list