python - 是否可以使用 lambda 作为字典默认值?

标签 python

我正在尝试保留打开文件的字典,以便将数据拆分为单个文件。当我从字典中请求一个文件时,如果 key 不存在,我希望它被打开。但是,我似乎无法默认使用 lambda。

例如

files = {}
for row in data:
  f = files.get(row.field1, lambda: open(row.field1, 'w'))
  f.write('stuff...')

这不起作用,因为 f 被设置为函数,而不是它的结果。使用上述语法的 setdefault 也不起作用。除此之外还有什么我可以做的吗:

f = files.get(row.field1)
if not f:
    f = files[row.field1] = open(row.field1, 'w')

最佳答案

这个用例对于 defaultdict 来说太复杂了,这就是为什么我不相信 Python stdlib 中存在这样的东西。但是,您可以自己轻松编写一个通用的“扩展”defaultdict,它将缺少的键传递给回调:

from collections import defaultdict

class BetterDefaultDict(defaultdict):
  def __missing__(self, key):
    return self.setdefault(key, self.default_factory(key))

用法:

>>> files = BetterDefaultDict(lambda key: open(key, 'w'))
>>> files['/tmp/test.py']
<open file '/tmp/test.py', mode 'w' at 0x7ff552ad6db0>

这适用于 Python 2.7+,不知道旧版本:) 另外,不要忘记再次关闭这些文件:

finally:
  for f in files.values(): f.close()

关于python - 是否可以使用 lambda 作为字典默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9367253/

相关文章:

python - flask 中的 Socket.io : Data from external source

Python 3 tkinter x 使用箭头滚动非常慢

python - Python 中的 mkdir -p 功能

python - 在 Python 中制作随机 3-D 形状

python - 什么是 [Sci/Num]Python 相当于 Matlabs "norminv"(正态逆累积分布函数)

python - 当 requirements.txt 或 setup.py 改变时用 tox 重新安装 virtualenv

python - 在 Colab 笔记本中定义我的 google 驱动器中文件的路径

python - tkinter 中的 Tcl 错误

python - 删除多个文件夹中的相同文件(python)

python - 在 Python 3.6 中解码 %xx