首页 > 解决方案 > 关于在 Python 中将参数传递给函数的位置和关键字方式的一些疑问

问题描述

我在与认证相关的练习中有以下问题。

我有这个简单的功能:

def fun(a,b):
    return a + b

由以下人员调用:

res = fun(1,2)

在学习材料上,对“传递参数的方式是什么”这个问题给出以下答案:关键字

我认为这个答案是错误的,因为根据:https ://www.techbeamers.com/python-function/

关键字方式应该暗示这样的事情:

res = fun(a=1, b=2)

我的推理正确吗?

其他选项是:

我的想法是在这种情况下是位置的。

是我的推理正确还是我遗漏了什么?

标签: pythonpython-3.x

解决方案


到目前为止,教程给出的答案是正确的,它们都是位置参数关键字参数。考虑以下示例:

>>> def f(a,b):
        print(a) 
>>> f(2,3)
2
>>> f(b=3, a=2)
2

来自Python 词汇表(参数)

函数(或方法)定义中的命名实体,它指定函数可以接受的参数(或在某些情况下,参数)。有五种参数:

  • positional-or-keyword:指定可以按位置或作为关键字参数传递的参数。这是默认类型的参数,例如下面的 foo 和 bar:

    def func(foo, bar=None): ...

  • 仅位置:指定只能由位置提供的参数。Python 没有用于定义仅位置参数的语法。但是,一些内置函数具有仅位置参数(例如 abs())。

  • 仅关键字:指定只能由关键字提供的参数。仅关键字参数可以通过在它们之前的函数定义的参数列表中包含单个 var-positional 参数或 bare*来定义,例如下面的 kw_only1 和 kw_only2:

    def func(arg, *, kw_only1, kw_only2): ...

在其他意义上,“位置”也总是正确的——因为关键字参数被评估为“幕后”的位置参数。来自Python 语言参考(调用)

如果存在关键字参数,它们首先被转换为位置参数,如下 [...]

相同的文档还给出了位置参数但不是关键字参数的示例:

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


推荐阅读