1

我希望有一个交互式 shell,允许我使用包中定义的一系列模块执行数据操作。例如,我希望能够输入:

$ Input('data.csv')
$ GroupBy('key')
$ Output('data.csv')

其中Input,GroupByOutput是我的包的所有模块/类,它们隐式地对某个“全局”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会将其余的包模块导入它自己的命名空间(例如InputGroupByOutput),让我这样做:

$ self.Input('data.csv')
$ self.GroupBy('key')
$ self.Output('data.csv')

这么近,但我想摆脱self

我以为我能做的就是让我的env类继承自dict,然后做code.interact(local=self),但遗憾的是这似乎不起作用?

请告诉我如何以 Pythonic 的方式实现这一点(或解释为什么我要做的不是 Pythonic 并提供替代方案),否则我会非常顽皮并添加databuiltins以便我可以在全球范围内访问它模块...

tl,博士;如何将所有包的模块包装在一个控制对全局数据的访问的类中?

4

0 回答 0