问题标签 [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.

0 投票
3 回答
7706 浏览

python - 我应该如何从 with 语句中返回有趣的值?

有没有比使用全局变量从上下文管理器获取有趣值更好的方法?

其他可能性:

  • 单身人士

    某种全球性的...

  • 元组作为上下文管理器的参数

    使功能更具体地解决问题/减少可重用性

  • 将特定属性作为上下文管理器的参数保存的实例

    与元组相同的问题,但更易读

  • 在保存值的上下文管理器末尾引发异常。

    真是个坏主意

0 投票
4 回答
2075 浏览

python - 如何在 Python 中将变量放在堆栈/上下文中

本质上,我想在堆栈上放置一个变量,堆栈上该部分下方的所有调用都可以访问该变量,直到块退出。在Java中,我会使用支持方法的本地静态线程来解决这个问题,然后可以从方法中访问它。

典型例子:你得到一个请求,并打开一个数据库连接。在请求完成之前,您希望所有代码都使用此数据库连接。完成并关闭请求后,关闭数据库连接。

我需要这个,是一个报告生成器。每个报告由多个部分组成,每个部分可以依赖于不同的计算,有时不同的部分部分依赖于相同的计算。因为我不想重复繁重的计算,所以我需要缓存它们。我的想法是用缓存装饰器来装饰方法。缓存根据方法名称和模块创建一个 id,它是参数,查看它是否已经在堆栈变量中计算了这个,如果没有,则执行该方法。

我将通过展示我当前的实现来尝试和清除。我想做的是简化那些实现计算的代码。

首先,我有中央缓存访问对象,我称之为 MathContext:

fn 参数是创建上下文相关的文件名,可以从中读取数据以进行计算。

然后我们有 Calculation 类:

这是一个愚蠢的斐波那契示例。这些方法实际上都不是递归的,它们适用于大量数据,但它可以证明您将如何依赖其他计算:

相反,我希望斐波那契只是一种装饰方法:

在 math_context 示例中,当 math_context 超出范围时,它的所有缓存值也会如此。我想要装饰师也一样。IE。在 X 点,@cache 缓存的所有内容都被取消引用为 gced。

0 投票
2 回答
1131 浏览

python - 查找在 with: 块中定义的函数

以下是Richard Jones 博客中的一些代码:

我的问题是:他到底是怎么做到的?上下文管理器如何访问 with 块内的范围?这是尝试解决此问题的基本模板:

0 投票
7 回答
354648 浏览

python - 解释 Python 的 '__enter__' 和 '__exit__'

我在某人的代码中看到了这一点。这是什么意思?


0 投票
5 回答
90702 浏览

python - 在多个上下文管理器上创建一个“with”块?

假设您通过上下文管理器获取了三个对象,例如锁、数据库连接和 ip 套接字。您可以通过以下方式获取它们:

但是有没有办法在一个街区内做到这一点?就像是

此外,是否有可能,给定具有上下文管理器的未知长度的对象数组,是否有可能以某种方式做到:

如果答案是“否”,是因为需要这样的功能意味着糟糕的设计,还是我应该鼓励一下?:-P

0 投票
1 回答
638 浏览

python - python中的装饰器与在函数上调用函数完全相同吗?

我以为这样做

完全一样

但是,我有这段代码,它使用 contextlib.contextmanager:

哪个有效并产生1 3 2

当我试图把它改成

我明白了AttributeError: 'function' object has no attribute '__exit__'

我错过了什么?contextlib.contextmanager 中是否有一些特别的黑魔法,或者我误解了装饰器的一般工作方式?

0 投票
4 回答
232 浏览

python - 简化python中的线程

我正在寻找一种方法来简化我的线程代码。

我的代码中有很多地方可以执行以下操作:

即在线程中运行相同的函数,每次针对不同的参数。

这当然是真实代码的简化版本,通常for循环内的代码长约 10-20 行,不能像myFunction上面的例子那样使用一个辅助函数来简化(如果是这种情况,我可以只使用线程池)。

此外,这种情况在我的代码中非常非常常见,因此我认为有很多行是多余的。如果我不需要处理所有这些样板代码,而是能够执行以下操作,那将对我有很大帮助:

即以某种方式threaded()获取其中的每一行代码并在单独的线程中运行它。

我知道在这种情况下不应该使用上下文管理器,这可能是一个坏主意,并且需要一个丑陋的 hack,但尽管如此 - 可以做到吗,怎么做?

0 投票
5 回答
12918 浏览

python - 使用语句和上下文管理器了解 Python

我试图理解该with声明。我知道它应该替换try/except块。

现在假设我做这样的事情:

如何用上下文管理器替换它?

0 投票
2 回答
3357 浏览

python - 如何将装饰器与 @contextmanager 装饰器混合使用?

这是我正在使用的代码:

问题是,@with_report_status不会像预期的那样屈服@contextmanager。但是,我也不能反过来包装它,因为@contextmanager返回一个生成器对象(我认为!)而不是值本身。

我怎样才能让@contextmanager装饰者玩得开心?

0 投票
3 回答
5030 浏览

python - python的`with`语句目标意外地是None

好像我不明白 --- pythonwith语句。

考虑这个类:

现在,当使用它时with,就像在

我希望有一些输出,例如<test instance at memore blah>。但我得到None

这里有什么问题吗?任何建议都会有所帮助。

(我使用的是 Python 2.6.6。)

编辑:

感谢 ephement将我指向文档。该__enter__方法应阅读