Обернуть функцию в Python, предоставляя дополнительный логический - PullRequest
1 голос
/ 30 августа 2010

Я портирую некоторый код из 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 ]

5 голосов
/ 30 августа 2010

* может использоваться для передачи (позиционных) аргументов тоже.

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
3 голосов
/ 30 августа 2010

Существует также functools.partial:

from functools import partial

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

Это создаст две нужные функции.Требуется Python 2.5 или выше.

...