【问题标题】:Knowing that functions do not accept named argument from docstring知道函数不接受来自文档字符串的命名参数
【发布时间】:2021-08-14 21:19:48
【问题描述】:

你会的,

我很困惑如何我应该知道一个函数是否可以接受来自文档字符串的命名参数。这是一个例子:

from functools import reduce
?reduce

从这个文档中,我的直觉是使用这样的函数:

reduce(
   function = lambda x, y: x+y, 
   sequence = [1, 2, 3, 4, 5]
   )

但是,我们得到:

我怎么知道文档字符串会发生这种情况?来自另一种语言,似乎文档告诉我这两个争论被称为functionsequence

谢谢

【问题讨论】:

标签: python docstring


【解决方案1】:

我不知道为什么在 document 和 "reduce" __docs__ 中都没有,它没有说明 这。通常通过查看签名是如何判断函数不接受关键字参数的:

def fn(a, b, /):
    pass

这里是/,因为函数签名中的最后一个参数表示参数ab 必须通过“位置”传递。 (因为他们在/之前)

此外,我们还有* 参数,它告诉它后面的下一个参数应该作为关键字参数传递。

你可以像这样混合它们:

def fn(a, /, b, *, c):
    pass

fn(10, 20, c=30)   # acceptable
fn(10, b=20, c=30) # acceptable

【讨论】:

  • 这对我来说很奇怪,但我很欣赏这个答案。我认为根据您的描述 fn(10, 20, 30) 是不可接受的
  • @svenhalvorson 正是因为,c 必须是关键字参数。
【解决方案2】:

一般来说,没有严格的规定(据我所知)。文档不能引发语法错误:)

有一个标记,*,表示它后面的所有参数都只是关键字参数,它是这样的:

func(arg1, arg2, *, kwarg1, kwarg2)

它不仅用于文档,还用于真正的可调用函数。您也可以将其合并到您自己的定义中。

在文档字符串中包含这种模式也很常见:

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)。我建议查看answer 了解更多信息。

【讨论】:

  • 嗯,这很有趣。我没有看到(或注意到)* 被用作占位符。谢谢
  • @svenhalvorson 有趣的事情,我自己几天前才知道。不客气!
【解决方案3】:

“关键字参数”、“可选参数”和“位置参数”在 Python 中有所不同。

使用它们的函数示例是(来自 python doc): sorted(iterable, *, key=None, reverse=False)

这里的参数iterable 是一个位置参数,这意味着你只需要将你的可迭代对象提供给函数:它类似于sorted(my_list)。这些参数是强制性的。

其他参数称为关键字参数,因为它们可以使用关键字指定。如果你愿意,你可以只给其中一个。如果不指定关键字,则参数的顺序是定义中给出的顺序。

例如,如果您想以相反的顺序对列表进行排序,您可以编写:sorted(my_list, reverse=True)。写 sorted(my_list, True) 不会给你一个按相反顺序排序的列表。

回到你的例子,你的函数接受两个位置参数和一个可选参数(虽然可选参数不是关键字参数)。所以你只需要写:
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]).

PS:所有位置参数必须在使用关键字参数之前指定,否则会引发错误

【讨论】:

    【解决方案4】:

    这是你需要的吗?

    reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
    

    【讨论】:

    • 他们不是在问如何使用reduce,而是在问如何在以reduce 为例的一般情况下解释文档。
    • 如果一个人阅读了整个文档字符串,那么“函数”和“序列”的含义应该很明显。我仍然不确定是什么问题。
    • 问题是“如何从文档字符串中确定函数是否需要位置参数或关键字参数”,reduce 作为具有似乎没有指定文档字符串的函数的示例给出但需要一种类型的实现。这与reduce 的具体含义或reduce 的论点无关。
    猜你喜欢
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2017-05-28
    相关资源
    最近更新 更多