【问题标题】:Why I cannot use keyword argument on range function?为什么我不能在范围函数上使用关键字参数?
【发布时间】:2015-03-08 12:54:36
【问题描述】:

在 python 文档中,它说:

只要参数名称之一匹配,任何函数参数,无论是非可选的还是可选的(具有默认值)都可以作为关键字参数调用。但是,关键字参数必须跟在所有位置参数之后。

我试过了:

kwargs = {'step':-1, 'start':10, 'stop':5}
list(range(**kwargs))

但是python给男人一个错误:

TypeError: range() takes no keyword arguments

这是为什么?

【问题讨论】:

  • 那么现在的问题是什么?很明显range() takes no keyword arguments
  • 您在哪里找到了该文本?除了这篇文章,我找不到它的任何参考
  • 我无法在 Python 文档(包括教程)中找到任何使用您在此处引用的措辞的任何文本。能否提供一下出处?
  • 如你所知,真正的答案是 range 是一个 C 函数,由于某种原因它没有与 python 相同的规则(很高兴知道为什么)。人们可能会因为我的建议而讨厌我,但我之所以这样做是为了范围,因为我对事物的顺序有一个糟糕的记忆。 Imo 这应该不是问题,所以我正在修复它:range(*{'start':0,'stop':10,'step':2}.values())

标签: python


【解决方案1】:

range() 不是 python 函数。它是C类型; C 类型遵循不同的参数规则,range() 只接受位置参数。

Calls expressions documentation

CPython 实现细节:实现可以提供其位置参数没有名称的内置函数,即使它们是出于文档目的而“命名”的,因此无法由关键词。在 CPython 中,在 C 中实现的函数就是这种情况,使用 PyArg_ParseTuple() 来解析它们的参数。

range() 的位置参数未命名,因此不能用作关键字参数。

【讨论】:

  • 我喜欢你对这个问题的回答更好:-P
  • @jedwards:但不确定这是一个很好的重复目标。
【解决方案2】:

你现在知道,真正的答案是range 是一个 C 函数,由于某种原因它没有与 python 相同的规则(很高兴知道为什么)。

但你可以这样做:

range(*{'start':0,'stop':10,'step':2}.values())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2023-03-13
    • 2016-04-05
    相关资源
    最近更新 更多