[英]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.