相关疑难解决方法(0)

如何很好地处理`open(...)`和`sys.stdout`?

通常我需要将数据输出到文件,或者,如果未指定文件,则输出到stdout.我使用以下代码段:

if target:
    with open(target, 'w') as h:
        h.write(content)
else:
    sys.stdout.write(content)
Run Code Online (Sandbox Code Playgroud)

我想重写它并统一处理两个目标.

在理想的情况下,它将是:

with open(target, 'w') as h:
    h.write(content)
Run Code Online (Sandbox Code Playgroud)

但这不会很好,因为离开with块时sys.stdout被关闭,我不想这样做.我不想

stdout = open(target, 'w')
...
Run Code Online (Sandbox Code Playgroud)

因为我需要记住恢复原始标准输出.

有关:

编辑

我知道我可以换行target,定义单独的函数或使用上下文管理器.我寻找一种简单,优雅,惯用的解决方案,不需要超过5行

python

84
推荐指数
7
解决办法
3万
查看次数

如何在Python中编写null(无操作)上下文管理器?

有时我需要一个无效的虚拟上下文管理器.然后,它可以用作更有用但可选的上下文管理器的替身.例如:

ctx_mgr = <meaningfulContextManager> if <condition> else <nullContextManager>
with ctx_mgr:
    ...
Run Code Online (Sandbox Code Playgroud)

如何定义这样一个简单的空上下文管理器?Python库是否提供现成的?

我们希望将上下文与as子句一起使用的情况如何?

with ctx_mgr as resource:
    <operations on resource>
Run Code Online (Sandbox Code Playgroud)

python contextmanager

32
推荐指数
3
解决办法
4204
查看次数

How can I test whether a variable holds a lambda?

Is there a way to test whether a variable holds a lambda? The context is I'd like to check a type in a unit test:

self.assertEquals(lambda, type(myVar))
Run Code Online (Sandbox Code Playgroud)

The type seems to be "function" but I didn't see any obvious builtin type to match it. Obviously, I could write this, but it feels clumsy:

self.assertEquals(type(lambda m: m), type(myVar))
Run Code Online (Sandbox Code Playgroud)

python lambda types class

21
推荐指数
4
解决办法
1万
查看次数

with语句中的条件或可选上下文管理器

假设我有一些我正在使用的上下文管理器(来自第三方库):

with freeze_time(test_dt):
    lines_of_code_1
    lines_of_code_2
    lines_of_code_3
Run Code Online (Sandbox Code Playgroud)

但是,假设如果test_dt没有值,则上下文管理器不应该运行,但是所有剩余的代码都应该运行,如下所示:

if test_dt:
    with freeze_time(test_dt):
        lines_of_code_1
        lines_of_code_2
        lines_of_code_3
else:
    lines_of_code_1
    lines_of_code_2
    lines_of_code_3
Run Code Online (Sandbox Code Playgroud)

假设lines_of_code这里有2-3行完全相同的代码,是否有更清晰的写法呢?我知道我可以这样写:

def do_thing():
    lines_of_code_1
    lines_of_code_2
    lines_of_code_3

if test_dt:
    with freeze_time(test_dt):
        do_thing()
else:
    do_thing()
Run Code Online (Sandbox Code Playgroud)

但我对这种格式并不感到疯狂.另外,我不想在我的代码中乱丢这个模式.

最后一种可能性,但我不确定它是否会起作用:如果给出的test_dt为空,则继承上下文管理器并跳过__enter____exit__函数,如下所示:

class optional_freeze_time(object):
    def __init__(self, test_dt=None):
        if test_dt:
            self.ctx_manager = freeze_time(test_dt)
        else:
            self.ctx_manager = None
    def __enter__(self, *args, **kwargs):
        if self.ctx_manager:
            self.ctx_manager.__enter__(*args, **kwargs)
    def __exit__(self, *args, **kwargs):
        if self.ctx_manager:
            self.ctx_manager.__exit__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

我用一个空白的上下文管理器类测试了它,它似乎行为正确.但是,如果我这样做,我担心真正的上下文管理器是否会正常运行(我对它的工作方式不太熟悉).

python contextmanager

5
推荐指数
2
解决办法
814
查看次数

如何使用上下文管理器支持可选的 stdin/stdout?

假设我想实现一个具有以下签名的 Python 脚本:

myscript.py INPUT OUTPUT
Run Code Online (Sandbox Code Playgroud)

...其中INPUT和分别OUTPUT代表脚本将读取和写入的文件的路径。

用于实现具有此类签名的脚本的代码可能具有以下构造:

with open(inputarg, 'r') as instream, open(outputarg, 'w') as outstream:
    ...
Run Code Online (Sandbox Code Playgroud)

...这里的inputarg和变量保存通过其和命令行参数outputarg传递给脚本的文件路径(字符串) 。INPUTOUTPUT


到目前为止没有什么特别或不寻常的事情。

但现在,假设对于脚本的版本 2,我想为用户提供-为其一个(或两个)参数传递特殊值的选项,以指示脚本应分别读取stdin和写入stdout

换句话说,我希望以下所有形式都能产生相同的结果:

myscript.py INPUT OUTPUT
myscript.py   -   OUTPUT  <INPUT
myscript.py INPUT   -             >OUTPUT
myscript.py   -     -     <INPUT  >OUTPUT
Run Code Online (Sandbox Code Playgroud)

现在,with之前的说法已经不再适用。一方面,表达式open('-', 'r')oropen('-', 'w')都会引发异常:

FileNotFoundError: [Errno 2] No such file or directory: '-'
Run Code Online (Sandbox Code Playgroud)

我无法想出一种方便的方法来扩展with上面基于 …

python stdin stdout contextmanager

5
推荐指数
1
解决办法
858
查看次数

标签 统计

python ×5

contextmanager ×3

class ×1

lambda ×1

stdin ×1

stdout ×1

types ×1