# Argument Precedence (possible bug?)

Steven D'Aprano steve at REMOVETHIScyber.com.au
Sun Mar 5 14:47:12 CET 2006

```On Sun, 05 Mar 2006 04:45:05 -0800, vbgunz wrote:

> PS. I could be far off with this codes purpose; to try and create an
> example that will house all the different possible parameters
> (positional, keyword, * and **) in one single def statement.

This is usually a bad idea, not because Python can't cope with it, but
because it is usually better to learn new things in small pieces, not one
giant enormous piece.

Try creating a number of small functions that do different things:

def f(a, b, c):
print "a =", a, "b =", b, "c =", c

def g(a=0, b=0, c=0):
print "a =", a, "b =", b, "c =", c

Now call them different ways, and see what happens:

f()
f(1)
f(1,2)
f(1,2,3)
f(b=2)

Can you see a pattern?

g()
g(1)
g(1,2)
g(1,2,3)
g(b=2)

Then move on to argument collectors:

def h(a, b, c=0, *d, **e):
print "a =", a, "b =", b, "c =", c
print "d =", d, "e =", e

Also, remember that "positional arguments" and "keyword arguments" aren't
defined differently, they are given when you call the function. For
example, suppose you have this:

def function(x, y):
print x + y

Now you call it with positional arguments: function(3, 7)
Now you call it with keyword arguments: function(x=3, y=7)
Now you call it with both: function(3, y=7)

All from the same definition. An argument is positional or keyword
according to how it is given, not how it is defined.

--
Steven.

```