gpt4 book ai didi

python - 将多个函数包装在同一个 with 语句中的 pythonic 方法是什么

转载 作者:太空狗 更新时间:2023-10-29 22:16:30 26 4
gpt4 key购买 nike

我正在使用 Python 库,Fabric ,做一些远程服务器维护。 Fabric 会自动输出对远程和本地命令的所有响应,除非您将命令包装在一对 with 语句中。像这样,在本地机器上,

with settings(warn_only='true'):
with hide('running', 'stdout', 'stderr', 'warnings'):
output = local("uname -a", True)

或者在远程机器上像这样:

with settings(warn_only='true'):
with hide('running', 'stdout', 'stderr', 'warnings'):
output = run("uname -a")

我正在写一个漫长而复杂的任务,发现自己一遍又一遍地重复这两个 with 语句。我想编写一个名为 _mute() 的函数来防止重复。它会让我做这样的事情:

def _mute(fabric_cmd, args):
with settings(warn_only='true'):
with hide('running', 'stdout', 'stderr', 'warnings'):
output = fabric_cmd(args)
return output

def some_remote_task():
# Run a remote task silently
_mute(remote, 'uname -a')

def some_local_task():
# Run a local task silently
_mute(local, 'uname -a', True)

我研究了一些解决方案并且知道“eval”可以为我做这件事。但是我读到的关于 eval 的每一页都表明,由于安全问题,它几乎总是一个坏主意。我查看了部分函数,​​但我无法弄清楚如何在我的 _mute 函数中创建一个可调用的参数。我猜这里缺少一个更高级别的 Python 概念。执行此操作的 pythonic 方法是什么?感谢您提供的任何指导。

最佳答案

更好的解决方案是让您构建自己的上下文管理器;到目前为止,最简单的方法是使用 contextlib.contextmanager decorator :

from contextlib import contextmanager

@contextmanager
def _mute():
with settings(warn_only='true'):
with hide('running', 'stdout', 'stderr', 'warnings'):
yield

然后使用_mute 作为上下文管理器:

def some_remote_task():
# Run a remote task silently
with _mute():
output = remote("uname -a")

与必须重新键入两个较大的上下文管理器行相比,这更加紧凑和可读,并且具有添加的优势,即现在您可以在同一上下文中运行多个命令。

至于你的问题;您可以使用 *args 语法轻松地将任意参数应用于给定函数:

def _mute(fabric_cmd, *args):
with settings(warn_only='true'):
with hide('running', 'stdout', 'stderr', 'warnings'):
return fabric_cmd(*args)

def some_remote_task():
# Run a remote task silently
output = _mute(remote, 'uname -a')

参见 *args and **kwargs?有关 *args 任意参数列表技巧的更多信息。

关于python - 将多个函数包装在同一个 with 语句中的 pythonic 方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12251620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com