在下面的python代码场景中使用kwargs正确吗?

2024-04-27 02:57:34 发布

您现在位置:Python中文网/ 问答频道 /正文

在以下场景中使用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的正确用法?。我在AmazonBoto3中看到api通常使用kwargs结构,但是。。。你知道吗


Tags: path函数noneformat参数def场景kwargs
1条回答
网友
1楼 · 发布于 2024-04-27 02:57:34

根据经验,如果可以的话,您应该总是写出函数定义中的所有参数,并且最好给它们起一个描述性的名称。你知道吗

这个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

这个列表并不详尽,但它应该给你一个大致的想法。你知道吗

相关问题 更多 >