Difference between default arguments and keyword arguments

E

Edward Diener

In the tutorial on functions there are sections on default arguments and
keyword arguments, yet I don't see the syntactic difference between them.
For default arguments the tutorial shows:

def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):

while for keyword arguments the tutorial shows:

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):

The syntax 'keyword = value' is used for both as far as I can see. How does
one distinguish between them or are they both part of the same combined
concept, which is: if one calls the function with less than the required
number of arguments but does specify keyword values, those values are used,
else the defaults are supplied. Or is there really a syntactic difference
between default arguments and keyword arguments which I have missed above ?
 
D

DoubleM

Edward said:
In the tutorial on functions there are sections on default arguments and
keyword arguments, yet I don't see the syntactic difference between them.
For default arguments the tutorial shows:

def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):

while for keyword arguments the tutorial shows:

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):

The syntax 'keyword = value' is used for both as far as I can see. How does
one distinguish between them or are they both part of the same combined
concept, which is: if one calls the function with less than the required
number of arguments but does specify keyword values, those values are used,
else the defaults are supplied. Or is there really a syntactic difference
between default arguments and keyword arguments which I have missed above ?
All arguments are keyword arguments. They may or may not have a default
value. In your example, voltage is a keyword argument, but it has no
default.

Consider the following: print 'a = ',a
print 'b = ',b

a = 2
b = 1a = 1
b = 2Hope this helps,
Mike
 
E

Edward Diener

DoubleM said:
All arguments are keyword arguments. They may or may not have a
default value. In your example, voltage is a keyword argument, but
it has no default.

Consider the following:
print 'a = ',a
print 'b = ',b


a = 2
b = 1
a = 1
b = 2

Makes sense. Thanks ! The tutorial should explain it more clearly.
 
M

Marco Herrn

All arguments are keyword arguments. They may or may not have a default
value. In your example, voltage is a keyword argument, but it has no
default.

But what does this mean?:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: __import__() takes no keyword arguments


Is it because the other arguments are optional? The function is defined
as follows:

__import__( name[, globals[, locals[, fromlist]]])

Marco
 
P

Paul Prescod

Marco said:
But what does this mean?:

Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: __import__() takes no keyword arguments

Functions implemented in C do not always have the property that every
argument is a keyword argument. Functions implemented in Python do have
that property. It's an implementation quirk.

Paul Prescod
 
P

Paul Prescod

Marco said:
But what does this mean?:

Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: __import__() takes no keyword arguments

Functions implemented in C do not always have the property that every
argument is a keyword argument. Functions implemented in Python do have
that property. It's an implementation quirk.

Paul Prescod
 
S

Scott David Daniels

Edward said:
... Makes sense. Thanks ! The tutorial should explain it more clearly.

Right now you know what is confusing about the tutorial. _Please_ take
the time to propose a fix to the tutorial -- you have an "impertise" (as
opposed to "expertise") that tells you confusing interpretations of the
text of the tutorial. Once you just know" this stuff, you won't be able
to know what is confusing. So the time you spend, _right_now_ is the
most valuable contribution you can make to Python for a while. Help
us improve our documents.
 
J

John Roth

Edward Diener said:
In the tutorial on functions there are sections on default arguments and
keyword arguments, yet I don't see the syntactic difference between them.
For default arguments the tutorial shows:

def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):

while for keyword arguments the tutorial shows:

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):

The syntax 'keyword = value' is used for both as far as I can see. How does
one distinguish between them or are they both part of the same combined
concept, which is: if one calls the function with less than the required
number of arguments but does specify keyword values, those values are used,
else the defaults are supplied. Or is there really a syntactic difference
between default arguments and keyword arguments which I have missed above
?

The difference (from the tutorial) is that default arguements apply to
the function *definition*, while keyword arguements apply to the
function *call*. It's a subtle difference that does seem to be quite
easy to miss.

In going through the tutorial I also noticed that it explained
the * notation, but not the ** notation. I think this also needs
to be repaired - if one is in the tutorial, both should be.

John Roth
 
R

Roy Smith

John Roth said:
In going through the tutorial I also noticed that it explained
the * notation, but not the ** notation. I think this also needs
to be repaired - if one is in the tutorial, both should be.

I suspect this will be an unpopular opinion, but I don't think either
belong in the tutorial.

