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)
希望这可以帮助。干杯。
这个表达:
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,如果你尝试用比其他关键字参数来调用它screen,clock或active。
一个警告是,如果你真的想说debug.update(screen = None),那么这样称呼它实际上没有任何作用;它没有设置debug.screen为None. 解决这个问题的一种方法是将其写在文件的顶部:
_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 - 无
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)
我倾向于第二种方式。倾斜了!