Как исправить ошибку: 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 шт):
---> 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 инициализируется каким-то значением по-умолчанию, поэтому и получается, что вроде как передано два параметра вместо одного. Ну или там у них есть и позиционный какой-то параметр дефолтный. В общем суть в том, что нужно смотреть примеры кода и чётко им следовать. Если в примерах используется именованный параметр, то нужно делать в своём коде так же. Иначе потом довольно сложно бывает разобраться, в чём же ошибка.
На мой взгляд просто сама библиотека написана не очень хорошо. Нормально написанная библиотека всё-таки должна выводить понятную диагностику, если ей неправильно параметры передали.