2017-02-02 3 views
1

これは、APIを扱うための私のライブラリから抜粋したものです。私はfilter_entries関数を書くための代替(潜在的にクリーナー)、またはもっとpythonicな方法について興味があります。ディクショナリのリストをフィルタリングするためのきれいな方法

def json_from_url(url): 

    from urllib2 import urlopen 
    import json 

    response = urlopen(url) 
    data = response.read().decode("utf-8") 
    return json.loads(data) 

class netdb: 
    """ Class construct for portal""" 

    def __init__(self, url): 
     self.json = json_from_url(url) 

    def filter_entries(self, names=[], sites=[], regions=[], vendors=[], models=[], live=True, output='json'): 
     """ Function to pull devices down from portalAPI based off filters """ 

     netdbDevices = dict(self.json) 

     if names: netdbDevices['objects'] = [device for device in netdbDevices['objects'] if device['name'] in names] 
     if sites: netdbDevices['objects'] = [device for device in netdbDevices['objects'] if device['site']['dns_prefix'] in sites] 
     if models: netdbDevices['objects'] = [device for device in netdbDevices['objects'] if device['name'].split("-")[0] in models] 
     if vendors: netdbDevices['objects'] = [device for device in netdbDevices['objects'] if device['vendor']['name'] in vendors] 
     if regions: netdbDevices['objects'] = [device for device in netdbDevices['objects'] if get_region_name(device['site']['dns_prefix']) in regions] 
     if live == True: netdbDevices['objects'] = [device for device in netdbDevices['objects'] if device['status'] == 1] 

     if output == 'json': 
      return netdbDevices 
     if output == 'hostname': 
      hostnames = [] 
     for each in netdbDevices['objects']: 
      hostnames.append('%s.%s' % (each['name'], each['site']['dns_prefix'])) 
     return hostnames 

助けてください。

+0

私は大丈夫です。私はすべてのifステートメントを個別に整形して、すべてを整列させて読みやすく(例: '='、 '' if''' in)します。それ以外は、私はあなたを本当に助けることができません。 – ChickenFeet

答えて

0

コードは私にはうまく見えます(最後の3行はインデントしなければならないことを除いて)、それが機能すると言いますから、これは実際にcodereviewスタックの質問です。私がそれを変更することを検討する唯一の方法は、リスト内包表記の中で非常に少量の繰り返しロジックを削除することですが、実際にはこれは趣味の問題です。私の個人的な味が機能するので、私は書くかもしれません:

def FilterDevices(netdbDevices, values, getter): 
    if values: 
     netdbDevices['objects'] = [device for device in netdbDevices['objects'] if getter(device) in values] 

FilterDevices(netdbDevices, names, lambda device: device['name']) 
FilterDevices(netdbDevices, sites, lambda device: device['site']['dns_prefix']) 
FilterDevices(netdbDevices, models, lambda device: device['name'].split("-")[0]) 
FilterDevices(netdbDevices, vendors, lambda device: device['vendor']['name']) 
FilterDevices(netdbDevices, regions, lambda device: get_region_name(device['site']['dns_prefix'])) 
FilterDevices(netdbDevices, [1] if live else [], lambda device: device['status']) 
関連する問題