【发布时间】:2021-09-23 19:09:50
【问题描述】:
我有一个类 Data 我想使用下面的 api 过滤它。
# Example: filter using where
inpt = {"a":np.array((1,2,3,4,2,5,6,2,3,3,2,1)),
"b":np.random.rand(12)}
data = (Data(inpt)
.where(col("a").equals(3)) # This is how where should be called.
)
data
-
where是类Data中的一个方法 -
col("a").equals(3)是inpt["a"] == 3的语法糖
我可以使用另一个类Expr 来实现这一点,该类使用闭包处理Data.where() 中的所有功能。原因是Expr 无权访问Data。
问题:有人可以为我提供不涉及闭包的替代方法吗?我的目标是学习新的方法/方向。
这是我的代码:
from __future__ import annotations
from typing import Dict, Any
import numpy as np
class Data:
def __init__(self, data: Dict):
self._data = data
def where(self, e: Expr) -> Data:
idx = e.collect(self)
for k,v in self._data.items():
self._data[k] = v[idx]
return self
def __repr__(self):
return str(self._data)
class Expr:
def __init__(self):
self.fs = []
def col(self, s: str) -> Self:
f = lambda x: x._data[s]
self.fs.append(f)
return self
def equals(self, el: Any) -> Self:
f = lambda x: x == el
self.fs.append(f)
return self
def collect(self, x: Data) -> Data:
args = x
for f in self.fs:
args = f(args)
return args
def col(s: str) -> Expr:
return Expr().col(s)
【问题讨论】:
标签: python-3.x closures