Что такое максимальное количество аргументов в функции Python?

A purrr опция

library(purrr)
map_df(transpose(mylist), ~rowMeans(as.data.frame(.x), na.rm = TRUE))
 # A tibble: 2 x 2
#      x     y
#  <dbl> <dbl>
#1     2   3.5
#2     3   4  
31
задан SilentGhost 3 April 2009 в 15:45
поделиться

4 ответа

WFM

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

Обновление: как Brian заметил, предел находится на стороне вызова:

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

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

с другой стороны, это работает:

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

Заключение: нет, это не относится к развернутым аргументам.

23
ответ дан 27 November 2019 в 22:04
поделиться

для ** kwargs, Если я помню хорошо, это - словарь. Это поэтому не имеет ни о каких пределах.

для *args, я не так уверен, но я думаю, что это - кортеж или список, таким образом, это также не имеет ни о каких пределах.

Никакими пределами я имею в виду кроме, возможно, предела памяти.

1
ответ дан 27 November 2019 в 22:04
поделиться

Это, кажется, ограничение в компиляции источника, так будет, вероятно, существовать только для аргументов, передаваемых непосредственно, не в *args или ** kwargs.

Соответствующие нормы могут быть найдены в ast.c:

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

Но обратите внимание, что это находится в ast_for_call, и поэтому только applys стороне вызова. т.е. f(a,b,c,d,e...), вместо определения, хотя это будет считать обоих позиционными (a,b,c,d) и keyword (a=1, b=2, c=3) параметры стиля. Фактический *args и **kwargs параметры похожи, они должны только рассчитать как один аргумент в пользу этих целей на стороне вызова.

5
ответ дан 27 November 2019 в 22:04
поделиться

Я попробовал за список 4 000 объектов, и он работал. Таким образом, я предполагаю, что это будет работать на большие значения также.

0
ответ дан 27 November 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: