Как передать произвольное количество аргументов функции в Python (библиотека Facepy)?

Я пытаюсь передать функции произвольное количество аргументов, но постоянно получаю ошибки и не совсем понимаю, где я ошибаюсь. Это первый раз, когда я пытаюсь использовать **kwargs.

В частности, я пытаюсь использовать библиотеку Facepy для получения данных из Graph API Facebook. Согласно документации (https://facepy.readthedocs.org/en/latest/usage/graph-api.html), метод get должен принимать необязательные параметры, такие как «с тех пор», «до» и т. д. Поскольку я хочу передать только некоторые из этих параметров в любом заданном запросе, это кажется идеальное время для использования **kwargs.

Сначала я создаю функцию, обертывающую библиотеку Facepy:

def graph_retriever(object_id, metric_url, **kwargs): 
    #optional args that I want to pass include since, until, and summary
    graph = facepy.GraphAPI(access_token)
    retries = 3 # An integer describing how many times the request may be retried.
    object_data = graph.get('%s/%s' % (object_id, metric_url), False, retries, **kwargs)
    return object_data

Вот два примера, где я вызываю функцию с разными аргументами:

for since, until in day_segmenter(start, end): # loop through the date range
    raw_post_data = graph_retriever(str(page), 'posts', {'since': since, 'until': until})

post_dict['comment_count'] = graph_retriever(post_id, 'comments', {'summary':1})['summary']['total_count']

Однако, когда я пытаюсь запустить это, я получаю следующую ошибку:

Traceback (most recent call last): raw_post_data = graph_retriever(str(page), 'posts', {'since': since, 'until': until}) TypeError: graph_retriever() takes exactly 2 arguments (3 given)

Что я делаю не так?


person Jeff Widman    schedule 06.11.2013    source источник


Ответы (1)


Вы можете передать словарь как kwargs, распаковав его с помощью **

graph_retriever(str(page), 'posts', **{'since': since, 'until': until})

РЕДАКТИРОВАТЬ 1:

kwargs фактически должны быть переданы как ключевое слово args, т.е. функция должна вызываться как

graph_retriever(str(page), 'posts', since= since, until= until)

см. здесь документы Python Kwargs

person Pruthvikar    schedule 06.11.2013
comment
вызов в этом формате сработал для меня: graph_retriever(str(page), 'posts', **{'since': since, 'until': until}) ‹ - часть, которую я пропустил, была ** при вызове функции. Боюсь, я не понимаю вашего редактирования. - person Jeff Widman; 07.11.2013