gpt4 book ai didi

扩展 kwargs 时通过值广播/循环的 Pythonic 方式

转载 作者:太空宇宙 更新时间:2023-11-04 00:41:06 26 4
gpt4 key购买 nike

我有一个函数 foo,它有很多关键字参数:

def foo(blah=1, blih='abc', blohp=('improbable', 'towel', 42)):
pass

我有一个函数 bar,它在循环中调用函数 foo,并展开 kwargs:

def bar(n, **kwargs):
for i in range(n):
foo(**kwargs)

我有三个同样重要的用例:

  1. 广播:kwargs 是一个标准的 dict 并且 bar 在每次调用 foo 时扩展它(foo 总是使用相同的关键字参数调用)。这就是上面实现的内容。
  2. 循环:kwargs 中的所有值都包装在某种可迭代对象中(长度为 n),bar 扩展每个新值每次对 foo 的新调用的迭代(foo 每次都使用不同的关键字参数调用)。
  3. 组合:kwargs 中的某些值被包裹在某种可迭代对象中,类似于 2. 进行处理,而有些则没有,类似于 进行广播>1..

请注意 foo 接收到的实际关键字参数是任意的(因此它们本身实际上可能是一个可迭代对象 - 如 blihblohp) .

什么是实现这种行为并同时满足所有用例的简洁的 Pythonic 模式?

最佳答案

假设您想在 n==2 和所有 kwargs 都是可迭代对象时调用 bar 两次,这是一种方法:

from collections import abc
from itertools import repeat

def foo(blah=1, blih='abc', blohp=('improbable', 'towel', 42)):
print(blah, blih, blohp)

def bar(n, **kwargs):
args = []
for v in kwargs.values():
# Turn single argument to iterable, treat strings as single arg
if isinstance(v, str) or not isinstance(v, abc.Iterable):
v = repeat(v)

args.append(v)

# Iterable that returns a tuple containing one item from each of the
# iterables created above
args = zip(*args)
for i in range(n):
foo(**dict(zip(kwargs, next(args))))

d = {
'blah': 1,
'blih': ['abc', 'def'],
'blohp': [
('improbable', 'towel', 42),
('improbable', 'towel', 43)
]
}

bar(2, **d)
bar(2, blah='blah', blih='blih', blohp='blohp')

输出:

1 abc ('improbable', 'towel', 42)
1 def ('improbable', 'towel', 43)
blah blih blohp
blah blih blohp

关于扩展 kwargs 时通过值广播/循环的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41905978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com