Как исправить ошибку: BuildPath() takes 1 positional argument but 2 were given

Пишу код:

def get_report(analytics, body): # Use the Analytics Service Object to query the Analytics Reporting API V4.
    return analytics.reports().batchGet(body).execute()

def parse_data(response):
    listt = []
    for report in response.get('reports', []):
        columnHeader = report.get('columnHeader', {})
        dimensionHeaders = columnHeader.get('dimensions', [])
        metricHeaders = columnHeader.get('metricHeader', {}).get('metricHeaderEntries', [])
        rows = report.get('data', {}).get('rows', [])
        for row in rows:
            d = {}
            dimension = row.get('dimensions', [])
            daterangevalues = row.get('metrics', [])
        
            for header, dimension in zip(dimensionHeaders, dimension):
                d[header] = dimension
        
            for i, values in enumerate(daterangevalues):
                for metric, value in zip(metricHeaders, values.get('values')):
                    if ',' in value or '.' in value:
                        d[metric.get('name')] = float(value)
                    else:
                        d[metric.get('name')] = int(value)
            listt.append(d)
        gadf = pd.DataFrame(listt)
    return gadf

analytics = initialize_analyticsreporting()

Он ошибки не выдает

Затем запрос формирую:

for d in days:
    dt = d.strftime('%Y-%m-%d')
    b = {'reportRequests': [{'viewId': VIEW_ID, 
            'metrics': [{'expression': 'ga:newUsers'}], 
            'dateRanges':[{"startDate":dt, "endDate":dt}]}]}
    r = get_report(analytics,b)
    df = parse_data(r)
    df["Дата"] = dt
    print(df)

И вот тут появляется get_report() takes 1 positional argument but 2 were given:

TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_10508\206877172.py in <module>
      4             'metrics': [{'expression': 'ga:newUsers'}],
      5             'dateRanges':[{"startDate":dt, "endDate":dt}]}]}
----> 6     r = get_report(analytics, b)
      7     df = parse_data(r)
      8     df["Дата"] = dt

~\AppData\Local\Temp\ipykernel_10508\2569388479.py in get_report(analytics, body)
     11     return analytics
     12 def get_report(analytics, body): # Use the Analytics Service Object to query the Analytics Reporting API V4.
---> 13     return analytics.reports().batchGet(body).execute()
     14 
     15 def parse_data(response):

TypeError: method() takes 1 positional argument but 2 were given

Ответы (1 шт):

Автор решения: CrazyElf
---> 13     return analytics.reports().batchGet(body).execute()
     14 
     15 def parse_data(response):

TypeError: method() takes 1 positional argument but 2 were given

Питон - несколько странный язык. В данном случае это лечится тем, что нужно указать имя именованного параметра при вызове метода batchGet:

return analytics.reports().batchGet(body=body).execute()
                                    ^^^^^

Я это подсмотрел в примерах кода, аналогичного вашему. Видимо, библиотека написана так, что требует указания этого параметра только в именованном виде. Если передать просто позиционный параметр, то видимо он попадает в какой-то другой, позиционный параметр, а параметр body инициализируется каким-то значением по-умолчанию, поэтому и получается, что вроде как передано два параметра вместо одного. Ну или там у них есть и позиционный какой-то параметр дефолтный. В общем суть в том, что нужно смотреть примеры кода и чётко им следовать. Если в примерах используется именованный параметр, то нужно делать в своём коде так же. Иначе потом довольно сложно бывает разобраться, в чём же ошибка.

На мой взгляд просто сама библиотека написана не очень хорошо. Нормально написанная библиотека всё-таки должна выводить понятную диагностику, если ей неправильно параметры передали.

→ Ссылка