试图弄清楚这段代码是如何工作的。
我理解**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);
,因为我知道需要多少参数?
理解任何有助于理解的帮助。
答案 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
并指定你想要的任何关键字参数。以这种方式定义它的优势在于,如果您尝试使用TypeError
,screen
或clock
以外的关键字参数调用它,则会引发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