Python中的nargout

时间:2013-01-03 21:37:00

标签: python multiple-variable-return

Python在MATLAB中是否有任何等效的nargout?如果我们想保持返回参数的数量灵活,我发现nargout是一种非常简洁的方法。有没有办法可以找出已经请求了多少输出参数?像下面的伪python代码:

def var_returns_func(a):
  """
  a is a 1D numpy array
  """
  if nargout==1: return a.sum()
  elif nargout==2: return a.sum(),a.std()

因此,如果我将此函数称为mean = var_returns_func(someNumPyarray),则应返回单个值。但如果我将其称为mean,std = var_returns_func(someNumPyarray),则应返回2个值。

有这样做的Pythonic方法吗?还是一种hacky方式?

3 个答案:

答案 0 :(得分:3)

在Matlab中,输出参数的数量实际上是函数的输入之一。在Python中并非如此,因此您设置了函数的界面以反映不同的情况。

例如,这里是一个将upper()应用于一组字符串的函数,用户可以期望输入的数量等于输出的数量。语法也与Matlab非常相似。

>>> def var_returns_f(*args):
...     return [str.upper() for str in args]
... 
>>> 
>>> a, b = var_returns_f('one', 'two')
>>> 
>>> a
'ONE'
>>> b
'TWO'

答案 1 :(得分:2)

我倾向于做的是让我的函数返回所有内容(作为元组的元素),然后只解包我需要的函数:

def my_func():
    # do stuff...
    return mean, stddev, otherstat, a, b

mu, sig, _, a, _ = myfunc()

这里我返回了所有内容,但只将第一个第二个和第四个变量分配给我将在调用范围中使用的变量。 _变量可以作为我不想要/不需要的变量的占位符。

答案 2 :(得分:2)

我有一个奇怪的主意...

def nargout():
   import traceback
   callInfo = traceback.extract_stack()
   callLine = str(callInfo[-3].line)
   split_equal = callLine.split('=')
   split_comma = split_equal[0].split(',')
   return len(split_comma)

def fun():
   this = nargout()
   if this == 1:
       return 3
   else:
       return 3, 4

a = fun()
a, b = fun()

我真的很想念Matlab:D


改进:

def nargout(*args):
   import traceback
   callInfo = traceback.extract_stack()
   callLine = str(callInfo[-3].line)
   split_equal = callLine.split('=')
   split_comma = split_equal[0].split(',')
   num = len(split_comma)
   return args[0:num] if num > 1 else args[0]

def fun(nparray):
   return nargout(np.mean(nparray), np.std(nparray))

arr = np.array([3, 4, 5])
mean = fun(arr)
mean, std = fun(arr)