避免python范围错误的策略

时间:2015-04-02 16:45:06

标签: python python-3.x scope ipython-notebook

我在研究中广泛使用IPython笔记本。我发现它们是一个很棒的工具。

然而,不止一次,我被可变范围所带来的微妙错误所困扰。例如,我将做一些探索性分析:

foo = 1
bar = 2
foo + bar

我认为foo + bar对我来说是一个有用的算法,因此我将其封装在一个函数中,以便更容易应用于更广泛的输入:

def the_function(foo, bar):
    return foo + bar

不可避免地,在某个地方,在从头开始构建工作流之后,我会在某处(例如def the_function(fooo, bar):)输入一个错误,导致在函数中使用(和/或修改)全局变量呼叫。这会导致看不见的副作用,并导致虚假的结果。但由于它通常会返回结果,因此很难找到问题实际发生的位置。

现在,我认识到这种行为是我故意经常使用的一个功能(为了方便起见,或者为了必要,即函数闭包或装饰器)。但是当我不断遇到错误时,我认为我需要一个更好的策略来避免这些问题(当前策略=“小心”)。

例如,一种策略可能是始终在本地变量名前加上“_”。但我很好奇,如果没有其他策略 - 甚至是“pythonic”策略,或社区鼓励策略。

我知道python 2.x在某些方面与python 3.x在范围界定方面有所区别 - 我使用python 3.x。

此外,策略应该考虑科学计算的交互性,就像在IPython Notebook场所一样。

思想?

编辑:更具体地说,我正在寻找IPython Notebook策略。

3 个答案:

答案 0 :(得分:1)

我很想将这个问题标记为过于宽泛,但也许以下内容会对你有所帮助。

当您决定在函数中包装一些有用的代码时,请编写一些测试。如果您认为代码很有用,那么您必须将它与一些示例一起使用。写下测试,以免'忘记'。

我对库模块的个人策略是在if __name__ == '__main__':语句中运行测试,无论测试代码是在同一个文件中还是在不同的文件中。我还执行该文件以在编程会话期间,在每个小的更改单元(在空闲或类似的IDE中无关紧要)之后多次运行测试。

使用代码检查程序,它将捕获一些基于错误的错误。 “'fooo'设定但从未使用过。”

跟踪制作的特定类型的错误,分析它们并思考个人对策,或者至少学会识别症状。

查看您的示例,在编写函数时,不要对全局对象和参数使用相同的名称。在您的示例中,删除或更改全局'foo'和'bar'或使用其他参数名称。

答案 1 :(得分:1)

我建议您将您的疑虑分开。对于您的探索性分析,请在iPython笔记本中编写代码,但是当您确定有一些有用的函数时,请打开编辑器并将您的函数放入python文件中,然后可以导入。

您可以使用iPython magics自动重新加载您导入的内容。因此,一旦您在iPython中测试它们,您只需将它们复制到您的模块即可。这样,您的功能范围就与笔记本电脑隔离。另一个优点是,当您准备在无头环境中运行时,您已经将整个代码库集中在一个地方。

答案 2 :(得分:0)

最后,我自己解决了这个问题。它建立在目前为止给出的两个答案的基础上。

你可以在github上找到我的解决方案,这是一个单元魔术扩展:https://github.com/brazilbean/modulemagic

简而言之,此扩展程序使您能够在笔记本中创建%%模块单元。这些单元格保存为文件并导回到您的会话中。它有效地完成了@shadanan建议的内容,但允许您将所有工作保存在同一个地方(方便,符合笔记本在同一位置提供代码和结果的理念)。

因为导入过程对代码进行沙盒处理,所以它解决了导致我原始问题的所有范围阴影错误。它还涉及很少或没有开销 - 没有重命名变量,打开其他编辑器等等。