python – 用于打开具有两个函数的文件的“with”语法

python – 用于打开具有两个函数的文件的“with”语法,第1张

概述假设我想使用以下语法打开一个文本文件进行阅读: with open(fname,'r') as f: # do something pass 但如果我发现它以.gz结尾,我会调用gzip.open(). if fname.endswith('.gz'): with gzip.open(fname,'rt') as f: # do something 假设我想使用以下语法打开一个文本文件进行阅读:
with open(fname,'r') as f:    # do something    pass

但如果我发现它以.gz结尾,我会调用gzip.open().

if fname.endswith('.gz'):    with gzip.open(fname,'rt') as f:            # do something            passelse:    with open(fname,'r') as f:            # do something            pass

如果“做某事”部分很长并且不方便在函数中写入(例如,它会创建一个无法序列化的嵌套函数),使用gzip.open或基于返回的打开调用的最短方法是什么? fname.endswith( ‘广州’)?

解决方法 上下文管理器帮助关闭对象.

但是,您不必创建用作上下文管理器的对象,同时使用它来输入上下文. open()和gzip.open()调用返回一个恰好是上下文管理器的新对象,您可以在输入上下文之前创建它们:

if fname.endswith('.gz'):    f = gzip.open(fname,'rt')else:    f = open(fname,'r')with f:    # do something

在这两种情况下,对象在进入上下文时返回self,因此这里不需要使用f作为f.

此外,函数是一等公民,因此您还可以使用变量来存储函数,然后在with语句中调用它来创建上下文管理器和文件对象:

if fname.endswith('.gz'):    opener = gzip.openelse:    opener = openwith opener(fname,'rt') as f:  # yes,both open and gzip.open support mode='rt'    # do something

这并没有真正为你带来任何其他方法,但你可以使用字典将扩展名映射到callables,如果你愿意的话.

底线是calls context-manager hook methods,没有更少,仅此而已.应用之后的表达式应该提供这样的管理器,但是创建该对象不受上下文管理协议的约束.

总结

以上是内存溢出为你收集整理的python – 用于打开具有两个函数的文件的“with”语法全部内容,希望文章能够帮你解决python – 用于打开具有两个函数的文件的“with”语法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1207013.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存