2010-08-30 71 views
1

我移植從Perl來Python的一些代碼,和我移動的功能之一執行以下操作:裹在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)); 

但這看起來有點醜。有沒有更好的辦法?

回答

5

*也可用於passing (positional) arguments

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 
+0

謝謝。我確實結束了這個: def run(cmd,other_stuff,silent = False): 有時候,在移植這個Perl的東西時,我太習慣了,不要停下來想想我該怎麼做在Python中。 – Cliff 2010-08-30 18:51:24

3

有也functools.partial:

from functools import partial 

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

這將創建你想要的兩個功能。需要python 2.5或更高版本。

相關問題