繁体   English   中英

什么是订购对象方法而不用的最pythonic方式

[英]Whats the most pythonic way to order calls to an objects methods without

当您为开发人员提供“ robs_numbers”对象时,开发人员可以按所需的任何顺序调用各种过滤器,例如obj.filter1()。filter2()。filtern()。

但是,通常我越早过滤掉的数字越多,过滤速度就越快。

我希望开发人员能够以他们想要的任何顺序调用filter()方法 然后,开发人员返回一个robs_numbers对象(或者可能是可迭代的..)。 但是,我希望我的方法(过滤器)实际上按照priority()给出的顺序运行。

从技术上讲,priority()应该使用成对过滤器:[args],以便我可以使用任何过滤器。 priority()然后将返回优先级值

这是一些示例代码,尽管如果使用的是Pythonic,则可以完全更改对象:

from random import randint
data = [randint(0,100) for i in range(100)]

class robs_numbers():
    def __init__(self,numbers,_min,_max):
        self.numbers = iter(numbers)
        self._min = _min #approx
        self._max = _max #approx

    def bigger(self,x):
        print "priority = ", self.priority(x)
        return robs_numbers([i for i in self.numbers if i>x],x,self._max)

    def smaller(self,x):
        print "priority = ", self.priority(x)
        return robs_numbers([i for i in self.numbers if i<x],self._min,x)

    def order(self,backwards=False):
        print "priority = ", self.priority()
        self.numbers = iter(sorted(self.numbers,reverse=backwards))
        return self

    # ...
    # More filter methods
    # ...

    def priority(self,x=None):
        #works out the order methods should be called to increase efficiency
        if x is None:
            return 99999
        else:
            return abs(x-(self._max-self._min)/2)

和两个有效用法的示例,但是我希望它们都很快,现在只有一个有效:

def get():
    return robs_numbers(data,0,100)

rf = get().bigger(80).smaller(90).order() #faster in this order
print list(rf.numbers), rf._min, rf._max

#priority =  30
#priority =  80
#priority =  99999
#[81, 81, 82, 83, 85, 86, 87, 87, 89] 80 90


rf = get().order().smaller(90).bigger(80) #slower in this order
print list(rf.numbers), rf._min, rf._max
#priority =  99999
#priority =  40
#priority =  35
#[81, 81, 82, 83, 85, 86, 87, 87, 89] 80 90

您将必须创建某种延迟评估的查询集,并且仅在开发人员调用list()或需要您将数据导出到另一个对象的其他操作时才执行所有过滤器。 Django在其lazy查询集中有一个很好的例子。

因此,您可以写一些有关

class RobsNumbers(object):
    def __init__(self, numbers, min, max):
        self._numbers = numbers
        self._min = min
        self._max = max
        self._filters = []

    def bigger(self, x):
        new_obj = RobsNumbers(self._numbers, x, self._max)
        new_obj._filters = self._filters + [GreaterThanFilter(x)]
        return new_obj

    # Other filter methods simply add a filter to the _filters list of the object

    def __iter__(self):
        # Here is the complicated optimization logic to reorder and execute the filters
        pass

请注意,此代码执行零过滤,直到开发人员要求获取RobsNumbers对象中包含的数据RobsNumbers ,因此这是相当懒惰的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM