我正在使用Python庫Fabric來做一些遠程服務器維護。除非您將命令包含在一對語句中,否則Fabric會自動將所有響應輸出到遠程命令和本地命令。像這樣,在本地機器上,什麼是用幾個函數包裝幾個函數的語句方式
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")
我寫一個長期而複雜的任務,發現自己重複那兩個用一遍又一遍聲明。我想寫一個名爲_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的每一頁都表明,由於安全問題,它幾乎總是一個壞主意。我研究了partials,但我無法弄清楚如何在我的_mute函數中調用一個參數。我猜這裏有一個更高級別的Python概念。這樣做的pythonic途徑是什麼?感謝您可能提供的任何方向。
感謝@contextmanager裝飾工作完美。我很感謝你指導我對那些文檔以及* args語法。 –