python方法是否可链接?

时间:2012-10-11 12:59:04

标签: python chainable

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

我应该优雅地做以下事情:

a.update(s).update(s)

我没有按照我的想法制作包含set([1,2,3,1,2,3,1,2,3])

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

5 个答案:

答案 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会返回NoneNone没有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
相关问题