2016-09-20 5 views
-1

Я видел предыдущие записи переполнения стека по этой теме, но я все еще не могу использовать эти две команды при попытке запустить мою функцию. Я закодировал демонстрационный пример простой скользящей средней, которую я хотел бы запустить через команду args, kwargs.python * args and ** kwargs

import numpy as np 
def moving_average(data,lookback=7,SMA=True): #MA function 
    if SMA==True: 
     weights=np.repeat(1.0,lookback)/lookback 
     smas=np.convolve(data,weights,'valid') 
     return smas 

Просто работает эта функция работает должным образом.

data=np.random.randn(100) #randomly 
moving_average(data,lookback=7,SMA=True) #this outputs the correct set of numbers 

Однако второй я пытаюсь добавить аргументы и kwargs, которые он разрушает.

def test1(*args,**kwargs): 
    return moving_average(data,lookback,SMA) 
test1(data,lookback=7,SMA=True) #this returns an error, saying my global lookback is not defined 

Что именно в логике * args ** kwargs я ошибаюсь? Ive попытался ввести как кортеж, так и словарь, но ни один из них не работает.

+5

Это не то, что для аргсов и кваргов. Если вы знаете имена аргументов, и вы просто хотите передать их, почему вы хотите использовать args/kwargs? –

ответ

1

Передайте *args и **kwargs вашей функции не аргумент (ы) и с именем аргумент (ы):

def test1(*args,**kwargs): 
    return moving_average(*args, **kwargs) 
1

В вашем примере с помощью * арг и ** kwargs:

def test1(*args,**kwargs): 
    return moving_average(data,lookback,SMA) 

data, lookback и SMA больше не указаны. Это может быть:

def test1(*args, **kwargs): 
    return moving_average(args[0], kwargs['lookback'], kwargs['SMA']) 

или

def test1(*args, **kwargs): 
    return moving_average(*args, **kwargs) 

Питон учебник имеет раздел, который может помочь: Unpacking Argument Lists

1
def test1(*args,**kwargs): 

Ваша функция теперь имеет две локальные переменные, args и kwargs. Один из них содержит позиционные аргументы, которые были переданы (как кортеж), а другой - аргументы ключевого слова (как словарь).

return moving_average(data,lookback,SMA) 

Здесь используются три имена переменных (данные, и SMA сроков давности), которые не существуют в вашей функции, так что вы получите сообщение об ошибке.

Вы могли бы сделать

return moving_average(args[0], kwargs['lookback'], kwargs['SMA']) 

Но тогда ваша функция test1 будет работать только с точным вызовом как test1(data,lookback=7,SMA=True). Вызов вроде test1(data, 7, True) не будет работать, так как тогда все параметры находятся в args, ни один в kwargs).

Ваша функция может также передать параметры точно так, как он их получил:

return moving_average(*args, **kwargs) 

Это работает, но нет никакой пользы для функции test1, он просто вызывает moving_average и возвращает результат, то почему бы не назвать moving_average непосредственно.

Смежные вопросы