像在Ruby中一样将Python中的方法链接在一起

时间:2016-07-06 12:55:42

标签: python ruby

在Ruby中,可以将方法链接在一起:

a = [2,3,1]
b = a.sort.reverse

将变量b的值设置为[3,2,1],同时使a保持不变。

我想在Python中执行类似的操作。到目前为止,我找到的最短的方法是:

import copy
a = [2,3,1]
b = copy.copy(a)
b.sort()
b.reverse()

也就是说,用5行代码而不是2行。真的没有更简单的方法吗?

2 个答案:

答案 0 :(得分:4)

澄清:原始答案如下。如评论所述,问题在于链接一般,而不是在任何特定情况下。在这个答案的最后可以找到对此的澄清。

你可以直接写下来。

a = [2,3,1]
b = sorted(a, reverse=True)

即使你只想使用方法,你也可以这样做:

a = [2,3,1]
b = a.copy()  # a[:] in python2
b.sort(reverse=True)

Python倾向于对隐式克隆相当挑剔。复制引用很便宜,复制对象很昂贵。由于许多python类型是可变的,因此当事务被克隆(或不克隆)时,很容易引入细微的错误。因此,大多数接口都需要您明确地克隆东西。

python中的链接方法是可行的。但是,链仅适用于先前方法(或函数)调用的返回对象。

基本上,链接方法调用就像链接函数。

foo = they.method.method.method()
foo = my_func(your_func(their_func()))

让我们考虑一下[2,3,1].sort().reverse()。这实际上等同于以下内容:

a = [2,3,1]
b = a.sort()
c = b.reverse()

由于s.sort()返回None,第三行会调用None.reverse() - 这是None未定义的。

不可变类型通常在这里表现得更好。例如,无法在原地修改字符串 - 它们的方法返回新字符串。因此,

s = "ab:cd".upper().center(20).partition(':')
print(s)

给出(' AB', ':', 'CD ')

答案 1 :(得分:0)

为了链接方法,我可以建议如下。虽然可能不被认为是好的蟒蛇:-)。

a = [2,3,1]
[eval('a.'+f+'()') for f in ['sort', 'reverse']]

请注意,这与处理原始对象而不是副本的方法无关。