I think the function of a tutorial is to introduce somebody to the main
features of the language, not cover every nook and cranny of the syntax.
The * and ** syntaxes (synti?), while certainly useful, are also
somewhat advanced topics. I think their appearance in an introductory
document is misplaced.
 
E

Edward Diener

Roy said:
I suspect this will be an unpopular opinion, but I don't think either
belong in the tutorial.

I think the function of a tutorial is to introduce somebody to the
main features of the language, not cover every nook and cranny of the
syntax. The * and ** syntaxes (synti?), while certainly useful, are
also somewhat advanced topics. I think their appearance in an
introductory document is misplaced.

Along the same lines, I would like to add to that the explanation for
classes in the tutorial is very poor since it assumes a much higher
understanding of Python than a tutorial should about the language. A much
simpler and more direct explanation regarding classes in Python would be
much better. While I mostly got it because I have programmed extensively in
other OOP languages, I would expect your average Python beginner to be
completely lost by much of the high-level explanation in that chapter.
Whoever wrote it was much more interested in explaining the theory of
classes in Python, to beginners no less !, than they were toward explaining
what classes are in Python and how to use them. And why iterators and
generators are included in that chapter are beyond me. Also the tutorial
mentions some usages of classes, in previous sections, before the
explanation of classes occur, which I feel is definitely a mistake.
 
J

John Roth

I certainly wouldn't object to removing them; that's why I said "if".
Along the same lines, I would like to add to that the explanation for
classes in the tutorial is very poor since it assumes a much higher
understanding of Python than a tutorial should about the language. A much
simpler and more direct explanation regarding classes in Python would be
much better. While I mostly got it because I have programmed extensively in
other OOP languages, I would expect your average Python beginner to be
completely lost by much of the high-level explanation in that chapter.
Whoever wrote it was much more interested in explaining the theory of
classes in Python, to beginners no less !, than they were toward explaining
what classes are in Python and how to use them. And why iterators and
generators are included in that chapter are beyond me. Also the tutorial
mentions some usages of classes, in previous sections, before the
explanation of classes occur, which I feel is definitely a mistake.

One of the things going on here is that the tutorial has grown over
the releases; it's not entirely clear what level of expertise is expected
for a reader. As you say, there are topics that are fairly advanced.
On the other hand, since the libraries are shipped in source, and since
they do use all of those features, I think they should be mentioned in
some kind of tuorial.

John Roth
 
A

Aahz

All arguments are keyword arguments. They may or may not have a default
value.

Not quite true:

def foo(a, b):
pass

args = 1, 2
foo(*args)

def bar(*args):
pass

bar(1, 2)
 
A

Aahz

Functions implemented in C do not always have the property that every
argument is a keyword argument. Functions implemented in Python do have
that property. It's an implementation quirk.

Really?

def foo(*args):
pass

foo(x=1)

Traceback (most recent call last):
File "x.py", line 4, in ?
foo(x=1)
TypeError: foo() got an unexpected keyword argument 'x'
 
A

Aahz

Along the same lines, I would like to add to that the explanation for
classes in the tutorial is very poor since it assumes a much higher
understanding of Python than a tutorial should about the language. A
much simpler and more direct explanation regarding classes in Python
would be much better. While I mostly got it because I have programmed
extensively in other OOP languages, I would expect your average Python
beginner to be completely lost by much of the high-level explanation in
that chapter. Whoever wrote it was much more interested in explaining
the theory of classes in Python, to beginners no less !, than they were
toward explaining what classes are in Python and how to use them. And
why iterators and generators are included in that chapter are beyond
me. Also the tutorial mentions some usages of classes, in previous
sections, before the explanation of classes occur, which I feel is
definitely a mistake.

While I agree that the tutorial could stand improvement, it *is*
targetted more at experienced programmers.
 
J

Josiah Carlson

Functions implemented in C do not always have the property that every
Really?

def foo(*args):
pass

foo(x=1)

Traceback (most recent call last):
File "x.py", line 4, in ?
foo(x=1)
TypeError: foo() got an unexpected keyword argument 'x'


Really. It just so happens that foo doesn't take any keyword arguments,
nor does it have an argument named 'x'.

- Josiah
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,181
Messages
2,570,970
Members
47,536
Latest member
VeldaYoung

Latest Threads

Top