Difference between default arguments and keyword arguments

Discussion in 'Python' started by Edward Diener, Apr 4, 2004.

  1. 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 ?
     
    Edward Diener, Apr 4, 2004
    #1
    1. Advertising

  2. Edward Diener

    DoubleM Guest

    Edward Diener wrote:
    > 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:
    >>> def fn(a,b):

    print 'a = ',a
    print 'b = ',b


    >>> fn(b=1,a=2)

    a = 2
    b = 1
    >>> fn(1,2)

    a = 1
    b = 2
    >>>

    Hope this helps,
    Mike
     
    DoubleM, Apr 4, 2004
    #2
    1. Advertising

  3. DoubleM wrote:
    > Edward Diener wrote:
    >> 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:
    > >>> def fn(a,b):

    > print 'a = ',a
    > print 'b = ',b
    >
    >
    > >>> fn(b=1,a=2)

    > a = 2
    > b = 1
    > >>> fn(1,2)

    > a = 1
    > b = 2


    Makes sense. Thanks ! The tutorial should explain it more clearly.
     
    Edward Diener, Apr 4, 2004
    #3
  4. Edward Diener

    Marco Herrn Guest

    On 2004-04-04, DoubleM <> wrote:
    > 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?:

    >>> __import__(name="eggs")

    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
    --
    Marco Herrn
    (GnuPG/PGP-signed and crypted mail preferred)
    Key ID: 0x94620736
     
    Marco Herrn, Apr 4, 2004
    #4
  5. Edward Diener

    Paul Prescod Guest

    Marco Herrn wrote:

    > On 2004-04-04, DoubleM <> wrote:
    >
    >>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?:
    >
    > >>> __import__(name="eggs")

    > 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
     
    Paul Prescod, Apr 4, 2004
    #5
  6. Edward Diener

    Paul Prescod Guest

    Marco Herrn wrote:

    > On 2004-04-04, DoubleM <> wrote:
    >
    >>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?:
    >
    > >>> __import__(name="eggs")

    > 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
     
    Paul Prescod, Apr 4, 2004
    #6
  7. Edward Diener wrote:
    > ... 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.

    --
    -Scott David Daniels
     
    Scott David Daniels, Apr 4, 2004
    #7
  8. Edward Diener

    John Roth Guest

    "Edward Diener" <> wrote in message
    news:UmTbc.9904$...
    > 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
     
    John Roth, Apr 4, 2004
    #8
  9. Edward Diener

    Roy Smith Guest

    "John Roth" <> wrote:
    > 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.
     
    Roy Smith, Apr 5, 2004
    #9
  10. Roy Smith wrote:
    > "John Roth" <> wrote:
    >> 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.


    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.
     
    Edward Diener, Apr 5, 2004
    #10
  11. Edward Diener

    John Roth Guest

    "Edward Diener" <> wrote in message
    news:yD1cc.12064$...
    > Roy Smith wrote:
    > > "John Roth" <> wrote:
    > >> 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 certainly wouldn't object to removing them; that's why I said "if".

    > > 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.


    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
    >
    >
     
    John Roth, Apr 5, 2004
    #11
  12. Edward Diener

    Aahz Guest

    In article <>,
    DoubleM <> wrote:
    >
    >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)
    --
    Aahz () <*> http://www.pythoncraft.com/

    "usenet imitates usenet" --Darkhawk
     
    Aahz, Apr 5, 2004
    #12
  13. Edward Diener

    Aahz Guest

    In article <>,
    Paul Prescod <> wrote:
    >
    >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'
    --
    Aahz () <*> http://www.pythoncraft.com/

    "usenet imitates usenet" --Darkhawk
     
    Aahz, Apr 5, 2004
    #13
  14. Edward Diener

    Aahz Guest

    In article <yD1cc.12064$>,
    Edward Diener <> wrote:
    >
    >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.
    --
    Aahz () <*> http://www.pythoncraft.com/

    "usenet imitates usenet" --Darkhawk
     
    Aahz, Apr 5, 2004
    #14
  15. >>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'



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

    - Josiah
     
    Josiah Carlson, Apr 6, 2004
    #15
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. jakk
    Replies:
    4
    Views:
    12,270
  2. Youssef Mesri
    Replies:
    15
    Views:
    580
    Earl Purple
    Jan 19, 2006
  3. Replies:
    6
    Views:
    459
    Peter Otten
    May 10, 2007
  4. Hamilton, William

    RE: keyword checker - keyword.kwlist

    Hamilton, William, May 10, 2007, in forum: Python
    Replies:
    4
    Views:
    359
  5. Peter Motzfeldt
    Replies:
    1
    Views:
    155
Loading...

Share This Page