簡體   English   中英

如何重構檢查條件的臨時變量?

[英]How do I refactor out temporary variables that check a condition?

我目前正在遍歷數據,根據某些條件將數據放在列中。 請知道,我想完全避免使用全局變量。 這就是我正在使用的:

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放置for oid, value in response迭代中,並將其下的所有內容放在自己的函數中。 讓我大吃一驚的是,如何處理在query_alarm函數開頭聲明的column和oid_check變量。

將變量傳遞給函數,然后從函數返回它們。

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)

您可以將所需的變量傳遞到函數中。

您可以通過以下方式進行重構:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM