我正在尝试保留一个打开文件的字典,以便将数据拆分成单个文件.当我从字典中请求文件时,如果密钥不存在,我希望它被打开.但是,看起来我不能使用lambda作为默认值.
例如
files = {}
for row in data:
f = files.get(row.field1, lambda: open(row.field1, 'w'))
f.write('stuff...')
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为f设置为函数,而不是结果.使用上述语法的setdefault也不起作用.除此之外我还能做些什么:
f = files.get(row.field1)
if not f:
f = files[row.field1] = open(row.field1, 'w')
Run Code Online (Sandbox Code Playgroud)
这个用例对于a来说太复杂了defaultdict,这就是为什么我不相信Python stdlib中存在这样的东西.但是,您可以轻松地defaultdict自己编写一个通用的"扩展" ,它将丢失的密钥传递给回调:
from collections import defaultdict
class BetterDefaultDict(defaultdict):
def __missing__(self, key):
return self.setdefault(key, self.default_factory(key))
Run Code Online (Sandbox Code Playgroud)
用法:
>>> files = BetterDefaultDict(lambda key: open(key, 'w'))
>>> files['/tmp/test.py']
<open file '/tmp/test.py', mode 'w' at 0x7ff552ad6db0>
Run Code Online (Sandbox Code Playgroud)
这适用于Python 2.7+,不知道旧版本:)另外,不要忘记再次关闭这些文件:
finally:
for f in files.values(): f.close()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
380 次 |
| 最近记录: |