参数可以传递给分配给变量的函数吗?

时间:2019-07-17 17:11:30

标签: python-3.x pysnmp

我正在使用PySNMP。在整个程序中,我需要执行各种SNMP事务,这些事务将相同的参数重用于不同的功能nextCmdgetCmdsetCmd。为了简化本文,我们假设我仅使用getCmd函数。我知道此功能可以在多个OID上运行,但这不是我当前的需要。在下面,我刚刚拉出了受管设备的systemName。

errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
           CommunityData(snmp_community, mpModel=1),
           UdpTransportTarget((target, 161)),
           ContextData(),
           ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0))
           ))

比方说,稍后在我的脚本中,我需要从同一设备轮询正常运行时间。不必像这样再次创建大多数代码:

errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
           CommunityData(snmp_community, mpModel=1),
           UdpTransportTarget((target, 161)),
           ContextData(),
          ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysUpTime', 0))
           ))

如何将getCmd函数与其他static参数一起存储,并仅将OID传递到变量/函数中,以使代码最小化?

2 个答案:

答案 0 :(得分:1)

最简单的方法是将其包装在另一个函数中:

def standard_call(oid):
    cmd = getCmd(SnmpEngine(), 
                 CommunityData(snmp_community, mpModel=1), 
                 UdpTransportTarget((target, 161)), 
                 ContextData(),
                 # Plug in the oid
                 ObjectType(ObjectIdentity('SNMPv2-MIB', oid, 0)))

    return next(cmd) 

standard_call('sysUpTime')
standard_call('sysName')

请注意如何将更改的部分设置为参数,并将其他所有内容设置为函数的主体。通常,这是解决“泛化问题”的方法。


这可以通过从传入的元组构造ObjectTypes来扩展:

def standard_call(*identity_args):
    # Construct the ObjectTypes we need
    obj_types = [ObjectType(ObjectIdentity(*arg_tup)) for arg_tup in identity_args]

    cmd = getCmd(SnmpEngine(),
                 CommunityData(snmp_community, mpModel=1),
                 UdpTransportTarget((target, 161)),
                 ContextData(),
                 # Spread the list of ObjectTypes as arguments to getCmd
                 *obj_types)

    return next(cmd)

standard_call(('SNMPv2-MIB', 'sysName', 0),
              ('SNMPv2-MIB', 'sysServices', 0),
              ('CISCO-FLASH-MIB', 'ciscoFlashCopyEntryStatus', 13))

答案 1 :(得分:1)

如何使用functools.partial绑定某些参数?

from functools import partial

from pysnmp.hlapi import *

getCmd = partial(
    getCmd, SnmpEngine(), CommunityData('public'),
    UdpTransportTarget(('demo.snmplabs.com', 161)),
    ContextData())

errorIndication, errorStatus, errorIndex, varBinds = next(

errorIndication, errorStatus, errorIndex, varBinds = next(
        getCmd(ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)),
               ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysUpTime', 0))))