在编写一个小型库时,我发现需要清理函数所有参数的输入,如下所示:
import subprocess
import pipes
def copy(src, dst, id_file='/path/to/key'):
src = pipes.quote(src)
dest = pipes.quote(dest)
id_file = pipes.quote(id_file)
subprocess.check_output('scp -r -i %s %s %s' % (id_file, src, dest))
不是通过pipes.quote()显式运行每个参数,而是如何更优雅地执行此操作,以及任何数量的参数(包括* args和** kwargs,如果存在)?
答案 0 :(得分:1)
大多数子流程函数接受参数列表:
subprocess.check_output(['scp', '-r', '-i', id_file, src, dest])
不再需要引用。
这很好地概括为*args
:
def foo(*args, **kwargs):
call_args = ['scp', '-r', '-i']
call_args.extend(args)
call_args.extend(arg for item in kwargs.items() for arg in item)
subprocess.check_output(call_args)
当然,对于kwargs,你永远不知道他们在最终的通话中会以什么顺序结束。 。