问题标签 [contextmanager]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 我应该如何从 with 语句中返回有趣的值?
有没有比使用全局变量从上下文管理器获取有趣值更好的方法?
其他可能性:
单身人士
某种全球性的...
元组作为上下文管理器的参数
使功能更具体地解决问题/减少可重用性
将特定属性作为上下文管理器的参数保存的实例
与元组相同的问题,但更易读
在保存值的上下文管理器末尾引发异常。
真是个坏主意
python - 如何在 Python 中将变量放在堆栈/上下文中
本质上,我想在堆栈上放置一个变量,堆栈上该部分下方的所有调用都可以访问该变量,直到块退出。在Java中,我会使用支持方法的本地静态线程来解决这个问题,然后可以从方法中访问它。
典型例子:你得到一个请求,并打开一个数据库连接。在请求完成之前,您希望所有代码都使用此数据库连接。完成并关闭请求后,关闭数据库连接。
我需要这个,是一个报告生成器。每个报告由多个部分组成,每个部分可以依赖于不同的计算,有时不同的部分部分依赖于相同的计算。因为我不想重复繁重的计算,所以我需要缓存它们。我的想法是用缓存装饰器来装饰方法。缓存根据方法名称和模块创建一个 id,它是参数,查看它是否已经在堆栈变量中计算了这个,如果没有,则执行该方法。
我将通过展示我当前的实现来尝试和清除。我想做的是简化那些实现计算的代码。
首先,我有中央缓存访问对象,我称之为 MathContext:
fn 参数是创建上下文相关的文件名,可以从中读取数据以进行计算。
然后我们有 Calculation 类:
这是一个愚蠢的斐波那契示例。这些方法实际上都不是递归的,它们适用于大量数据,但它可以证明您将如何依赖其他计算:
相反,我希望斐波那契只是一种装饰方法:
在 math_context 示例中,当 math_context 超出范围时,它的所有缓存值也会如此。我想要装饰师也一样。IE。在 X 点,@cache 缓存的所有内容都被取消引用为 gced。
python - 查找在 with: 块中定义的函数
以下是Richard Jones 博客中的一些代码:
我的问题是:他到底是怎么做到的?上下文管理器如何访问 with 块内的范围?这是尝试解决此问题的基本模板:
python - 解释 Python 的 '__enter__' 和 '__exit__'
我在某人的代码中看到了这一点。这是什么意思?
python - 在多个上下文管理器上创建一个“with”块?
假设您通过上下文管理器获取了三个对象,例如锁、数据库连接和 ip 套接字。您可以通过以下方式获取它们:
但是有没有办法在一个街区内做到这一点?就像是
此外,是否有可能,给定具有上下文管理器的未知长度的对象数组,是否有可能以某种方式做到:
如果答案是“否”,是因为需要这样的功能意味着糟糕的设计,还是我应该鼓励一下?:-P
python - python中的装饰器与在函数上调用函数完全相同吗?
我以为这样做
完全一样
但是,我有这段代码,它使用 contextlib.contextmanager:
哪个有效并产生1 3 2
当我试图把它改成
我明白了AttributeError: 'function' object has no attribute '__exit__'
我错过了什么?contextlib.contextmanager 中是否有一些特别的黑魔法,或者我误解了装饰器的一般工作方式?
python - 简化python中的线程
我正在寻找一种方法来简化我的线程代码。
我的代码中有很多地方可以执行以下操作:
即在线程中运行相同的函数,每次针对不同的参数。
这当然是真实代码的简化版本,通常for
循环内的代码长约 10-20 行,不能像myFunction
上面的例子那样使用一个辅助函数来简化(如果是这种情况,我可以只使用线程池)。
此外,这种情况在我的代码中非常非常常见,因此我认为有很多行是多余的。如果我不需要处理所有这些样板代码,而是能够执行以下操作,那将对我有很大帮助:
即以某种方式threaded()
获取其中的每一行代码并在单独的线程中运行它。
我知道在这种情况下不应该使用上下文管理器,这可能是一个坏主意,并且需要一个丑陋的 hack,但尽管如此 - 可以做到吗,怎么做?
python - 使用语句和上下文管理器了解 Python
我试图理解该with
声明。我知道它应该替换try
/except
块。
现在假设我做这样的事情:
如何用上下文管理器替换它?
python - 如何将装饰器与 @contextmanager 装饰器混合使用?
这是我正在使用的代码:
问题是,@with_report_status
不会像预期的那样屈服@contextmanager
。但是,我也不能反过来包装它,因为@contextmanager
返回一个生成器对象(我认为!)而不是值本身。
我怎样才能让@contextmanager
装饰者玩得开心?
python - python的`with`语句目标意外地是None
好像我不明白 --- pythonwith
语句。
考虑这个类:
现在,当使用它时with
,就像在
我希望有一些输出,例如<test instance at memore blah>。但我得到None。
这里有什么问题吗?任何建议都会有所帮助。
(我使用的是 Python 2.6.6。)
编辑:
感谢
ephement将我指向文档。该__enter__
方法应阅读