Вопрос

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.

Это было полезно?

Решение

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.

t.f1(*args, **kwargs)
t.f1(**kwargs)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top