gpt4 book ai didi

python - 在以下Python代码场景中使用kwargs是否正确?

转载 作者:太空宇宙 更新时间:2023-11-03 15:45:53 25 4
gpt4 key购买 nike

以下场景中使用 kargs 是否正确?

我有一个函数,在调用中需要五个参数,其中两个参数是可选的。所以,我可以将其删除:

def f(p1, p2, p3, p4, p5, o1=None, o2=None)

def f(**kwargs)

因为我正在使用参数做这样的事情:

orig_path = "{0}/{1}/{3}/{4}".format(p1, p2, p3, p4)

orig_path = "{p1}/{p2}/{p3}/{p4}".format(kwargs)

我不知道哪种样式是 Python 中声明中使用的正确方式。有没有任何指南可以指导 kwargs 的正确使用?我在 Amazon boto3 api 中看到通常使用 kwargs 构造,但是......

最佳答案

根据经验,如果可以的话,您应该始终写出函数定义中的所有参数,并且最好为它们提供描述性名称。

Zen of Python

Explicit is better than implicit.

还有

Readability counts.

使参数显式化可以帮助您防止许多错误,例如使用太多或太少的参数或使用不存在的关键字参数来调用函数。

它还对可读性有很大帮助,因为您可以从定义中轻松地发现函数需要多少个参数和哪些参数,以及可能的关键字参数的顺序和默认值。有时,您甚至可以通过良好的参数名称猜测该函数的功能,而无需查看文档。

某些 IDE 甚至可以在您编写调用时自动查找定义,并在您键入时提醒您可能出现的问题。

这样做:

def twiddle_knobs(tuning, volume, panning=None, bass=6.0, midrange=-2.0, treble=1.5):
"""Modify the most important radio controls."""

my_radio.modify_control(radio.TUNEFREQ, value=max(min(tuning, 120.0), 85.0))
my_radio.modify_control(radio.VOL_MASTER, value=(volume / 100.0))

if panning is not None:
my_radio.modify_control(radio.VOL_LEFT, value=min(1.0 - panning / 100.0, 1.0))
my_radio.modify_control(radio.VOL_RIGHT, value=min(1.0 + panning / 100.0, 1.0))

for control, value in ((radio.EQU_BASS, bass),
(radio.EQU_MID, midrange),
(radio.EQU_TREB, treble)):

my_radio.modify_control(control, value=value, unit=radio.DB)

不要这样做:

def twiddle_knobs(*args, **kwargs):  # WARNING: never do this!
my_radio.modify_control(radio.TUNEFREQ, max(min(args[0], 120.0), 85.0))
my_radio.modify_control(radio.VOL_MASTER, args[1] / 100.0)

if kwargs.get("panning") is not None:
my_radio.modify_control(radio.VOL_LEFT, min(1.0 - kwargs["panning"] / 100.0, 1.0))
my_radio.modify_control(radio.VOL_RIGHT, min(1.0 + kwargs["panning"] / 100.0, 1.0))

for control, param, default in ((radio.EQU_BASS, "bass", 6.0),
(radio.EQU_MID, "midrange", -2.0),
(radio.EQU_TREB, "treble", 1.5)):

my_radio.modify_control(control, kwargs.get(param, default), radio.DB)

那么什么时候可以使用*args*kwargs

  • *args 的一个用途是当您需要接收以下内容的列表时相似并具有相同的功能。不过,您也可以只需使用普通参数并让调用者显式传入列表。有时,使用 func([thing]) 调用函数看起来像是不过,这很尴尬,尤其是当你大多数时候只经过一个有事或根本没有事。这些时候 *args 会改善情况。

  • 此外,当您需要传递一些位置和/或关键字时您的函数收到的参数传递给另一个您没有收到的函数可以控制并且您不想指定哪些参数允许调用者传递,然后 *args*kwargs -在显式参数之后使用 - 是实现这一目标的方法。

  • 如果您有一组关键字参数可以有力地服务于相关的功能,你不能准确地预先定义什么关键字将是,因为它们可能依赖于某些东西动态变化,这也是使用的一个很好的理由*kwargs

此列表并不详尽,但应该可以让您有一个大概的了解。

关于python - 在以下Python代码场景中使用kwargs是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41763194/

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