[英]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.