【问题标题】:How do I reuse the code from this function cleanly?如何干净地重用此函数中的代码?
【发布时间】: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

我想重用所有代码来更新设备,唯一的更改是:

  1. 该函数将采用相同的字典,但 cmd 参数现在将是一个命令列表。

  2. 下面一行:

    results[host] = swp.send_command(cmd)
    

    将被替换为:

    results[host] = swp.send_config_set(cmd)
    

我显然可以复制进行这两个更改的函数,因为它在我重用的模块中,我只需要这样做一次,但我仍然基本上重复了很多相同的代码。

有没有更好的方法来做到这一点,因为我似乎经常在我的代码中遇到同样的问题。

【问题讨论】:

  • 一个小问题 - 如果第二个参数只是一个列表,我会在末尾加上一个 s 来命名它,例如cmds。这个约定对我来说非常有效,例如,你可以使用例如for cmd in cmds:

标签: python


【解决方案1】:

您可以在更改的行上添加一个检查:

...
if isinstance(cmd, str):
    results[host] = swp.send_command(cmd)
else:
    results[host] = swp.send_config_set(cmd)
...

函数的其余部分可以保持不变,现在您可以简单地使用字符串或字符串列表调用它...

【讨论】:

    【解决方案2】:

    您可以使用解包运算符始终使 cmds 成为可迭代的(实际上是元组),即使它是单个值。这样您就可以随时致电send_config_set。这是一个超级简化的例子来说明这个概念。

    def query_devices(hosts, *cmds):
        for one_cmd in cmds:
            print(one_cmd)
            
    print('query_devices("hosts", "cmd_1")')
    query_devices("hosts", "cmd_1")
    
    print('\nquery_devices("hosts", "cmd_1", "cmd_2", "cmd_3")')
    query_devices("hosts", "cmd_1", "cmd_2", "cmd_3")
    
    print('\nquery_devices("hosts", *["cmd_1", "cmd_2", "cmd_3"])')
    query_devices("hosts", *["cmd_1", "cmd_2", "cmd_3"])
    

    输出:

    query_devices("hosts", "cmd_1")
    cmd_1
    
    query_devices("hosts", "cmd_1", "cmd_2", "cmd_3")
    cmd_1
    cmd_2
    cmd_3
    
    query_devices("hosts", *["cmd_1", "cmd_2", "cmd_3"])
    cmd_1
    cmd_2
    cmd_3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-20
      • 2017-06-12
      • 2015-07-28
      • 2019-06-13
      • 2016-05-27
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      相关资源
      最近更新 更多