我希望使用Model.objects.filter(...)
的django模型中使用的模式来构建跨数据的过滤器。这可能是pandas的一个很好的用例,但是在尝试之前,我更感兴趣的是改进我的python(首先)。在
如果我有以下数据:
DATA = [
{'id': 1, 'name': 'brad', 'color':'red'},
{'id': 2, 'name': 'sylvia', 'color':'blue'},
]
我想构建类似于以下内容的内容:
^{pr2}$并将objects
等效于“ModelManager”,然后从那里进行筛选,以便调用:
MyData.objects.filter(id>1)
然后得到:
[
{'id': 2, 'name': 'sylvia', 'color':'blue'}
]
当然,我可以做一些简单的事情:
res = [_ for _ in DATA if _['id'] > 1]
但我更感兴趣的是设计模式本身——这个例子的琐碎本质只是为了展示我想要实现的目标。在
什么是一个好的,基本的方法来正确地做这件事?这是django中与它相关的类:https://github.com/django/django/blob/master/django/db/models/query.py#L185。在
OP想要这样做
MyData.objects.filter(id>1)
。在让我们面对现实吧。在
问题是Python贪婪(急于计算表达式),而不像Haskell那样懒惰。
注意David Beazley - Lambda Calculus from the Ground Up - PyCon 2019有没有让人心烦意乱的东西。在
Python在调用
filter
之前计算id > 1
。如果现在可以停止求值,可以将未求值的表达式传递给filter
函数。在但是,如果我们将表达式括在函数中,则可以将表达式求值延迟到需要时。这就是我的想法。在
如果我们可以实现函数接口,它将是
filter(lambda: id > 1)
。 这个接口将是超级通用的,因为任何Python表达式都可以被传递和滥用。在实施情况
{{cdda}如果调用的是另一个函数{cdda},则调用该函数。在
如果我们可以在Python在
builtins
中找到id
之前,在查找路径的某个地方引入一个名为id
的对象,我们就可以重新定义表达式的语义。在我将用
eval
来实现它,它计算给定上下文中的表达式。在我将一个
dict.copy
传递给eval
,因为eval
修改了它的globals
对象。在在
^{pr2}$Model
类的上下文中查看它的实际操作Data
类继承自Model
。{{{cda>当从子类访问
objects
属性时,MetaManager
将一个Manager
实例返回给Model
的子类。MetaManger
标识访问类并将其传递给Manager
实例。Manager
处理对象的创建、持久化和获取。在为了简单起见,db被实现为
Manager
的类属性。在为了停止通过函数滥用全局对象,
filter
函数在未传递lambda时引发异常。在如果您想要完整的django
Model
体验,即:datapoint = MyData(name='johndoe', color='green', ...)
创建一个新的特征向量或数据条目,就像django中一样:例如new_user=User(username='johndoe', email='jd@jd.com')
MyData.objects
进行对象管理,如MyData.objects.filter(color__eq='yellow')
下面是一个关于逻辑的方法。在
首先,您需要一个简单的
ObjectManager
类:现在,将该类的一个实例作为属性附加到
^{pr2}$MyData
类,并确保所有新对象都已添加到该类中:现在可以导入向量:
或创建新实例:
并利用管理器过滤对象:
如果你不想改变这个班,你就不想换了您甚至可以创建一个
ObjectManager
,它可以在定义或甚至启动某些实例后挂接到任意类(尽管内置类型不起作用)。在其思想是对目标类的
__init__
进行monkey修补,并在ObjectManager
实例的init上添加objects
属性:你现在应该怎么使用它:
这是你的意思吗?在
此解决方案不依赖于外部库和使用 **kwargs、发电机/外壳和@property decorator。所以从学习的角度来看这可能很有趣。在
如果您设法使用Django读取列表中的数据,那么对于Django兼容性,作为我的代码,这可能会更好。 这取决于你的目标是什么。(完美地模仿django过滤器)或者(学习如何做一个不那么完美的模仿,但是拥有完整的源代码而没有依赖关系)
相关问题 更多 >
编程相关推荐