Python 知道函数不接受docstring中的命名参数
他会的 我不知道如何知道函数是否可以接受docstring中的命名参数。以下是一个例子:Python 知道函数不接受docstring中的命名参数,python,docstring,Python,Docstring,他会的 我不知道如何知道函数是否可以接受docstring中的命名参数。以下是一个例子: from functools import reduce ?reduce 根据本文档,我的直觉是使用如下函数: reduce( function = lambda x, y: x+y, sequence = [1, 2, 3, 4, 5] ) func(arg1, arg2, *, kwarg1, kwarg2) 然而,我们得到: 我怎么能从文档串中知道这会发生?来自另一种语言
from functools import reduce
?reduce
根据本文档,我的直觉是使用如下函数:
reduce(
function = lambda x, y: x+y,
sequence = [1, 2, 3, 4, 5]
)
func(arg1, arg2, *, kwarg1, kwarg2)
然而,我们得到:
我怎么能从文档串中知道这会发生?来自另一种语言,文档似乎告诉我这两个参数被称为function
和sequence
谢谢这是你需要的吗
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
一般来说,没有严格的规则(据我所知)。文档无法引发语法错误:) 有一个标记,
*
,表示它后面的所有参数都是关键字参数,如下所示:
reduce(
function = lambda x, y: x+y,
sequence = [1, 2, 3, 4, 5]
)
func(arg1, arg2, *, kwarg1, kwarg2)
它不仅在文档中使用,而且在真正的可调用函数中使用。您还可以将其合并到自己的定义中
在docstring中使用此模式也是很常见的:
func(arg1, arg2, arg3=default_value, **kwargs)
# kwarg_a: description of kwarg_a
# kwarg_b: description of kwarg_b
# kwarg_c: description of kwarg_c
所以,这里有一些指导方针。通常,我们可以假设参数是位置性的,除非明确注明为关键字(例如在您的示例中使用reduce
)。我建议查看此项以了解更多信息。我不知道为什么在“reduce”和“reduce”中都没有显示
这通常,通过查看签名,可以判断函数不接受关键字参数:
def fn(a, b, /):
pass
这里是/
,因为函数签名中的最后一个参数表示参数a
和b
必须传递“位置”。(因为它们在/
之前)
此外,我们还有*
参数,它告诉我们应该将它后面的下一个参数作为关键字参数传递
你可以像这样混合它们:
def fn(a, /, b, *, c):
pass
fn(10, 20, c=30) # acceptable
fn(10, b=20, c=30) # acceptable
在Python中,“关键字参数”、“可选参数”和“位置参数”之间存在差异 使用它们的函数示例如下(来自python文档):
sorted(iterable,*,key=None,reverse=False)
这里的参数iterable
是一个位置参数,这意味着您只需将iterable赋给函数:它类似于sorted(my_list)
。这些论点是强制性的
其他参数称为关键字参数,因为它们可以使用关键字指定。如果你愿意,你只能送一个。如果不指定关键字,则参数的顺序为定义中给定的顺序
例如,如果您想以相反的顺序对列表进行排序,您可以写:sorted(my_list,reverse=True)
。编写sorted(my_list,True)
不会给您一个按相反顺序排序的列表
回到示例,函数接受两个位置参数和一个可选参数(可选参数不是关键字参数)。所以你只需要写:
reduce(λx,y:x+y[1,2,3,4,5])
PS:在使用关键字参数之前,必须指定所有位置参数,否则会引发错误他们不是问如何使用
reduce
,而是问如何在一般情况下解释文档,并以reduce
为例。如果一个人阅读整个文档字符串,那么应该很明显是什么“function”和“sequence”的意思是。我仍然不确定问题出在哪里。问题是“如何从docstring确定函数需要位置参数还是关键字参数?”“,其中reduce
是一个函数示例,该函数的docstring似乎没有指定,但实现需要一种类型。具体来说,这与reduce
或reduce
参数的含义无关。您可以看到,您可以将函数名(例如,add_two_number或其他)作为第一个参数传递。请查看此url。嗯,那很有趣。我没有看到(或注意到)*
被用作占位符。Thanks@svenhalvorson有趣的是,我自己几天前才知道。不客气!这在我看来很奇怪,但我很感激你的回答。我假设从你的描述来看,fn(10,20,30)
不会acceptable@svenhalvorson正是因为,c
必须是关键字参数。