Question

when I try the following, I get error in the function definition itself.

>>> def mymap(*seq,pad=None):
  File "<stdin>", line 1
    def mymap(*seq,pad=None):
   SyntaxError: invalid syntax 

I am trying to give default value for the parameter pad.

but then, I tried this and it works (for wrong reason):

>>> def mymap(pad=None,*seq):
...    print seq
>>> mymap([1,2,3],[4,5,6])
([4, 5, 6],)
[(4,)]
>>> 

It is not printing the tuple of seq which should be ([1,2,3],[4,5,6]).

Was it helpful?

Solution

What you really want here is for pad to be a keyword-only parameter.

One of the major changes in 3.0 was designing function parameters and arguments to, among other things, provide exactly the feature you're looking for. In fact, your first version works exactly as you'd hope it to. But if you want to stick with 2.x, you don't get any of the new features in 3.x.

So, you have no choice but to fake it:

def mymap(*seq, **kwargs):
    pad = kwargs.pop('pad', None)
    if kwargs:
        raise TypeError("mymap() got an unexpected keyword argument '{}'".format(kwargs.keys()[0]))
    print seq

This does very nearly the exact same thing as the equivalent Python 3 code. Of course it's more complicated, a lot less clear, slower, and opaque to introspection… all of which is exactly why keyword-only parameters were added in 3.0. But if you need it, and you can't use Python 3.x, this is what you have to do. (Just be glad you're not trying to write C-API functions.)


You seem to be mixing up two entirely independent things: a parameter having a default value (which I assume is what you mean by the term "default parameter", which doesn't really mean anything), and being keyword-only.

You've already got a parameter with a default value, in your second version. You can see that easily: call mymap(), and it succeeds, with pad getting its default value of None (and seq being empty).

But you want it to also be a keyword-only parameter, so it doesn't steal the first positional argument. And that's the part you can't do in 2.x.


If you want to know more, PEP 3012 explains the keyword-only feature, and Arguments and parameters attempts to gather all the relevant documentation links, and summarize how everything fits together.

OTHER TIPS

It looks like you are inputting the args [1,2,3] and [4,5,6] as two seperate arguments. They are not in a tuple.

mymap([1,2,3], [4,5,6]) << in this example, from your code, the [1,2,3] is being passed in for pad and the [4,5,6] is being passed in for seq. That's why printing seq results in [4,5,6]

Also, named arguments like pad, must come before *args or **kwargs.

For example:

mymap(None, [1,2,3],[4,5,6]) #passing None for pad

prints:

([1,2,3], [4,5,6])
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top