Python 如何在面向对象的方法中分解子程序以解决;Flake8函数太复杂(C901)“;?
我正在类“p”中编写一个函数Python 如何在面向对象的方法中分解子程序以解决;Flake8函数太复杂(C901)“;?,python,oop,flake8,Python,Oop,Flake8,我正在类“p”中编写一个函数build\u hierarchy\u config,它递归调用recursive\u build\u hierarchy\u config。 实例P1上调用的此函数迭代复杂的dict结构(“config”属性),并比较另一个“P”实例(称为P2)中具有相同“config”属性的所有项,该实例是P1的父实例。 比较逻辑分为几个功能: 递归调用是recursive\u build\u hierarchy\u config dicts(在复杂结构上迭代)的比较如下所示
build\u hierarchy\u config
,它递归调用recursive\u build\u hierarchy\u config
。
实例P1上调用的此函数迭代复杂的dict结构(“config”属性),并比较另一个“P”实例(称为P2)中具有相同“config”属性的所有项,该实例是P1的父实例。
比较逻辑分为几个功能:
- 递归调用是
recursive\u build\u hierarchy\u config
- dicts(在复杂结构上迭代)的比较如下所示
get\u more\u strict\u config
- 比较单个项目位于
cmp\u config\u项目中
import decimal
from typing import Optional
from attrdict import AttrDict
class Config(AttrDict):
"""Represent P config."""
def __init__(self, some_dict):
super(Config, self).__init__(some_dict)
class P(dict):
"""Represents P object."""
def build_hierarchy_config(self,
hierarchy_config_type: str):
"""Fill the hierarchy_config or parent_hierarchy_config attribute."""
def cmp_config_item(slave: Optional[decimal.Decimal],
master: Optional[decimal.Decimal],
cmp_func: str) -> Optional[decimal.Decimal]:
"""Compare two numbers with custom 'None' handling."""
if cmp_func not in ['min', 'max']:
raise Exception(
f'comparison function {cmp_func} not supported')
if slave is not None and master is not None:
return eval(cmp_func + '(' + str(slave) + ',' +
str(master) + ')')
elif slave is None and master is None:
return None
elif slave is None:
return master
elif master is None:
return slave
def get_more_strict_config(config, parent_config) -> Config:
"""Combine configs and return most strict combinaton of values."""
# some logic with few for and if/else
return config
def recursive_build_hierarchy_config(pieceId: Optional[str]):
if pieceId is None:
return None
else:
p = P()
parent_config = recursive_build_hierarchy_config(
p.parentPieceId)
return get_more_strict_config(p.config, parent_config)
if hierarchy_config_type == 'hierarchy_config':
self.hierarchyConfig = recursive_build_hierarchy_config(
self.id)
elif hierarchy_config_type == 'parent_hierarchy_config':
self.parenthierarchyConfig = recursive_build_hierarchy_config(
self.parentPieceId)
但是运行flake8
会产生错误:
C901“p.build\u hierarchy\u config”太复杂(12)
这意味着build\u hierarchy\u config
的复杂度总和了所有子函数的复杂度
选项1
我可以通过将functioncmp\u config\u item
移出build\u hierarchy\u config
名称空间(不确定这是否是正确的措辞)并定位在主范围内轻松修复它:
import decimal
from typing import Optional
from attrdict import AttrDict
class Config(AttrDict):
"""Represent P config."""
def __init__(self, some_dict):
super(Config, self).__init__(some_dict)
class P(dict):
"""Represents P object."""
def build_hierarchy_config(self,
hierarchy_config_type: str):
"""Fill the hierarchy_config or parent_hierarchy_config attribute."""
def get_more_strict_config(config, parent_config) -> Config:
"""Combine configs and return most strict combinaton of values."""
# some logic with few for and if/else
return config
def recursive_build_hierarchy_config(pieceId: Optional[str]):
if pieceId is None:
return None
else:
p = P()
parent_config = recursive_build_hierarchy_config(
p.parentPieceId)
return get_more_strict_config(p.config, parent_config)
if hierarchy_config_type == 'hierarchy_config':
self.hierarchyConfig = recursive_build_hierarchy_config(
self.id)
elif hierarchy_config_type == 'parent_hierarchy_config':
self.parenthierarchyConfig = recursive_build_hierarchy_config(
self.parentPieceId)
def cmp_config_item(slave: Optional[decimal.Decimal],
master: Optional[decimal.Decimal],
cmp_func: str) -> Optional[decimal.Decimal]:
"""Compare two numbers with custom 'None' handling."""
if cmp_func not in ['min', 'max']:
raise Exception(
f'comparison function {cmp_func} not supported')
if slave is not None and master is not None:
return eval(cmp_func + '(' + str(slave) + ',' +
str(master) + ')')
elif slave is None and master is None:
return None
elif slave is None:
return master
elif master is None:
return slave
现在Flake 8不再抱怨了。但这使得函数cmp\u config\u item
可用于模块的整个范围,并降低了代码的结构化程度(没有迹象表明此函数指定在所选范围内使用)
选项2
我可以通过在def build\u hierarchy\u config
之后添加#noqa:ignore=C901
使此消息对函数静音,如前所述。
但这会抑制对函数build\u hierarchy\u config
本身的检查,因此不会被接受
两种解决方案都是折衷方案。
我不是OOP专家,所以问题是:
有没有合适/更好的方法来组织这些子例程
符合面向对象的编程规则