gpt4 book ai didi

python - 为什么不能同时将 args 和仅关键字参数与 *args 和 **kwargs 混合

转载 作者:行者123 更新时间:2023-12-04 08:44:02 26 4
gpt4 key购买 nike

*args 和 **kwargs 在 python 中的用法对我来说很清楚,SO 中有很多问题(例如 Use of *args and **kwargsWhat does ** (double star/asterisk) and * (star/asterisk) do for parameters?)。
但我想了解的一件事是:为什么不能同时定义强制位置参数、强制 kwarg 参数并最终仍然允许捕获其他 args 和 kwargs,如 cant_do_that以下?

def one_kwarg_is_mandatory(*, b, **kwargs):
print(b)
for key, value in kwargs.items():
print(key, value)

def one_pos_arg_and_one_kwarg_are_mandatory(a, *, b, **kwargs):
print(a, b)
for key, value in kwargs.items():
print(key, value)

# I wanted a mandatory arg (a) and possibly parse other args (*args),
# then a mandatory kwarg (b) and eventually other kwargs (**kwargs)
def cant_do_that(a, *args, *, b, **kwargs):
print(a, b)
print(args)
for key, value in kwargs.items():
print(key, value)

# not really interested on this because "b" must be a kwarg and hiding
# it under **kwargs would not be explicit enough for my customer (sometimes myself ;))
def could_do_this_but(a, b, *args, **kwargs):
print(a, b)
print(args)
print(kwargs)
是的,可以摆脱 bcould_do_this_but函数的签名,执行(例如) kwargs.get("b", None)在函数顶部,如果找到则引发一些适当的错误 None ...但是在函数签名上直接使用“b”将允许使用该函数进行更快、更明确的代码开发。

最佳答案

正确的语法是 def cant_do_that(a, *args, b, **kwargs): .请注意 *仅使用一次,既用于标记位置参数的结尾,也用于设置可变参数位置参数的名称。
*function definition is syntactically unique在位置或关键字和仅关键字参数之间的分离处:

parameter_list_starargs   ::=  "*" [parameter] ("," defparameter)* ["," ["**" parameter [","]]]
| "**" parameter [","]
总之,语法 "*" [parameter]意味着 **args在语法上是一样的——文字 *和可选名称——可能只出现一次。使用裸机 *开始仅关键字参数而不采用可变参数位置参数,并使用命名 *args以可变参数位置参数开始仅关键字参数。

If the form “*identifier” is present, it is initialized to a tuplereceiving any excess positional parameters, defaulting to the emptytuple. [...] Parameters after “*” or “*identifier” are keyword-onlyparameters and may only be passed used keyword arguments.

关于python - 为什么不能同时将 args 和仅关键字参数与 *args 和 **kwargs 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64423083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com