2017-02-02 4 views
1

Вот фрагмент из моей библиотеки для обработки API. Мне интересен альтернативный (потенциально более чистый) или более питонический способ написать мою функцию filter_entries.Чистый способ фильтрации по списку словарей

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, чтобы все выровнялось, чтобы было легче читать (например, align '=', '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']) 
Смежные вопросы