有没有办法在Python中输入类命名空间?

时间:2012-11-09 17:16:48

标签: python class namespaces

我发现自己编写了以下代码:

def dlt(translation):
    del translation.strands[translation.active][translation.locus]

我更喜欢这样的东西:

def dlt(translation):
    *something*(translation):
        del strands[active][locus]

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:4)

命名空间只是python对象,您可以将对象(包括属性查找的结果)分配给局部变量名称:

strands = translation.strands
active = translation.active
locus = translation.locus

或者,您必须将修改locals()的上下文管理器合并在一起,如下面的答案所示:https://stackoverflow.com/a/12486075/100297

这样的事情就是这样:

import inspect

class Namespace(object):
    def __init__(self, namespaced):
        self.namespaced = namespaced

    def __enter__(self):
        """store the pre-contextmanager scope"""
        ns = globals()
        namespaced = self.namespaced.__dict__
        # keep track of what we add and what we replace
        self.scope_added = namespaced.keys()
        self.scope_before = {k: v for k, v in ns.iteritems() if k in self.scope_added}
        globals().update(namespaced)
        return self

    def __exit__(self:
        ns = globals()
        # remove what we added, then reinstate what we replaced
        for name in self.scope_added:
            if name in ns:
                del ns[name]
        ns.update(self.scope_before)

然后像这样使用它:

with Namespace(translation):
     del strands[active][locus]

translation.__dict__块中while中的所有项目均可在全球范围内使用。

答案 1 :(得分:2)

你应该使用Martijn的答案。但如果你真的想做你要求的事情,我认为这个(未经测试的)片段会做到这一点:

exec "del strands...", translation.__dict__

如果你不喜欢这样:好,你有品味。 : - )

这是另一种选择:

def within(obj, func):
    return func(**obj.__dict__)

这样称呼:

def dostuff(strands, active, locus, **ignored):
    del ...
within(translation, dostuff)