我目前正在遍历数据,根据某些条件将数据放在列中。请知道,我想完全避免使用全局变量。这就是我正在使用的:
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
迭代及其下的所有内容放置在自己的函数中。令我着迷的是如何处理在query_alarm函数开头声明的column和oid_check变量。
答案 0 :(得分:3)
将变量传递给函数,然后从函数中返回它们。
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)
答案 1 :(得分:1)
您可以将所需的变量传递到函数中。
您可以通过以下方式进行重构:
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