3

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

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

例如,它看起来像

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

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

什么是处理这个问题的pythonic方法?

我能想到的两种方法是:

1)全局变量---可能会因为我有很多变量而变得混乱 2)使用字典来跟踪它们

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

并改为对 dict 进行修改。

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

4

5 回答 5

6

没有更多信息,很难知道这是否合适,但是……</p>

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

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,或者这是否是一个好主意,取决于所有这些变量的实际含义,以及它们如何组合在一起。

于 2013-08-08T22:59:08.257 回答
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()
于 2013-08-08T22:58:19.023 回答
3

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

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

x, y = modifies_two_vars(x, y, z, w)
于 2013-08-08T23:08:43.040 回答
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()
于 2013-08-08T23:03:19.960 回答
0

对象组成。创建保存状态的小对象,然后将它们作为初始化程序提供一个管理它们的对象。请参阅全局状态和单例

“建造门把手,你用它来建造门,你用它来建造房子。而不是相反”

于 2016-06-20T23:37:02.607 回答