【问题标题】:nargin functionality (from Matlab) in PythonPython 中的 nargin 功能(来自 Matlab)
【发布时间】:2018-07-18 16:56:24
【问题描述】:

我正在尝试翻译这些代码行:

error(nargchk(3, 4, nargin))
if nargout > 2, error('too many output parameters'); end

我想把它翻译成 Python。我还没有找到错误的等价物(尽管我也许可以在这里抛出一个异常?),nargchk 和 nargin。任何人都可以提供有关如何翻译这行代码的任何输入吗?

【问题讨论】:

  • 您是否阅读了 MATLAB 文档以了解您不确定的函数?尝试翻译 functionality 而不是 functions
  • 如果你认为varargin等价*args,那么nargin可以在Python中翻译len(args) .

标签: python matlab


【解决方案1】:

没有与narginnargchk 等价的东西,因为Python 不需要它。您可以在 Python 中直接在函数定义中定义可选参数。比如:

def myfunc(a=1, b=3):

在这种情况下,它允许您将ab 设置为您想要的任何值,但如果您不定义它们,它会使用您指定的默认值。因此,如果您调用myfunc(),它会将a 设置为1,并将b 设置为3。如果您调用myfunc(5),它会将a 设置为5,并将b 设置为3。也可以通过名字调用,比如myfunc(b=10),将a设置为1b设置为10。

如果您希望参数是必需的,请不要在函数定义中为它们分配任何内容。因此在以下情况下,a 是必需的,而 b 是可选的:

def myfunc(a, b=3):

如果您希望用户能够指定任意数量的参数,您可以使用*args(其中args 可以是您想要的任何变量。所以这个:

def myfunc(a=1, b=3, *args):

将第一个参数分配给a,将第二个参数分配给b,并将任何剩余的参数分配给args。您也可以使用**kwargs(同样,kwargs 可以是任何变量名称)对名称定义的参数执行此操作。所以这个:

def myfunc(a=1, b=3, *args, **kwargs):

与前一个执行相同的操作,但除ab 之外的名称提供的任何参数都将进入kwargs(这是一个字典)。

因此您不需要narginnargchk,通常您只需定义所需的参数并为可选参数设置默认值即可。然后 Python 将自动处理检查以确保指定了所需的选项并且没有提供太多参数。如果您需要捕获任意数量的附加参数,只需使用*args**kwargs,您可以自己检查len 是否正确。

对于nargout,没有python 等效项,因为python 要求处理所有输出。所以如果你做return a, b,在myfunab都必须处理。你可以简单地忽略一些,但你必须明确地这样做。没有简单的方法可以检查这些参数是否被忽略。所以说我们在myfunc中有这个:

return a, b, c, d

而你只想要a,你可以这样做:

a, *_ = myfunc()

这会将第一个返回值放入a,并将剩余的值转储到丢弃变量_(就像*args 捕获所有剩余的参数,*_ 捕获所有剩余的输出)。例如,ac,您可以这样做:

a, _, c, _ = myfunc()

您也可以直接从函数调用中建立索引,这是 MATLAB 不允许的。所以这也是可能的。所以要得到第一个参数,你可以这样做:

a = myfunc()[0]

因此,由于在 Python 中很容易获得所需的返回值,并且由于输出值的隐式变量数量很难正确处理,因此 Python 不支持它。如果你真的想改变输出参数的数量,你可以在函数定义中设置一个可选的命名参数来做到这一点。由于可选参数在 Python 中很简单,因此这不是一个大问题。但通常不需要。

至于错误,是的,您只需 raise 适当的异常。对于不同的情况,Python 有不同类型的错误。 raise TypeError('blah') 是错误数量参数的正确方法,其中 blah 是您想要的消息。

【讨论】:

  • 有 Matlab 的背景,但对 Python 知之甚少,我发现您的回答非常有用,+1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多