Question: I have this code:

```
class Test(object):
   def f1(self,*args,**kwargs):
       print args
       print kwargs
       self.f2(*args,**kwargs)

   def f2(self,*args,**kwargs):
       print "calling f2"
       print "args= ",args
       print "kwargs= ",kwargs

t = Test()
args = [1,2,3]
kwargs= {'a':1,'b':2}
t.f1(args,kwargs)
#second call
t.f1(kwargs)

```

and it prints

```
([1, 2, 3], {'a': 1, 'b': 2})
{}
calling f2
args=  ([1, 2, 3], {'a': 1, 'b': 2})
kwargs=  {}
({'a': 1, 'b': 2},)
{}
calling f2
args=  ({'a': 1, 'b': 2},)
kwargs=  {}

```

I want to make `*args` in the construct optional. That is if I pass `dict`, it is taken as `args` in the second call above. I do not want that.
 I basically want this construct:
`f1(*args,**kwargs)`

-- if `*args` is present, then process `*args` 
 if it is not present, then process `**kwargs`, but do not take the dict passed to be `*args`
 That is because I will not be passing `dict` to `*args` in any case.

Answer: 
```
t = Test()
args = [1,2,3]
kwargs= {'a':1,'b':2}
t.f1(args,kwargs)
t.f1(kwargs)

```

Needs to be

```
t = Test()
args = [1,2,3]
kwargs= {'a':1,'b':2}
t.f1(*args,**kwargs)
t.f1(**kwargs)

```

Otherwise it passes `args` and `kwargs` as the first and second argument (which both get collapsed to `*args` inside the function)

You had argument *unpacking* correct, but hadn't added the proper syntax for argument *packing*.
[You're doing it wrong.](http://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists)

```
t.f1(*args, **kwargs)
t.f1(**kwargs)

```