python - 有没有办法禁止 python 函数使用除本地变量之外的任何变量?

标签 python scope

我目前正在进行手动 python 代码重构。

为了确保我没有因为忘记更正我在函数中包含的指令而破坏原始代码,我想确保在我测试它们时该函数无法访问全局变量。除了将它们复制到单独的模块中,正确的方法是什么?

编辑:

明确一点:我正在尝试将我的初始代码转换成如下内容:

def big_function(args):      
   def one_small_transformation(args):
       # No one else needs to see this transformation outside the function1

   def second_small_transformation(args):

   ...

   # Block of instructions chaining small transformations

# Other big functions and code making them work together

有时我忘记更正我的小转换中的变量名,小转换中的代码从大指令 block 调用变量。

单元测试: big_function 单元测试通过;重构后开始编辑代码时会出现错误。在项目的当前阶段,为小转换编写单元测试看起来有点矫枉过正,因为一旦 big_function 的内部逻辑清晰,它们将完全重写。

最佳答案

您可能会发现首先将所有全局变量放入一个单例(全局)对象中是有好处的。这使得对全局变量的任何使用都变得非常明显,从而帮助您朝着减少/消除它们的目标迈进。

所以,在一个模块中进行全局声明

dir_root = "/example/rootdir"
debug_level = 3

并将它们包装在一个具有单个声明实例的类中:

class GLOBALS:
  dir_root = ...
  debug_level = ...

Globals = GLOBALS()

当然,必须更新对变量的现有引用才能使用,例如Globals.dir_root 而不是直接使用 dir_root

这样做的好处是,它允许您在保持应用程序逻辑完整的同时突出显示全局变量的用法。这使您能够以更不易引入新逻辑错误的增量方式进行重构。根据您最初的问题,您可以确定任何未明确引用 Globals 对象的函数都没有使用任何全局变量。

关于python - 有没有办法禁止 python 函数使用除本地变量之外的任何变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20787845/

相关文章:

python - 赋值前引用的局部变量

javascript - 如果我们在这个函数之外定义一个函数变量,那么这个变量属于什么样的作用域呢?

javascript - Angular 指令模板的增量值

python - 虽然不在列表中

python - 如何根据多列的值使用python pandas将多行合并为一行?

Python pandas 将行插入 DF 并将缺失值作为 Nan 的快速方法

c++ - 立即传递其成员时的右值范围

javascript - 范围未在资源回调函数外部更新

python - 在 Pandas 稀疏矩阵中查找全零列

python - Pygame 朝某个方向移动图像