s = set([1,2,3])
我应该优雅地做以下事情:
a.update(s).update(s)
我没有按照我的想法制作包含set([1,2,3,1,2,3,1,2,3])
所以我在徘徊,Python是否提倡这种可连接的做法?
答案 0 :(得分:1)
set.update()
会返回None
,因此您无法将更新链接起来
Python中的通常规则是mutate的方法不返回对象
与不可变对象上的方法形成对比,显然必须返回一个可以链接的新str.replace()
对象
答案 1 :(得分:1)
取决于。
修改对象的方法通常返回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方法是/ etc。可链接的?”,这个问题的答案是“否”。
在您的示例中,set
只能包含唯一的项目,因此您显示的结果没有任何意义。您可能想要使用简单的list
。
答案 2 :(得分:0)
并且update
方法不会返回set
,而是返回None
值。
因此,您无法在update
NoneType
所以,这无论如何都会给你错误..
a.update(s).update(s)
但是,由于Set
只能包含unique
个值。因此,即使您将update
分隔在不同的行上,也不会得到您想要的Set
..
答案 3 :(得分:0)
是的,您可以在Python中链接方法调用。至于它是否是一种好的做法,那里有许多图书馆主张使用链式电话。例如,SQLAlchemy的tutorial广泛使用了这种编码风格。您经常遇到像
这样的代码段session.query(User).filter(User.name.in_(['Edwardo', 'fakeuser'])).all()
采用明智的指导方针是问自己是否会使代码更易于阅读和维护。始终努力使代码可读。
答案 4 :(得分:0)
我写了一个简单的例子,可链式方法应该总是返回一个对象,比如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