用 **kwargs 解释 get() 方法?

Taz*_*z B 9 python methods keyword-argument

试图弄清楚这段代码是如何工作的。

我知道**kwargs返回一个字典,该get()函数在字典中搜索给定的键,如果没有找到则返回一个默认值。但是在代码中我不明白该get()方法是否正在搜索例如:“clock”或 self.clock 或两者。

def update(self, *args, **kwargs):
    self.screen = kwargs.get("screen",self.screen)
    self.clock = kwargs.get("clock",self.clock)
    self.active = kwargs.get("active",self.active)
Run Code Online (Sandbox Code Playgroud)

这是对此方法的示例调用:

debug.update(active = numActive)
Run Code Online (Sandbox Code Playgroud)

根据我的理解,变量numActive通过 update 方法作为活动传递,然后**kwargs通过该get()方法进行搜索。kwargs因为我知道需要多少参数,所以我不能只删除 see 的使用吗?

任何有助于理解的帮助表示赞赏。

小智 9

get 方法中的第二个参数是默认值。

根据 Python2.7 的文档:

获取(键 [,默认])

如果键在字典中,则返回键的值,否则返回默认值。如果未给出默认值,则默认为 None,因此此方法永远不会引发 KeyError。

来源:https : //docs.python.org/2/library/stdtypes.html#dict.get

解释 当您尝试从字典中“获取”某些内容时,如果找不到键,或者值为 None,它将返回 None。

但是,如果您提供第二个参数(这是默认值),当且仅当找不到键时,才会返回默认值。

没有默认值的示例

对于以下代码:

some_dict = {
    "key_1": 1,
    "key_2": None,
}
print some_dict.get("key_1")
print some_dict.get("key_2")
print some_dict.get("key_3")
Run Code Online (Sandbox Code Playgroud)

你会得到输出:

1
None
None
Run Code Online (Sandbox Code Playgroud)

带有默认值的示例

对于以下代码

some_dict = {
    "key_1": 1,
    "key_2": None,
}
print some_dict.get("key_1", 1)
print some_dict.get("key_2", 2)
print some_dict.get("key_3", 3)
Run Code Online (Sandbox Code Playgroud)

你会得到输出:

1
None
3
Run Code Online (Sandbox Code Playgroud)

看着你的代码

我将在评论中解释您的代码:

def update(self, *args, **kwargs):
    # If the kwargs contain the key 'screen', the following get method will
    # return its value, or else it would remain whatever value was in 
    # self.screen's variable before
    self.screen = kwargs.get("screen",self.screen)


    # If the kwargs contain the key 'clock', the following get method will
    # return its value, or else it would remain whatever value was in 
    # self.clock's variable before
    self.clock = kwargs.get("clock",self.clock)

    # If the kwargs contain the key 'active', the following get method will
    # return its value, or else it would remain whatever value was in 
    # self.active's variable before
    self.active = kwargs.get("active",self.active)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。干杯。


Jor*_*dan 6

这个表达:

kwargs.get("screen",self.screen)
Run Code Online (Sandbox Code Playgroud)

等价于这个表达式:

kwargs["screen"] if "screen" in kwargs else self.screen
Run Code Online (Sandbox Code Playgroud)

这个说法:

self.screen = kwargs.get("screen",self.screen)
Run Code Online (Sandbox Code Playgroud)

相当于这些语句:

if "screen" in kwargs:
    self.screen = kwargs["screen"]
else:
    self.screen = self.screen
Run Code Online (Sandbox Code Playgroud)

请注意,它等同于以下语句:

if "screen" in kwargs:
    self.screen = kwargs["screen"]
Run Code Online (Sandbox Code Playgroud)

因为声明

self.screen = self.screen
Run Code Online (Sandbox Code Playgroud)

引发一个尚未定义的AttributeErrorif self.screen。通过运行以下程序查看该错误:

d = {}
x = object()
x.attr = d.get("attr", x.attr)
Run Code Online (Sandbox Code Playgroud)

您可以kwargs通过实施update来取消:

def update(self, screen=None, clock=None, active=None):
    if screen is not None: self.screen = screen
    if clock is not None: self.clock = clock
    if active is not None: self.active = active
Run Code Online (Sandbox Code Playgroud)

然后您可以调用debug.update并指定您想要的任何关键字参数。定义这种方式有它提出了一个优势TypeError,如果你尝试用比其他关键字参数来调用它screenclockactive

一个警告是,如果你真的想说debug.update(screen = None),那么这样称呼它实际上没有任何作用;它没有设置debug.screenNone. 解决这个问题的一种方法是将其写在文件的顶部:

_UNSPECIFIED = object()
Run Code Online (Sandbox Code Playgroud)

然后实现update为:

def update(self, screen=_UNSPECIFIED, clock=_UNSPECIFIED, active=_UNSPECIFIED):
    if screen is not _UNSPECIFIED: self.screen = screen
    if clock is not _UNSPECIFIED: self.clock = clock
    if active is not _UNSPECIFIED: self.active = active
Run Code Online (Sandbox Code Playgroud)


小智 5

kwargs.get()检索传递给函数的关键字参数。

第一个参数是关键字,第二个参数是默认值(如果没有为关键字提供参数)。

from uuid import uuid4

def my_function(**kwargs):
    id = kwargs.get("id", uuid4().hex[:6])
    name = kwargs.get("name", None)
    print(f"{id} - {name}")

my_function(name="Alice")
Run Code Online (Sandbox Code Playgroud)

a1b2c3 - 爱丽丝

my_function(name="Bob", id="d4e5f6")
Run Code Online (Sandbox Code Playgroud)

d4e5f6 - 鲍勃

my_function()
Run Code Online (Sandbox Code Playgroud)

g7h8i9 - 无


tde*_*ney 1

self.screen = kwargs.get("screen",self.screen)
Run Code Online (Sandbox Code Playgroud)

这从 中获取“屏幕”值kwargs。如果它不存在,它只会使用当前屏幕中的任何内容并将其塞回到屏幕中。它等同于

if "screen" in kwargs:
    self.screen = kwargs["screen"]
Run Code Online (Sandbox Code Playgroud)

换句话说,update仅更改作为关键字参数传递的值。这似乎是用复杂的方法来做一件简单的事情。它肯定有一个用例,但是,一般来说,令人厌恶。

难道我不能删除 kwargs 的使用吗?因为我知道需要多少个参数?

在示例中,没有。它将设置零个、一个、两个或三个属性,具体取决于它们是否在kwarg. 你甚至可以输入其他值,比如update(foo="bar")它会忽略它们。

因此,设置属性有两种方法:

debug.update(active = numActive)
debug.active = numActive
Run Code Online (Sandbox Code Playgroud)

我倾向于第二种方式。倾斜