我想做的是:
award_dict = {
"url" : "http://facebook.com",
"imageurl" : "http://farm4.static.flickr.com/3431/3939267074_feb9eb19b1_o.png",
"count" : 1,
}
def award(name, count, points, desc_string, my_size, parent) :
if my_size > count :
a = {
"name" : name,
"description" : desc_string % count,
"points" : points,
"parent_award" : parent,
}
a.update(award_dict)
return self.add_award(a, siteAlias, alias).award
但是如果我觉得这个函数真的很笨重,我宁愿这样做:
return self.add_award({
"name" : name,
"description" : desc_string % count,
"points" : points,
"parent_award" : parent,
}.update(award_dict), siteAlias, alias).award
为什么update不返回对象,这样你就可以链接?
JQuery这样做是为了进行链接。为什么它在python中是不可接受的?
发布于 2009-09-21 05:29:52
按照惯例,Python的API区分了过程和函数。函数从它们的参数(包括任何目标对象)计算出新值;过程修改对象并且不返回任何东西(即它们返回None)。所以过程有副作用,函数没有。update是一个过程,因此它不返回值。
这样做的动机是,否则,你可能会得到不想要的副作用。考虑一下
bar = foo.reverse()
如果reverse (就地反转列表)也会返回列表,用户可能会认为reverse返回一个分配给bar的新列表,而不会注意到foo也会被修改。通过使反向返回为None,他们立即认识到条形不是反向的结果,并将更接近反向的效果。
发布于 2018-11-14 23:27:02
这很简单,因为:
(lambda d: d.update(dict2) or d)(d1)
或者,如果不修改字典很重要:
(lambda d: d.update(dict2) or d)(d1.copy())
发布于 2012-05-24 12:50:14
>>> dict_merge = lambda a,b: a.update(b) or a
>>> dict_merge({'a':1, 'b':3},{'c':5})
{'a': 1, 'c': 5, 'b': 3}
注意,除了返回合并的dict之外,它还就地修改了第一个参数。所以dict_merge( a,b)会修改a。
当然,您也可以全部内联完成:
>>> (lambda a,b: a.update(b) or a)({'a':1, 'b':3},{'c':5})
{'a': 1, 'c': 5, 'b': 3}
https://stackoverflow.com/questions/1452995
复制相似问题