当前位置:  开发笔记 > 编程语言 > 正文

Python函数中的最大参数数是多少?

如何解决《Python函数中的最大参数数是多少?》经验,为你挑选了4个好方法。

Python函数最多可以包含256个参数,这是一些常见的知识.我很想知道的是,这个限制适用于*args以及**kwargs何时以下列方式展开:

items = [1,2,3,4,5,6]

def do_something(*items):
    pass

我问,因为,假设有可能出现大于256个项目的列表作为一组*argsor 展开的情况**kwargs.



1> vartec..:

WFM

>>> fstr = 'def f(%s): pass' % (', '.join(['arg%d' % i for i in range(5000)]))
>>> exec(fstr)
>>> f

更新:正如Brian注意到的那样,限制是在主叫方:

>>> exec 'f(' + ','.join(str(i) for i in range(5000)) + ')'

Traceback (most recent call last):
  File "", line 1, in 
    exec 'f(' + ','.join(str(i) for i in range(5000)) + ')'
  File "", line 1
SyntaxError: more than 255 arguments (, line 1)

另一方面,这工作:

>>> f(*range(5000))
>>> 

结论:不,它不适用于展开的参数.


@Stefan:*为我工作*

2> 小智..:

限制是由于编译的字节码如何处理使用位置参数和/或关键字参数调用函数.

关注的字节码op是CALL_FUNCTION携带一个op_arg长度为4个字节,而对两个最低显著字节.其中,最重要的字节表示堆栈上关键字参数的数量,最低有效字节表示堆栈上位置参数的数量.因此,您最多可以拥有0xFF == 255关键字参数或0xFF == 255位置参数.

此限制不适用*args,并**kwargs因为与语法呼叫使用字节码OPS CALL_FUNCTION_VAR,CALL_FUNCTION_KW以及CALL_FUNCTION_VAR_KW取决于签名.对于这些操作码,堆栈包含一个可迭代的*args和一个dict用于**kwargs.这些项目直接传递给接收器,接收器根据需要展开它们.



3> Martijn Piet..:

在Python 3.7之前的版本中,CPython在调用中具有255个显式传递参数的限制:

>>> def f(*args, **kwargs): pass
...
>>> exec("f({})".format(', '.join(map(str, range(256)))))
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
SyntaxError: more than 255 arguments

这个限制已经存在,因为在Python 3.5之前,CALL_FUNCTION操作码重载了操作码参数,以编码堆栈上的位置和关键字参数的数量,每个参数都编码在一个字节中.

在即将发布的Python 3.7版本中删除了此限制,请参阅问题#27213和问题#12844 ; #27213重新设计了CALL_FUNCTION*操作码系列的性能和简单性(3.6的一部分),释放操作码参数只编码一个参数计数,#12844删除了编译时检查,阻止了编译更多参数的代码.

在3.7中,使用EXTENDED_ARG()操作码,现在对使用显式参数传递的参数数量没有任何限制,保存可以装入堆栈的数量(现在由内存绑定):

>>> import sys
>>> sys.version_info
sys.version_info(major=3, minor=7, micro=0, releaselevel='alpha', serial=2)
>>> def f(*args, **kwargs): pass
...
>>> exec("f({})".format(', '.join(map(str, range(256)))))
>>> exec("f({})".format(', '.join(map(str, range(2 ** 16)))))

请注意,列表,元组和字典仅限于sys.maxsize元素,因此如果被调用函数使用*args和/或**kwargs捕获所有参数,那么这些参数有限的.

对于*args**kwargs调用语法(扩展参数),除了sys.maxintPython标准类型的相同大小限制之外没有其他限制.



4> Brian..:

这似乎是编译源代码的限制,因此可能只存在于直接传递的参数,而不是*args或**kwargs.

相关代码可以在ast.c中找到:

if (nargs + nkeywords + ngens > 255) {
  ast_error(n, "more than 255 arguments");
  return NULL;
}

但请注意,这是在ast_for_call中,因此仅适用于主叫方.即f(a,b,c,d,e...),而不是定义,但它将计算位置(a,b,c,d)keyword (a=1, b=2, c=3)样式参数.实际*args**kwargs参数看起来在调用方面只应作为一个参数用于这些目的.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有