0
s = set([1,2,3])

我应该优雅地执行以下操作:

a.update(s).update(s)

我没有像我想的那样工作set([1,2,3,1,2,3,1,2,3])

所以我在徘徊,Python 是否提倡这种可链接的做法?

4

5 回答 5

1

set.update()返回None,所以你不能像这样链接更新

Python 中的通常规则是变异的方法不返回对象

与不可变对象上的方法形成对比,后者显然必须返回一个新对象,例如str.replace()可以链接的对象

于 2012-10-11T13:05:15.177 回答
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 方法是否总是/被迫/等可链接?”,这个问题的答案是“否”。


在您的示例set中只能包含唯一项目,因此您显示的结果没有任何意义。您可能想使用一个简单的list.

于 2012-10-11T13:05:50.593 回答
0

并且update方法不会返回一个set,而是一个None值。
所以,你不能update在链上调用另一个方法NoneType

所以,这无论如何都会给你错误..

a.update(s).update(s)

但是,因为 aSet只能包含unique值。所以,即使你update在不同的线路上分开,你也不会得到Set你想要的..

于 2012-10-11T13:03:51.263 回答
0

是的,您可以在 Python 中链接方法调用。至于这是否是一种好的做法,有许多图书馆提倡使用链式调用。例如,SQLAlchemy 的教程广泛使用了这种编码风格。您经常会遇到代码片段,例如

session.query(User).filter(User.name.in_(['Edwardo', 'fakeuser'])).all() 

一个明智的指导方针是问问自己它是否会使代码更易于阅读和维护。始终努力使代码可读。

于 2012-10-11T13:06:52.170 回答
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
于 2012-10-11T13:07:42.703 回答