我的脚本中有一个很大的函数,它包含我程序的大部分逻辑。
有一次,它曾经跨过~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进行修改。
有没有不同的方法来做到这一点我可能忽略了?
答案 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
"建造门把手,用于建造门,用于建造房屋。而不是反过来"