- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
自从我知道了这个模式,我就一直在使用
with open('myfile.txt','w') as myfile:
with contextlib.redirect_stdout(myfile):
# stuff
print(...) # gets redirected to file
这让我可以使用打印语法(我更喜欢)写入文件,我可以轻松地将其注释掉以打印到屏幕以进行调试。但是,通过这样做,我将失去写入文件和屏幕的能力,并且可能编写不太清晰的代码。还有其他我应该了解的缺点吗?这是我应该使用的模式吗?
最佳答案
is this a pattern I should be using?
在这种特殊情况下,我确实认为您的模式不是惯用的,并且可能会让代码的读者感到困惑。内置的 print
(因为这是一个 Python-3x 问题)已经有一个 file
keyword argument这将完全按照 redirect_stdout
在您的示例中执行的操作:
with open('myfile.txt', 'w') as myfile:
print('foo', file=myfile)
并引入 redirect_stdout
只会让您的读者想知道您为什么不使用内置功能。 (就我个人而言,我发现嵌套的 with
很难看。\
分隔的 with
更难看。)
至于注释掉(以及打印到 stdout
和文件)的方便性,您可以根据需要进行任意多次 print
调用,并进行注释根据需要将它们取出
with open('myfile.txt', 'w') as myfile:
print('foo')
print('foo', file=myfile)
Are there any other disadvantages I should know about
除了它可能不是最佳解决方案(如本例)之外,我想不出任何确定的东西。
编辑:
来自doc :
Note that the global side effect on sys.stdout means that this context manager is not suitable for use in library code and most threaded applications. It also has no effect on the output of subprocesses.
关于python - contextlib.redirect_stdout 总是一个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35370052/
自从我知道了这个模式,我就一直在使用 with open('myfile.txt','w') as myfile: with contextlib.redirect_stdout(myfile
我在 Ubuntu 上使用 Python3.5。以下脚本创建一个文件 out 并用越来越多的“Hello”行填充它: import contextlib with contextlib.redirec
我正在尝试创建一个包装器来使上下文对象成为可选的。当条件为真时,事物应该表现得像包装的上下文对象,否则它应该表现得像无操作上下文对象。此示例适用于使用一次包装对象,但失败了,它被重新使用。 例子: i
我明白了why contextlib.nested is deprecated . 但是如果我为旧的 python 版本编写程序而没有 with 的多种形式(即 < 2.7),我(几乎)别无选择。 为
有谁知道我在哪里可以找到这个 python 模块“contextlib”? root@overo:~# python
我们的代码根据运行时参数调用可变数量的上下文管理器: from contextlib import nested, contextmanager @contextmanager def my_cont
为什么我可以跳过在 yield log_func 中调用 log_func,即我可以只写 yield 而代码仍然有效。这是为什么? yield 在这种情况下如何工作? import time from
假设我有一个上下文管理器: @contextmanager def cm(x): y = f(x) z = yield y g(z) 如何将 z 发送到上下文管理器? 我试过:
我使用 Python2.7 并且我想要函数:contextlib.redirect_stdout . 我的意思是,我想重定向特定函数的输出(不是所有程序)。 问题是 - 只有 Python3 支持“c
作为将我的游戏引擎代码转换为 cython 的一部分,我正在移植我的顶点缓冲区对象 (Vbo) 类。我使用这个 Vbo 类将 3D 模型数据发送到 GPU。代码 (vbo.pyx) 当前如下所示: c
我在 python 中使用 with 语句( PEP 343 ) 时遇到了一些问题,以便在上下文之后自动管理资源清理。特别是,with 语句 始终假定资源清理方法是 .close()。 IE。在下面的
为了以编程方式组合上下文管理器,我使用以下代码: == helpers.py == from contextlib import nested import mock def multiple_pat
context.nested 已被弃用,我试图理解这背后的基本原理,在阅读了很长时间的文档后,我看不到一个例子来说明第二个问题: Secondly, if the __enter__() method
我真的很喜欢“with open('in_file'') as f”这个语法。我想将该语法用于必须打开和关闭的我自己的资源。 但是,我不明白如何更改我的 open() 方法以启用“with”语法。我可
from contextlib import closing def init_db(): with closing(connect_db()) as db: with app
尝试从 docker 运行命令时,我遇到了这个错误 google 计算引擎上的 docker 容器。 这是堆栈跟踪: Traceback (most recent call last): File
为了以编程方式组合上下文管理器,我使用以下代码: == helpers.py == from contextlib import nested import mock def multiple_pat
为了说明我的问题,这里有一个不使用 contextlib 的基本请求: import urllib.request url = "http://www.example.com/"
在寻找性能错误的过程中,我终于确定问题的根源是 contextlib 包装器。开销相当惊人,我没想到这是减速的根源。减速在 50 倍的范围内,我无法承受循环。如果它有可能显着减慢速度,我肯定会感谢文档
为什么要使用 contextlib.suppress 来抑制异常,而不是使用 try/except 和 pass? 这两种方法在字符数量上没有区别(如果有的话,suppress 有更多的字符),即使代
我是一名优秀的程序员,十分优秀!