Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在面向对象的方法中分解子程序以解决;Flake8函数太复杂(C901)“;?_Python_Oop_Flake8 - Fatal编程技术网

Python 如何在面向对象的方法中分解子程序以解决;Flake8函数太复杂(C901)“;?

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(在复杂结构上迭代)的比较如下所示

我正在类“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(在复杂结构上迭代)的比较如下所示
    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 我可以通过将function
cmp\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专家,所以问题是: 有没有合适/更好的方法来组织这些子例程 符合面向对象的编程规则