在Python中使用条件'with'语句

时间:2014-08-12 22:14:52

标签: python python-3.x

我正在尝试在Python中处理大字节流。据我所知,使用'with'语句可以防止将临时数据加载到内存中,这对我来说是一个优势。

我的问题是我有两个选择源数据流的选项:原始数据流或源路径。

if sourceRef:
    with open(sourceRef, 'rb') as ds:
        dstreams['master'] = self._generateMasterFile(ds)
else:
    with self._validate(source) as ds:
        dstreams['master'] = self._generateMasterFile(ds)

这样可以正常工作,但是我有更复杂的场景,其中'with'声明之后的操作更复杂,我不想复制它们。

有没有办法压缩这两个选项?

谢谢,

编辑:我正在使用Python 3。

2 个答案:

答案 0 :(得分:3)

只要两个内容都单独使用with,您就可以按如下方式内联if语句:

with (open(sourceRef, 'rb') if sourceRef else self._validate(source)) as ds:
    dstreams['master'] = self._generateMasterFile(ds)

答案 1 :(得分:3)

最干净的解决方案可能是事先定义ds

if sourceRef:
    ds = open(sourceRef, 'rb')
else:
    ds = self._validate(source)

with ds:
    dstreams['master'] = self._generateMasterFile(ds)

当您有两个以上可能的ds值时,此方法也会以干净的方式工作(您可以事先扩展检查以确定ds的值)。