用额外布尔值包装 Python 函数

1 投票
2 回答
737 浏览
提问于 2025-04-16 03:29

我正在把一些代码从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

撰写回答