我希望有一个交互式 shell,允许我使用包中定义的一系列模块执行数据操作。例如,我希望能够输入:
$ Input('data.csv')
$ GroupBy('key')
$ Output('data.csv')
其中Input
,GroupBy
和Output
是我的包的所有模块/类,它们隐式地对某个“全局”data
迭代器进行操作。执行此操作的简单方法是显式传递data
作为参数,但我希望控制发生data
在后台的内容(也许我在用户不知道的情况下将其分布在计算核心和地图缩减中)。
这是我迄今为止最接近的:
class env(object):
def __init__(self):
self.data = []
code.interact(local=locals())
def __iter__(self):
return self.data
def run(self, className, *args, **kwargs):
c = globals()[className](*args, **kwargs)
self.data = chain(self.data, c)
def __getattr__(self, attrName, *args, **kwargs):
return partial(self.run, attrName)
然后在我的包裹内__init__.py
煽动env
。然后,我env.py
会将其余的包模块导入它自己的命名空间(例如Input
,GroupBy
和Output
),让我这样做:
$ self.Input('data.csv')
$ self.GroupBy('key')
$ self.Output('data.csv')
这么近,但我想摆脱self
!
我以为我能做的就是让我的env
类继承自dict
,然后做code.interact(local=self)
,但遗憾的是这似乎不起作用?
请告诉我如何以 Pythonic 的方式实现这一点(或解释为什么我要做的不是 Pythonic 并提供替代方案),否则我会非常顽皮并添加data
,builtins
以便我可以在全球范围内访问它模块...
tl,博士;如何将所有包的模块包装在一个控制对全局数据的访问的类中?