在python中包装函数,提供额外的布尔值

在python中包装函数,提供额外的布尔值,python,wrapper,Python,Wrapper,我正在将一些代码从Perl移植到Python,我正在移动的函数之一执行以下操作: sub _Run($verbose, $cmd, $other_stuff...) { ... } sub Run { _Run(1, @_); } sub RunSilent { _Run(0, @_); } def _Run(verbose, cmd, other_stuff...) ... def Run(*args) return _Run(True, args); def R

我正在将一些代码从Perl移植到Python,我正在移动的函数之一执行以下操作:

sub _Run($verbose, $cmd, $other_stuff...)
{
  ...
}

sub Run
{
  _Run(1, @_);
}

sub RunSilent
{
  _Run(0, @_);
}
def _Run(verbose, cmd, other_stuff...)
  ...

def Run(*args)
  return _Run(True, args);

def RunSilent
  return _Run(False, args);
def _Run(verbose, cmd, other_stuff...)
  ...

def Run(*args)
  return _Run(True, ','.join(args));

def RunSilent
  return _Run(False, ','.join(args));
因此,为了使用Python,我天真地认为我可以做到以下几点:

sub _Run($verbose, $cmd, $other_stuff...)
{
  ...
}

sub Run
{
  _Run(1, @_);
}

sub RunSilent
{
  _Run(0, @_);
}
def _Run(verbose, cmd, other_stuff...)
  ...

def Run(*args)
  return _Run(True, args);

def RunSilent
  return _Run(False, args);
def _Run(verbose, cmd, other_stuff...)
  ...

def Run(*args)
  return _Run(True, ','.join(args));

def RunSilent
  return _Run(False, ','.join(args));
但这不起作用,因为args是作为数组/元组传递的。为了让它发挥作用,我做了以下几点:

sub _Run($verbose, $cmd, $other_stuff...)
{
  ...
}

sub Run
{
  _Run(1, @_);
}

sub RunSilent
{
  _Run(0, @_);
}
def _Run(verbose, cmd, other_stuff...)
  ...

def Run(*args)
  return _Run(True, args);

def RunSilent
  return _Run(False, args);
def _Run(verbose, cmd, other_stuff...)
  ...

def Run(*args)
  return _Run(True, ','.join(args));

def RunSilent
  return _Run(False, ','.join(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

*
也可用于

请注意,只有这样,才能使用关键字参数调用函数。要支持它们,还需要包括
**

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

还有functools.partial:

from functools import partial

Run = partial(_Run, True)
RunSilent = partial(_Run, False)

这将创建您想要的两个函数。需要python 2.5或更高版本。

还有functools.partial:

from functools import partial

Run = partial(_Run, True)
RunSilent = partial(_Run, False)

这将创建您想要的两个函数。需要python 2.5或更高版本。

谢谢。我最终确实使用了以下内容:def run(cmd,other_stuff,silent=False):有时候,在移植这个Perl内容时,我会变得过于文字化,不要停下来思考我将如何在Python中实现它。谢谢。我最终还是使用了这个:def run(cmd,other_stuff,silent=False):有时候,在移植这个Perl东西时,我会变得太过文字化,并且不会停下来思考如何在Python中实现它。