2016-11-12 13 views
0

Мне нужно хранить оба аргумента & kwargs в кортеже для вызова позже, так что в этом случае будет соответствующее значение в кортеже * args или args? Другими словами, это будет работать:Когда я использую ** kwargs vs kwargs (* args vs args)?

def __init__(self, *args, **kwargs): 
    self._buildCalls = [ 
     (self.__init__, args, kwargs) 
    ] 
    self._building = False 

def __getattr__(self, attr): 
    if self.building(): 
     if hasmethod(self, attr): 
      return lambda *args, **kwargs: self.argSaver(attr, *args, **kwargs) 
    else: 
     return super().__getattr__(attr) 

def argSaver(self, method, *args, **kwargs): 
    self._buildCalls.append((method, args, kwargs)) 
    return method(*args, **kwargs) 
+1

Вы попробовали - это сработало? – AChampion

+0

Вы можете найти примеры в ответах [здесь] (http://stackoverflow.com/q/40498298/4014959). –

+0

Я не уверен, что вы действительно понимаете, что делают '*' и '**'. Но да, вам нужно будет хранить 'args' и' kwargs' в кортеже; '* args' и' ** kwargs' - это не фактические вещи, которые вы могли бы сохранить (а скорее просто выполнение другого оператора на 'args' и' kwargs' соответственно). – poke

ответ

4

Вот пример функции подписи:

def foo(a, b, *args, **kwargs): 

Здесь *argsпредставляет аргументы после a и b, которые не требуются, передаются как «не (foo(1, 2, 3, 4, 5)), и функция получает их как кортеж под названием args: args == (3, 4, 5).

**kwargs представляет аргументы, которые не требуется, передается по имени (foo(1, 2, foo=3, bar=4)) и функция получает их в качестве словаря под названием kwargs: kwargs == {'foo': 3, 'bar': 4}.

Когда вы используете определение внешней функции звезды, оно пытается извлечь данные из кортежа или словаря, например. *(1, 2, 3) дает вам три отдельных значений, которые были извлечены из кортежа, *{'foo': 5} будет извлекать все ключи словаря, но foo(**{'foo': 5, 'bar': 6}) будет пытаться передать два аргумента называемых foo и bar со значениями 5 и 6 соответственно функциями foo.