代码之家  ›  专栏  ›  技术社区  ›  Bonteq

如何重构检查条件的临时变量?

  •  0
  • Bonteq  · 技术社区  · 5 年前

    我目前正在迭代数据,将数据放在基于特定条件的列中。请注意,我希望完全避免全局变量。这就是我的工作:

    def query_alarm(device):
        """
        Requests data from the device,
        saving each oid and value from the device's
        specified alarm table into a Breadcrumb object.
        """
        column = []
        oid_check = ''
        for (errorIndication, errorStatus, errorIndex, response) in nextCmd(
            SnmpEngine(),
            CommunityData("public"),
            UdpTransportTarget((device.ip_address, device.snmp_port_number)),
            ContextData(),
            ObjectType(ObjectIdentity(manufacturer_alarm_table_oid(device))),
            lexicographicMode=False,
        ):
            if nextcmd_error(errorIndex, errorIndication, errorStatus):
                handle_nextcmd_error()
                continue
    
    
            for oid, value in response:
                column_oid = split_column_oid(oid)
                if column_oid != oid_check:
                    if len(column) > 0:
                        device.alarm_count = len(column)
                        device.date_checked = timezone.now()
                        device.save()
                    column = []
                    oid_check = column_oid
                column.append({str(oid): str(value)})
                try:
                    Breadcrumb(oid=oid, value=value).save()
                except ValueError as e:
                    print(e)
                    Breadcrumb(oid=oid, value='*** FIX DateAndTime Value ***').save()
    
    
        return True
    

    当我重构这个时,我想将 for oid, value in response 迭代和它自身函数中的所有内容。欺骗我的是如何处理在查询报警函数开始时声明的列和OID检查变量。

    2 回复  |  直到 5 年前
        1
  •  3
  •   Barmar 0___________    5 年前

    将变量传递给函数并从函数返回。

    def func(oid, value, oid_check, column):
        column_oid = split_column_oid(oid)
        if column_oid != oid_check:
            if len(column) > 0:
                device.alarm_count = len(column)
                device.date_checked = timezone.now()
                device.save()
            column = []
            oid_check = column_oid
        column.append({str(oid): str(value)})
        try:
            Breadcrumb(oid=oid, value=value).save()
        except ValueError as e:
            print(e)
            Breadcrumb(oid=oid, value='*** FIX DateAndTime Value ***').save()
    
        return oid_check, column
    

    然后在一个循环中调用它,比如:

    for oid, value in response:
        oid_check, column = func(oid, value, oid_check, column)
    
        2
  •  1
  •   Niharika Bitra    5 年前

    您可以将需要的变量传入函数。

    您可以这样重构它:

    def query_alarm(device):
        """
        Requests data from the device,
        saving each oid and value from the device's
        specified alarm table into a Breadcrumb object.
        """
        column = []
        oid_check = ''
        for (errorIndication, errorStatus, errorIndex, response) in nextCmd(
            SnmpEngine(),
            CommunityData("public"),
            UdpTransportTarget((device.ip_address, device.snmp_port_number)),
            ContextData(),
            ObjectType(ObjectIdentity(manufacturer_alarm_table_oid(device))),
            lexicographicMode=False,
        ):
            if nextcmd_error(errorIndex, errorIndication, errorStatus):
                handle_nextcmd_error()
                continue   
    
            column, oid_check = func1(response, column, oid_check)
    
        return True
    
    def func1( response, column, oid_check ):
        for oid, value in response:
            column_oid = split_column_oid(oid)
            if column_oid != oid_check:
                if len(column) > 0:
                    device.alarm_count = len(column)
                    device.date_checked = timezone.now()
                    device.save()
                column = []
                oid_check = column_oid
            column.append({str(oid): str(value)})
            try:
                Breadcrumb(oid=oid, value=value).save()
            except ValueError as e:
                print(e)
                Breadcrumb(oid=oid, value='*** FIX DateAndTime Value ***').save()
        return column, oid_check