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

时间:2018-04-22 02:36:48

标签: python methods kwargs

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

我理解**kwargs返回一个字典,get()函数在dict中搜索给定的键,如果找不到则返回默认值。 但是在代码中我不明白是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)

以下是对此方法的示例调用:

debug.update(active = numActive)

根据我的理解,变量numActive通过update方法作为活动传递,然后作为**kwargs传递,然后通过get()方法搜索。kwargs。我不能删除使用 Building b1 = new Building("1", "Offices", "5th Avenue", 130, 340); Building b2 = new Building("2", "Shop", "St. John", 100, 200); Building b3 = new Building("3", "Fire Station", "Weston Road", 250, 550); Building b4 = new Building("4", "Police Station", "Two Bridges Road", 700, 1000); Building b5 = new Building("5", "Restaurant", "St Nicholas Avenue", 400, 600); myBList.addBuilding(b1); myBList.addBuilding(b2); myBList.addBuilding(b3); myBList.addBuilding(b4); myBList.addBuilding(b5); ,因为我知道需要多少参数?

理解任何有助于理解的帮助。

4 个答案:

答案 0 :(得分:1)

self.screen = kwargs.get("screen",self.screen)

这会从kwargs获取“屏幕”值。如果它不在那里,它只是使用屏幕上现在发生的任何事情并将其重新填充到屏幕中。与

相同
if "screen" in kwargs:
    self.screen = kwargs["screen"]

换句话说,update仅更改作为关键字参数传递的值。这似乎是做一件简单事情的复杂方法。必须有一个用例,但一般情况下,你好。

我不能只删除使用kwargs,因为我知道需要多少参数?

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

所以,这里有两种设置属性的方法:

debug.update(active = numActive)
debug.active = numActive

我倾向于第二种方式。倾斜方式结束!

答案 1 :(得分:1)

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

根据Python2.7的文档:

  

get(key [,default])

     

如果key在字典中,则返回key的值,否则返回default。如果   默认情况下没有给出,默认为None,所以这个方法永远不会   提出了一个KeyError。

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

<强>解释 当你试图获得&#39;来自字典的东西,如果找不到密钥,或者值为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")

您将获得输出:

1
None
None

默认示例

以下代码

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)

您将获得输出:

1
None
3

查看您的代码

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

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)

希望这会有所帮助。欢呼声。

答案 2 :(得分:1)

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")
  

a1b2c3-爱丽丝

my_function(name="Bob", id="d4e5f6")
  

d4e5f6-鲍勃

my_function()
  

g7h8i9-无

答案 3 :(得分:0)

这个表达式:

kwargs.get("screen",self.screen)

等同于这个表达式:

kwargs["screen"] if "screen" in kwargs else self.screen

本声明:

self.screen = kwargs.get("screen",self.screen)

等同于这些陈述:

if "screen" in kwargs:
    self.screen = kwargs["screen"]
else:
    self.screen = self.screen

请注意,等同于这些语句:

if "screen" in kwargs:
    self.screen = kwargs["screen"]

因为声明

self.screen = self.screen
如果尚未定义AttributeError

会引发self.screen。通过运行以下程序查看该错误:

d = {}
x = object()
x.attr = d.get("attr", x.attr)

您可以通过实施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

然后你可以调用debug.update并指定你想要的任何关键字参数。以这种方式定义它的优势在于,如果您尝试使用TypeErrorscreenclock以外的关键字参数调用它,则会引发active

有一点需要注意的是,如果你真的想说debug.update(screen = None),那么这样称呼它实际上什么都不做;它没有将debug.screen设置为None。解决这个问题的一种方法是将它写在文件的顶部:

_UNSPECIFIED = object()

然后将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