你能在一条线上调用多种方法吗?

时间:2015-03-02 12:43:16

标签: python python-2.7 python-3.x

例如我想:

texta = text.lower()
textacopy1 = texta.replace(string.punctuation, ' ')
textacopy2 = textacopy1.split(' ')

在没有分配多个变量的情况下,是否有更简洁的方法?

如果2.7和3.x之间存在差异,我更倾向于3.x解释。

4 个答案:

答案 0 :(得分:12)

result = text.lower().replace(string.punctuation, ' ').split(' ')

伟大的python带来了很大的责任:不要滥用这个功能!

PEP 8中编写的规范最大行长度为80个字符, 分割方法链的规范方法是在点开始新行:

result = text.lower().replace(string.punctuation, ' ')
        .split(' ')

答案 1 :(得分:2)

你可以使用一个变量,你不必使用多个变量,这可能会导致混淆。代码也会更清晰。你也可以在一行中完成。

text = text.lower()
text = text.replace(string.punctuation, ' ')
text = text.split(' ')

你也可以在一行中完成

text = text.lower().replace(string.punctuation, ' ').split(' ')

答案 2 :(得分:1)

使用正则表达式,它甚至更清晰

    In [132]: split_str = re.compile(r'[{} ]+'.format(string.punctuation))

    In [133]: split_str.split("You can do it with one variable you don't have to use multiple variable which can cause confusion. Also code will be much cleaner. You can do it in one line also.")
    Out[133]: 
    ['You',
     'can',
     'do',
     'it',
.....
     'in',
     'one',split_string = 
     'line',
     'also',
     '']

答案 3 :(得分:0)

问题是-它适用于不可变的对象,例如使用字符串,因为每次调用都会返回一个新对象。

'Hello'.lower().replace('ell', '') # 'ho'

但是它可能不适用于可变对象,例如列表,字典,用户定义的对象,因为这些方法通常返回None。

{1: 'chicken', 2: 'duck'}.update({3: 'goose'}) # None
#                         dict gets lost here

所以我想出了一个解决方案。

获取可变对象>执行方法>返回对象。

a = take([1, 2, 3]).append(4).extend([5, 6]).unwrap()
# a = [1, 2, 3, 4, 5, 6]

b = take({1: 'chicken', 2: 'duck'}).update({3: 'goose'}).update({4: 'moose'}).unwrap()
# b = {1: 'chicken', 2: 'duck', 3: 'goose', 4: 'moose'}

代码:

class take:
    class mockmeth:
        def __init__(self, name, taken):
            self.name = name
            self.bounded = getattr(taken.obj, name)
            self.taken = taken

        def __call__(self, *args, **kwargs):
            self.bounded(*args, **kwargs)
            return self.taken

    def __init__(self, obj):
        self.obj = obj

    def __getattr__(self, name):
        return self.mockmeth(name, self)

    def unwrap(self):
        return self.obj

Github代表:https://github.com/phantie/one-line_methods