Python大函数许多变量(重构)

时间:2013-08-08 22:50:37

标签: python

我的脚本中有一个很大的函数,它包含我程序的大部分逻辑。

有一次,它曾经跨过~100行,然后我试图将其重构为多个较小的函数。但是,我有许多局部变量最终在较小的函数中被修改,我需要一些方法来跟踪它们在较大函数的范围内。

例如,它看起来像

def large_func():
 x = 5
 ... 100 lines ...

def large_func():
   x = 6
   small_func_that_will_increment_x()
   small_func()
   ....

什么是pythonic方法来处理这个?

我能想到的两种方法是:

1)全局变量---因为我有很多变量,所以可能会变得混乱 2)使用dict来跟踪它们,如

tracker = {
'field1' : 5
'field2' : 4
}

并改为对dict进行修改。

有没有不同的方法来做到这一点我可能忽略了?

5 个答案:

答案 0 :(得分:6)

如果没有更多信息,很难知道这是否合适,但是......

对象是命名空间。特别是,您可以将每个局部变量转换为对象的属性。例如:

class LargeThing(object):
    def __init__(self):
        self.x = 6
    def large_func(self):
        self.small_func_that_will_increment_x()
        self.small_func()
        # ...
    def small_func_that_will_increment_x(self):
        self.x += 1

self.x = 6是属于__init__还是属于large_func的开头,或者这是否是一个好主意,取决于所有这些变量的实际含义,以及它们如何适合在一起。

答案 1 :(得分:3)

闭包将在这里工作:

def large_func()
   x = 6

   def func_that_uses_x():
       print x

   def func_that_modifies_x():
       nonlocal x  # python3 only
       x += 1

   func_that_uses_x()
   func_that_modifies_x()

答案 2 :(得分:3)

另一个提示 - 利用Python的功能返回多个值。如果您有一个修改两个变量的函数,请执行以下操作:

def modifies_two_vars(a, b, c, d):
    return a+b, c+d

x, y = modifies_two_vars(x, y, z, w)

答案 3 :(得分:0)

一种替代方案可能是:

def small_func_that_will_return_new_x(old_x):
  return old_x + 1

def large_func():
  x = small_func_that_will_return_new_x(6)

而不是:

def large_func():
   x = 6
   small_func_that_will_increment_x()

答案 4 :(得分:0)

对象组合。创建保存状态的小对象,然后将它们作为初始化程序提供给管理它们的对象。见Global State and Singletons

"建造门把手,用于建造门,用于建造房屋。而不是反过来"