我发现自己编写了以下代码:
def dlt(translation):
del translation.strands[translation.active][translation.locus]
我更喜欢这样的东西:
def dlt(translation):
*something*(translation):
del strands[active][locus]
有没有办法实现这个目标?
答案 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)