用额外布尔值包装 Python 函数
我正在把一些代码从Perl语言转到Python语言,其中有一个函数是这样的:
sub _Run($verbose, $cmd, $other_stuff...)
{
...
}
sub Run
{
_Run(1, @_);
}
sub RunSilent
{
_Run(0, @_);
}
所以在Python中,我天真地以为可以这样做:
def _Run(verbose, cmd, other_stuff...)
...
def Run(*args)
return _Run(True, args);
def RunSilent
return _Run(False, args);
但这样不行,因为args是以数组或元组的形式传递的。为了让它能工作,我做了以下的修改:
def _Run(verbose, cmd, other_stuff...)
...
def Run(*args)
return _Run(True, ','.join(args));
def RunSilent
return _Run(False, ','.join(args));
不过这样看起来有点丑。有没有更好的方法呢?
2 个回答
3
还有一个叫做 functools.partial 的东西:
from functools import partial
Run = partial(_Run, True)
RunSilent = partial(_Run, False)
这个可以帮你创建你想要的两个函数。需要 Python 2.5 或更高版本。
5
在Python中,*
可以用来传递位置参数。
def Run(*args):
return _Run(True, *args)
不过,仅仅用这个,你不能用关键字参数来调用函数。如果想支持关键字参数,就需要加上**
:
def Run(*args, **kwargs):
return _Run(True, *args, **kwargs)
实际上,你可以这样声明函数:
def run(cmd, other_stuff, silent=False):
...
这样就可以像下面这样调用:
run("foo", etc) # Run
run("foo", etc, silent=True) # RunSilent