Python中的nargin功能(来自Matlab)

4

我正在尝试翻译以下代码:

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

我想将它翻译成Python。尽管可以在这里抛出异常,但我还没有找到错误的等效语句(?),nargchk和nargin。是否有人可以提供任何关于如何翻译这行代码的输入?


你是否阅读了那些你不确定的 MATLAB 函数的文档?尽量翻译“功能”而不是“函数”。 - Wolfie
如果你认为 varargin 的等价物是 *args,那么在 Python 中,nargin 可以被翻译成 len(args) - Kefeng91
1个回答

12

Python没有类似于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设置为1,将b设置为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,在myfun中,必须同时处理ab。您可以简单地忽略一些内容,但必须明确说明。没有简单的方法来检查是否正在忽略这些参数。因此,假设我们在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是你想要的消息。

3
我背景是Matlab,但对Python知之甚少,我发现你的回答很有启发性,点赞。 - Paolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接