Alan Gauld via Tutor wrote: > On 01/03/17 08:18, Pabitra Pati wrote: > >> def total(name, *args): >> if args: >> print("%s has total money of Rs %d/- " %(name, sum(args))) >> else: >> print("%s's piggy bank has no money" %name) >> >> I can call this method passing the extra arguments inside *(). >> *I know the correct way of passing the arguments.* But, I am passing >> value for 'name' in form of param=value, *intentionally*, > > So you expected to get an error? > So what exactly are you asking about? Which error did > you think you would get? > > Remember that you are not allowed to pass positional > arguments after you pass a named argument. So python > sees your call as something like: > > total(name = "John", 1, 2, 10 )
I think total(name="John", *(1, 2, 3)) is rather resolved as total(1, 2, 3, name="John") so that the first argument is both 1 and "John". I conclude that from >>> def total(name, other): ... print("name:", name, "other:", other) ... >>> total(other=42, "John") File "<stdin>", line 1 SyntaxError: non-keyword arg after keyword arg >>> total(other=42, *["John"]) ('name:', 'John', 'other:', 42) But this is tricky, and I usually resort to trial-and-error when I run into such problems. > ie as 4 arguments being passed to name and > *args and can't figure out where name stops and > *args begins. It could be any of: > > total( name=("John", 1), 2, 10 ) or > total( name=("John", 1, 2), 10 ) or > total( name=("John", 1, 2, 10) ) # empty *args is allowed. > > The whole point of *args is that they represent unnamed > arguments, you may not put named arguments in front of > them, it's illegal. > >> However, I am unable to understand the below error message :- >> >> >>> total(name="John", *(1, 2, 10) ) >> Traceback (most recent call last): >> File "<stdin>", line 1, in <module> >> TypeError: total() got multiple values for keyword argument 'name' >> >> How Python is evaluating the above call, that it's getting multiple >> values >> for the parameter 'name'? How the call is being interpreted internally? > > If you want the technical details of how the interpreter > is working there are others better qualified to explain, > but since what you are trying to do is not valid Python > I'm not sure there is much point in analyzing it. > _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor