2016-02-09 80 views
2

我正在使用Python從Google Analytics核心報告API中提取一些數據。我設法使用函數對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而不是urlauthor情況進行修改。