降低面向对象 python 代码的圈复杂度
Reducing cyclomatic complexity of object oriented python code
我正在尝试降低代码的循环复杂度,因为根据 pylama my definition is 'too complex' and suggested solution 包括使用字典映射调用函数。
所以我在我的面向对象代码上尝试了它,但失败得很惨。
class trial:
def __init__(self):
self.a = 'a'
self.b = 'b'
def a(self):
return self.a
def b(self):
return self.b
def select_one(self, option):
map_func = {
1 : self.a,
2 : self.b
}
return map_func[option]()
t = trial()
print(t.select_one(1))
如果这不可能,还有哪些其他可能的解决方案可以降低圈复杂度。
首先,字典应该在 __init__
中定义,否则每次输入 select_one
函数时都会有 O(n)
的复杂性(每次都构建字典,这使得示例在你的link错了)
其次,您的方法与您的属性同名。更改:
class trial:
def __init__(self):
self.a = 'a'
self.b = 'b'
self.map_func = {
1 : self.f_a,
2 : self.f_b
}
def f_a(self):
return self.a
def f_b(self):
return self.b
def select_one(self, option):
return self.map_func[option]()
t = trial()
print(t.select_one(1))
我正在尝试降低代码的循环复杂度,因为根据 pylama my definition is 'too complex' and suggested solution 包括使用字典映射调用函数。
所以我在我的面向对象代码上尝试了它,但失败得很惨。
class trial:
def __init__(self):
self.a = 'a'
self.b = 'b'
def a(self):
return self.a
def b(self):
return self.b
def select_one(self, option):
map_func = {
1 : self.a,
2 : self.b
}
return map_func[option]()
t = trial()
print(t.select_one(1))
如果这不可能,还有哪些其他可能的解决方案可以降低圈复杂度。
首先,字典应该在 __init__
中定义,否则每次输入 select_one
函数时都会有 O(n)
的复杂性(每次都构建字典,这使得示例在你的link错了)
其次,您的方法与您的属性同名。更改:
class trial:
def __init__(self):
self.a = 'a'
self.b = 'b'
self.map_func = {
1 : self.f_a,
2 : self.f_b
}
def f_a(self):
return self.a
def f_b(self):
return self.b
def select_one(self, option):
return self.map_func[option]()
t = trial()
print(t.select_one(1))