【问题标题】:Python API JSON dictionary loopPython API JSON 字典循环
【发布时间】:2017-01-20 17:44:02
【问题描述】:

我的代码正在运行,但我知道必须有更有效的方法来完成它并更好地处理异常。

每个项目的 API 数据格式:

{  
   u'logEnd':False,
   u'logBegin':True,
   u'links':{  
      u'self': u'https://192.168.15.140/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/policy/accesspolicies/00505689-7E52-0ed3-0000-184683643989/accessrules/00505689-7E52-0ed3-0000-000268439552'
   },
   'sourceNetworks':'any-src',
   u'name':u'Peer-to-Peer Blocking',
   'sourceZones':'any-src-zn',
   u'enabled':True,
   'sourcePorts':'any-src-port',
   u'logFiles':False,
   u'vlanTags':{ },
   u'applications':{  
      u'applications':[  
         {  
            u'type':u'Application',
            u'id':u'61',
            u'name':u'BitTorrent'
         },
         {  
            u'type':u'Application',
            u'id':u'571',
            u'name':u'BitTorrent tracker'
         },
         {  
            u'type':u'Application',
            u'id':u'1214',
            u'name':u'ExtraTorrent'
         }
      ]
   },
   u'sendEventsToFMC':True,
   u'action':u'BLOCK',
   'destinationPorts':'any-dest-port',
   'destinationNetworks':'any-dest',
   u'variableSet':{  
      u'type':u'VariableSet',
      u'name':u'Default Set',
      u'id':u'76fa83ea-c972-11e2-8be8-8e45bb1343c0'
   },
   u'type':u'AccessRule',
   u'id':u'00505689-7E52-0ed3-0000-000268439552',
   'destinationZones':'any-dst-zn',
   u'metadata':{  
      u'category':u'--Undefined--',
      u'accessPolicy':{  
         u'type':u'AccessPolicy',
         u'name':u'PVmain1-ACPolicy-201610251131',
         u'id':u'00505689-7E52-0ed3-0000-184683643989'
      },
      u'section':u'Mandatory',
      u'domain':{  
         u'type':u'Domain',
         u'name':u'Global',
         u'id':u'e276abec-e0f2-11e3-8169-6d9ed49b625f'
      },
      u'timestamp':1482339574186
   }
}

工作 Python 脚本

for i in results:
    response = requests.request("GET", i, headers=headers, verify=False)
    raw=response.json()
    raw.setdefault('name', "noname_rule")
    raw.setdefault('action', "no_action")
    raw.setdefault('sourceNetworks', "any-src")
    raw.setdefault('destinationNetworks', "any-dest")
    raw.setdefault('sourcePorts', "any-src-port")
    raw.setdefault('destinationPorts', "any-dest-port")
    raw.setdefault('sourceZones', "any-src-zn")
    raw.setdefault('destinationZones', "any-dst-zn")
    interesting_keys = ('name', 'action','sourceZones', 'sourceNetworks', 'sourcePorts', 'destinationZones', 'destinationNetworks', 'destinationPorts' )
    subdict = {x: raw.get(x, "any") for x in interesting_keys if x in raw}

    if 'objects' in subdict['sourceZones']:
        srczn = subdict['sourceZones']['objects'][0]['name']
    elif 'literals' in subdict['sourceZones']:
        srczn = subdict['sourceZones']['literals'][0]['port']
    else :
        srczn = subdict['sourceZones']

    if 'objects' in subdict['sourceNetworks']:
        srcnet = subdict['sourceNetworks']['objects'][0]['name']
    elif 'literals' in subdict['sourceNetworks']:
        srcnet = subdict['sourceNetworks']['literals'][0]['value']
    else :
        srcnet = subdict['sourceNetworks']

    if 'objects' in subdict['sourcePorts']:
        srcprt = subdict['sourcePorts']['objects'][0]['name']
    elif 'literals' in subdict['sourcePorts']:
        srcprt = subdict['sourcePorts']['literals'][0]['port']
    else :
        srcprt = subdict['sourcePorts']

    if 'objects' in subdict['destinationZones']:
        dstzn = subdict['destinationZones']['objects'][0]['name']
    elif 'literals' in subdict['destinationZones']:
        dstzn = subdict['destinationZones']['literals'][0]['port']
    else :
        dstzn = subdict['destinationZones']

    if 'objects' in subdict['destinationNetworks']:
        dstnet = subdict['destinationNetworks']['objects'][0]['name']
    elif 'literals' in subdict['destinationNetworks']:
        dstnet = subdict['destinationNetworks']['literals'][0]['value']
    else :
        dstnet = subdict['destinationNetworks']

    if 'objects' in subdict['destinationPorts']:
        dstprt = subdict['destinationPorts']['objects'][0]['name']
    elif 'literals' in subdict['destinationPorts']:
        try:
            dstprt = subdict['destinationPorts']['literals'][0]['port']
        except KeyError:
            dstprt = "0"
    else :
        dstprt = subdict['destinationPorts']

    #print >> target, "%d,%s,%s,%s,%s,%s,%s,%s,%s" %(number, subdict['name'],subdict['action'],srczn,srcnet,srcprt,dstzn,dstnet,dstprt)
    #print "%d,%s,%s,%s,%s,%s,%s,%s,%s" %(number, subdict['name'],subdict['action'],srczn,srcnet,srcprt,dstzn,dstnet,dstprt)
    number+=1
    time.sleep(.5)
    print raw

您能否提出其他改进错误处理、性能、可读性等的方法?

【问题讨论】:

  • srczn = subdict['sourceZones'].get('objects', [{'name': None}])[0].get('name') 如果 'objects' 或 'name' 不存在,会给你值 None。
  • 花点时间阅读帮助中心的editing help。 Stack Overflow 上的格式设置与其他站点不同。您的帖子看起来越好,其他人就越容易阅读和理解它。

标签: python json list data-structures


【解决方案1】:

每当您看到重复的代码时,也许它可以被折叠成一个可以反复重用的函数?以这种方式重构代码可能不会使它更快,但它确实使它更易于阅读和理解。

def getSubdictData(subdict, fieldname, prop2):
    if 'objects' in subdict[fieldname]:
        return subdict[fieldname]['objects'][0]['name']
    elif 'literals' in subdict[fieldname]:
        if prop2 in subdict[fieldname]['literals'][0]
            return subdict[fieldname]['literals'][0][prop2]
        else:
            return "0"
    else :
        return subdict[fieldname]

for i in results:

    ...

    srczn = getSubdictData(subdict, 'sourceZones', 'port')
    srcnet = getSubdictData(subdict, 'sourceNetworks', 'value')
    srcprt = getSubdictData(subdict, 'sourcePorts', 'port')
    dstzn = getSubdictData(subdict, 'destinationZones', 'port')
    dstnet = getSubdictData(subdict, 'destinationNetworks', 'value')
    dstnet = getSubdictData(subdict, 'destinationPorts', 'port')

    ...

另外请注意,我删除了您用来检测字段是否存在的 try-catch。如果对象/代码为您提供了一种方法来确定该字段是否存在,我们应该使用它而不是依赖草率的 try catch 来执行我们的逻辑操作。像这样使用的 try catch 很难阅读并且性能很差。在这种情况下,这无关紧要,但最好不要像这样滥用 try catch。

【讨论】:

    猜你喜欢
    • 2011-07-06
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2014-02-14
    • 2018-12-04
    • 2014-06-02
    相关资源
    最近更新 更多