1

我必须为统计计算编写不可重用的脚本。他们的写作看起来像“凝视情节并添加/删除5行”。我有一个问题:当代码增长到几个屏幕滚动时,编写它变得很困难,因为命名空间被循环体中声明的变量污染了。

我知道,Python 循环不是代码块,我知道 Guido van Rossum 认为,我必须将循环体移动到函数和方法中。但在我的情况下,不会简化代码中的更改,甚至会使其变得更难。

现在我使用一个虚拟类声明作为循环体,但是,也许,你知道更好的方法吗?

#what I use now

outer = 7, 40
for elm in outer:
    class Dummy:
        print elm * 2
        temp = elm * 3 #I don't want to see this outside my loops!

# print "temp", temp # should give error
4

2 回答 2

2

您始终可以再次从全局命名空间中删除名称:

outer = 7, 40
for elm in outer:
    print elm * 2
    temp = elm * 3

del temp

但实际上,使用函数来完成特定任务。它将使您的代码更易于维护和阅读。

于 2013-09-26T10:34:56.973 回答
0

根据@Martjin 的回复,并根据您对 Matlab 工作板的建议,这里有一个可供您期待的替代解决方案。

解决方案

>>> from Workpad import Workpad
>>> with Workpad() as workpad:
    for elm in outer:
        print elm * 2
        workpad.temp = elm * 3
        workpad.temp1 = workpad.temp / 2
        print workpad.temp, workpad.temp1


14
21 10
80
120 60
>>> workpad.temp

Traceback (most recent call last):
  File "<pyshell#335>", line 1, in <module>
    workpad.temp
AttributeError: Workpad instance has no attribute 'temp'

要完成上述工作,您需要创建一个名为 ModuleWorkpad.py并将其放在导入路径中

class Workpad:
    def __exit__(self, *args):
        for e in dir(self):
            if not e in self.__attribs and e != '_Workpad__attribs':
                delattr(self, e)

    def __enter__(self):
        return self
    def __init__(self):
        self.__attribs = dir(Workpad)

我喜欢这个解决方案的原因是,它做了想要做的事情,那就是创建一个范围。如果您需要嵌套多个范围,通常使用类或函数创建范围可能会产生误导和麻烦。

于 2013-09-26T11:29:15.520 回答