首页 > 解决方案 > 将带有键的字典传递给函数

问题描述

我是Python世界的新手,所以我不知道我是否会以适当的方式解释它。

我有一个多线程脚本,其中线程函数有几个变量,2 个强制和*args. 在*args我想将调用传递给字典键,但将其作为变量传递。让我向您展示代码,以便您更好地理解:

编辑:正确的代码示例

import threading

routers = []


def list_file(file, separator=None):
    if separator:
        return [line.strip().split(separator) for line in open(str(file), "r").readlines()]
    else:
        return [line.strip() for line in open(str(file), "r").readlines()]

def do_something(target, command, *args):
    if command == "one":
        print(target, "option one", args)
    if command == "two":
        print(target, "option two", args)
    else:
        print("No valid command")


def thread(targets, cmd, *args):
    try:
        threads = list()
        for x in targets:
            th = threading.Thread(target = cmd, args = (x["hostname"],) + args)
            threads.append(th)
            th.start()

    except KeyboardInterrupt:
        print("\n\n* Program aborted by user. Exiting...\n")
        raise


for x in list_file("./hosts.txt", ","):
    routers += [{"hostname": x[0], "dmvpn_ip": x[1]}]


thread(routers,do_something, 'one', 'hello' + x["dmvpn_ip"])

基本上,如果您看到“thread(routers,do_something, 'one', 'hello' + x["dmvpn_ip"] )" 我想通过x["dmvpn_ip"]在第 th 变量中的 thread() 中完成"th = threading.Thread(target = cmd, args = (x["hostname"],) + args )"。

但它会引发以下错误,如果我将它作为字符串发送,它不会做我想要的:

Traceback (most recent call last):
  File "/test.py", line 38, in <module>
    thread(routers,do_something, 'one', 'hello' + x["dmvpn_ip"])
TypeError: list indices must be integers or slices, not str

亲切的问候

标签: pythonpython-3.x

解决方案


好的,所以我以另一种方式完成了它并工作了:我从线程函数中取出 for 循环并在外面执行,这样我就可以直接传递键的值。现在它看起来像这样:

import files
routers = []
threads = list()

for x in files.list_file("./hosts.txt", ","):
    routers += [{"hostname": x[0], "dmvpn_ip": x[1]}]

for y in routers:
    thread(threads,y['hostname'],router_cmd, 'normal', 'sh dmvpn interface ' + y['dmvpn_ip'])

和线程代码:

def thread(threads, target, cmd, *args):
    try:
        th = threading.Thread(target = cmd, args = (target,) + args)
        threads.append(th)
        th.start()

    except KeyboardInterrupt:
        print("\n\n* Program aborted by user. Exiting...\n")
        raise

推荐阅读