2

Я использую Python для извлечения некоторых данных из API отчетов Google Analytics Core Reporting. Мне удалось использовать функции для разных вызовов API (ниже приведены только два примера), но мне интересно, как я могу реорганизовать это, чтобы сделать его еще короче? Достаточно много дублирующего кода.Как я могу реорганизовать этот код более кратким?

def get_pvs(service, profile_id, start_date, end_date, type, data): 
    if type == "url": 
     return service.data().ga().get(
      ids = 'ga:' + profile_id, 
      start_date = start_date, 
      end_date = end_date, 
      metrics = 'ga:pageviews', 
      dimensions = 'ga:pagePath', 
      filters = 'ga:pageviews!=0', 
      sort = '-ga:pageviews', 
      max_results = '10000').execute() 
    elif type == "author": 
     return service.data().ga().get(
      ids = 'ga:' + profile_id, 
      start_date = start_date, 
      end_date = end_date, 
      metrics = 'ga:pageviews', 
      # Post Author 
      dimensions = 'ga:dimension2', 
      sort = '-ga:pageviews', 
      max_results = '100').execute() 

ответ

7

Создать словарь с аргументами типа конкретных, а затем применить, что с **kw:

def get_pvs(service, profile_id, start_date, end_date, type, data): 
    if type == 'url': 
     kwargs = { 
      'dimensions': 'ga:pagePath', 
      'filters': 'ga:pageviews!=0', 
      'maxresults': 100 
     } 
    elif type == 'author': 
     kwargs = { 
      'dimensions': 'ga:dimension2', 
      'max_results': '100' 
     } 
    return service.data().ga().get(
     ids = 'ga:' + profile_id, 
     start_date = start_date, 
     end_date = end_date, 
     metrics = 'ga:pageviews', 
     sort = '-ga:pageviews', 
     **kwargs).execute() 

Я оставил общие аргументы в месте. если type может иметь больше значений, то вам, вероятно, необходимо добавить else: return None.

+0

мы все равно должны положить эту часть внутри функции вправо? – kmario23

+1

Да, я добавил строку определения функции, чтобы уточнить это. –

0

Другой подход:

TYPE_SETTINGS = { 
     'url': { 
      'dimensions': 'ga:pagePath', 
      'filters': 'ga:pageviews!=0', 
      'max_results': '10000', 
      }, 
     'author': { 
      'dimensions': 'ga:dimension2', 
      'max_results': '100', 
      }, 
     } 

def get_pvs(service, profile_id, start_date, end_date, type, data): 
    if type in TYPE_SETTINGS: 
     return service.data().ga().get(
       ids = 'ga:' + profile_id, 
       start_date = start_date, 
       end_date = end_date, 
       metrics = 'ga:pageviews', 
       sort = '-ga:pageviews', 
       **TYPE_SETTINGS[type]).execute() 

TYPE_SETTINGS можно легко изменить в случае, если вам нужно определить более type, а не url и author в будущем.

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