![](/img/trans.png)
[英]Using the multiprocessing.Pool.map() function with keyword arguments?
[英]Using map() function with keyword arguments
這是我嘗試在其中使用map
函數的循環:
volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
for volume_id in volume_ids:
my_function(volume_id, ip=ip)
有辦法嗎? 如果不是ip
參數,那將是微不足道的,但是我不確定如何處理。
from functools import partial
mapfunc = partial(my_function, ip=ip)
map(mapfunc, volume_ids)
partial()
創建一個新的可調用對象,除了傳遞給該新的可調用對象的內容之外,該參數還將對包裝的函數應用所有參數(包括關鍵字參數)。
這是lambda方法(不是更好,只是有所不同)
volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
map(lambda ids: my_function(ids, ip), volume_ids);
使用列表理解可以輕松完成此操作。
volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
results = [my_function(i,ip=ip) for i in volume_ids]
通常,可以使用map來將關鍵字傳遞給函數,方法是將該函數包裝在可以解開字典的內容中,然后將可迭代的字典傳遞給map。 例:
from itertools import product
volume_ids = [1,2,3,4,5]
volume_ids = (("volume_id", volume_id) for volume_id in volume_ids)
ips = [("ip", '172.12.13.122')]
kwargs_iterable = map(dict, product(volume_ids, ips))
result = map(lambda kwargs: my_function(**kwargs), kwargs_iterable)
但是,對於您的特殊情況,更簡單的解決方案是:
map(my_function, volume_ids, [ip]*len(volume_ids))
這是簡潔的,不依賴任何進口。 另一種可能是將itertools的產品和星圖結合起來:
from itertools import product, starmap
ips = [ip]
starmap(my_function, product(volume_ids, ips))
這可以很好地推廣到具有多個ip地址或兩個以上變量的設置。
這個怎么樣?
results = []
for volume_id in volume_ids:
results.append(my_function(volume_id, ip=ip))
這是三行代碼,而不是一行---這是三行清晰明了的代碼,而不是從某某類模塊中導入一些特殊情況的幫助程序。 該論點可能只是一個品味問題,但取決於您與誰交談,它具有很大的分量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.