我们可以用 a = a + 1
(augmented assignments) 代替 a += 1
。
优点是我们不需要写两次 foo
。
以同样的方式,我想简化以下模式:
c['d'] = some_function(c['d'])
Python 的标准库中是否有一些函数可以使这成为可能?
只是为了说明我在寻找什么:
我可以写这样的东西(一次)
def apply_in_place(callable, dictionary, key):
dictionary[key] = callable(dictionary[key])
这会让我做(在很多地方)
apply_in_place(some_function, c, 'd')
但是,我有一种感觉,标准库中肯定已经有一些东西了,例如类似于 map()
。
我自己找不到任何东西。
请注意:我不是询问Applying a function to values in dict。
答案 0 :(得分:1)
TL;DR 你不能,因为字典、函数调用和赋值在 Python 中是如何工作的。您展示的包装函数是最好的 2 个可用选项之一。阅读下面的第二种选择。
这个问题的前提有点偏离。如果它是一个整数 (+=
),您也可以在 dict 值上使用 dictionary[key] += 1
,另一方面,如果您想将函数应用于非-dict 值 (foo = some_callable(foo)
)。
换句话说,问题不在于你想将一个函数应用到一个 dict 值上,而只是你想应用一个函数。
在我看来,您有 2 种可读且非 hacky 的方法来实现这一目标:
创建一个包装函数,很像您所做的,这样可以最大限度地减少重复。
子类 UserDict
也将允许您通过提供接口来最小化重复:
from collections import UserDict
class MyDict(UserDict):
def apply(self, f, key):
# TODO sanity check if f is not callable or if key does not exist
self[key] = f(self[key])
d = MyDict({'a': 'a'})
d.apply(str.upper, 'a')
print(d)
输出
{'a': 'A'}