Python函数最多可以有256个参数,这在一定程度上是常识。我想知道的是,当*args
和**kwargs
以以下方式展开时,这一限制是否适用于它们:
items = [1,2,3,4,5,6]
def do_something(*items):
pass
我之所以这样问,是因为假设可能存在这样的情况:一个超过256个条目的列表会以一组*args
或**kwargs
的形式展开。
发布于 2018-01-02 00:46:21
在Python 3.7和更新版本中,没有限制。这是在issue #27213和issue #12844中完成的工作的结果;#27213为了性能和简单性重新编写了CALL_FUNCTION*
操作码系列(3.6中的一部分),释放了操作码参数以仅编码单个参数计数,并且#12844删除了阻止具有更多参数的代码被编译的编译时检查。
因此,从3.7开始,对于EXTENDED_ARG()
opcode,您可以使用显式参数传递的参数数量没有任何限制,除了可以放在堆栈中的参数数量(所以现在由您的内存约束):
>>> 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
捕获所有参数,则这些参数是有限的。
对于Python和**kwargs
调用语法(扩展参数),除了对*args
标准类型的相同sys.maxint
大小限制之外,没有其他限制。
在Python3.7之前的版本中,CPython在一个调用中有255个显式传递的参数的限制:
>>> def f(*args, **kwargs): pass
...
>>> exec("f({})".format(', '.join(map(str, range(256)))))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
SyntaxError: more than 255 arguments
之所以存在这种限制,是因为在Python3.5之前,CALL_FUNCTION
opcode重载了操作码参数来编码堆栈上的位置参数和关键字参数的数量,每个参数都编码在一个字节中。
https://stackoverflow.com/questions/714475
复制相似问题