【发布时间】:2021-04-27 20:34:01
【问题描述】:
以下函数在模块中用于查询网络设备,并从我使用的多个脚本中调用。它接受的参数是一个嵌套字典(设备 IP 和凭据等)和一个字符串(在设备上运行的命令):
def query_devices(hosts, cmd):
results = {
'success' : [],
'failed' : [],
}
for host in hosts:
device = hosts[host]
try:
swp = ConnectHandler(device_type=device['dev_type'],
ip=device['ip'],
username=device['user'],
password=device['pwd'],
secret=device['secret'])
swp.enable()
results[host] = swp.send_command(cmd)
results['success'].append(host)
swp.disconnect()
except (NetMikoTimeoutException, NetMikoAuthenticationException) as e:
results['failed'].append(host)
results[host] = e
return results
我想重用所有代码来更新设备,唯一的更改是:
-
该函数将采用相同的字典,但
cmd参数现在将是一个命令列表。 -
下面一行:
results[host] = swp.send_command(cmd)将被替换为:
results[host] = swp.send_config_set(cmd)
我显然可以复制进行这两个更改的函数,因为它在我重用的模块中,我只需要这样做一次,但我仍然基本上重复了很多相同的代码。
有没有更好的方法来做到这一点,因为我似乎经常在我的代码中遇到同样的问题。
【问题讨论】:
-
一个小问题 - 如果第二个参数只是一个列表,我会在末尾加上一个 s 来命名它,例如
cmds。这个约定对我来说非常有效,例如,你可以使用例如for cmd in cmds:
标签: python