我在研究中广泛使用 IPython Notebooks。我发现它们是一个很棒的工具。
但是,我不止一次被变量作用域产生的微妙错误所困扰。例如,我将做一些探索性分析:
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 策略。
最佳答案
我很想把这个问题标记为太宽泛,但也许以下内容会对您有所帮助。
当您决定将一些有用的代码包装在函数中时,请编写一些测试。如果您认为该代码有用,您一定已经使用过它和一些示例。首先编写测试以免您“忘记”。
我对库模块的个人策略是在 if __name__ 中运行测试
== '__main__':
语句,测试代码是否在同一个文件中或者不同文件中。我还在编程 session 期间执行该文件多次运行测试,在每个小单位的更改之后(在 Idle 或类似 IDE 中微不足道)。
使用代码检查程序,它可以捕获一些基于拼写错误的错误。 “'fooo'已设置但从未使用过”。
跟踪您所犯的特定类型的错误,分析它们并考虑个人对策,或者至少学会识别症状。
看看您的示例,当您编写函数时,不要对全局对象和参数使用相同的名称。在您的示例中,删除或更改全局“foo”和“bar”或使用其他名称作为参数名称。
关于python - 避免 python 范围错误的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29418164/