s = set([1,2,3])
我应该优雅地执行以下操作:
a.update(s).update(s)
我没有像我想的那样工作set([1,2,3,1,2,3,1,2,3])
所以我在徘徊,Python 是否提倡这种可链接的做法?
set.update()
返回None
,所以你不能像这样链接更新
Python 中的通常规则是变异的方法不返回对象
与不可变对象上的方法形成对比,后者显然必须返回一个新对象,例如str.replace()
可以链接的对象
这取决于。
修改对象的方法通常会返回None
,因此您不能像这样调用一系列方法:
L.append(2).append(3).append(4)
并希望有同样的效果:
L.append(2)
L.append(3)
L.append(4)
您可能会得到一个,AttributeError
因为第一次调用append
返回None
并且None
没有append
方法。
创建新对象的方法返回该对象,例如:
"some string".replace("a", "b").replace("c", "d")
完全没问题。
通常不可变对象返回新对象,而可变对象返回,None
但这取决于方法和特定对象。
无论如何,它肯定不是语言本身的特性,而只是实现方法的一种方式。可链接方法可以用任何语言实现,因此“python 方法是否可链接”这个问题没有多大意义。唯一合理的问题是“python 方法是否总是/被迫/等可链接?”,这个问题的答案是“否”。
在您的示例set
中只能包含唯一项目,因此您显示的结果没有任何意义。您可能想使用一个简单的list
.
并且update
方法不会返回一个set
,而是一个None
值。
所以,你不能update
在链上调用另一个方法NoneType
所以,这无论如何都会给你错误..
a.update(s).update(s)
但是,因为 aSet
只能包含unique
值。所以,即使你update
在不同的线路上分开,你也不会得到Set
你想要的..
是的,您可以在 Python 中链接方法调用。至于这是否是一种好的做法,有许多图书馆提倡使用链式调用。例如,SQLAlchemy 的教程广泛使用了这种编码风格。您经常会遇到代码片段,例如
session.query(User).filter(User.name.in_(['Edwardo', 'fakeuser'])).all()
一个明智的指导方针是问问自己它是否会使代码更易于阅读和维护。始终努力使代码可读。
我写了一个简单的例子,可链接的方法应该总是返回一个对象,比如self
,
class Chain(object):
"""Chain example"""
def __init__(self):
self._content = ''
def update(self, new_content):
"""method of appending content"""
self._content += new_content
return self
def __str__(self):
return self._content
>>> c = Chain()
>>> c.update('str1').update('str2').update('str3')
>>> print c
str1str2str3