python – 上下文管理员是否适合这份工作?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 上下文管理员是否适合这份工作?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2345字,纯文字阅读大概需要4分钟。
内容图文
![python – 上下文管理员是否适合这份工作?](/upload/InfoBanner/zyjiaocheng/826/b1bb1373cb5c4620afe5577fe96eef82.jpg)
下面粘贴的代码执行以下操作:
>创建一个导入钩子
>创建一个上下文管理器,用于设置meta_path并在退出时清除.
>转储在imports.log中输入的程序完成的所有导入
现在我想知道在这种情况下使用上下文管理器是否是一个好主意,因为实际上我没有标准的try / finally流程,只是设置和清理.
另一件事 – 用这条线:
with CollectorContext(cl, sys.argv, 'imports.log') as cc:
cc变为无?它不应该是CollectorContext对象吗?
from __future__ import with_statement
import os
import sys
class CollectImports(object):
"""
Import hook, adds each import request to the loaded set and dumps
them to file
"""
def __init__(self):
self.loaded = set()
def __str__(self):
return str(self.loaded)
def dump_to_file(self, fname):
"""Dump the loaded set to file
"""
dumped_str = '\n'.join(x for x in self.loaded)
open(fname, 'w').write(dumped_str)
def find_module(self, module_name, package=None):
self.loaded.add(module_name)
class CollectorContext(object):
"""Sets the meta_path hook with the passed import hook when
entering and clean up when exiting
"""
def __init__(self, collector, argv, output_file):
self.collector = collector
self.argv = argv
self.output_file = output_file
def __enter__(self):
self.argv = self.argv[1:]
sys.meta_path.append(self.collector)
def __exit__(self, type, value, traceback):
# TODO: should assert that the variables are None, otherwise
# we are quitting with some exceptions
self.collector.dump_to_file(self.output_file)
sys.meta_path.remove(self.collector)
def main_context():
cl = CollectImports()
with CollectorContext(cl, sys.argv, 'imports.log') as cc:
progname = sys.argv[0]
code = compile(open(progname).read(), progname, 'exec')
exec(code)
if __name__ == '__main__':
sys.argv = sys.argv[1:]
main_context()
解决方法:
我认为这个概念还可以.同样,我没有看到任何理由反对在finally:子句中使用清理内容,因此上下文管理器完全适合.
你的cc是无,因为你告诉它是这样的.
如果您不想这样,请更改您的__enter__ method to return something else:
The value returned by this method is bound to the identifier in the
as
clause ofwith
statements using this context manager.
def __enter__(self):
self.argv = self.argv[1:]
sys.meta_path.append(self.collector)
return self
# or
return self.collector
# or
return "I don't know what to return here"
然后
with CollectorContext(cl, sys.argv, 'imports.log') as cc:
print cc, repr(cc) # there you see what happens.
progname = sys.argv[0]
code = compile(open(progname).read(), progname, 'exec')
exec(code)
内容总结
以上是互联网集市为您收集整理的python – 上下文管理员是否适合这份工作?全部内容,希望文章能够帮你解决python – 上下文管理员是否适合这份工作?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。