小编Ben*_*Ben的帖子

Python:私有内部Enum类中的静态方法

我在实现名为Parser的类中实现内部私有枚举类:“ LineCode”时遇到了麻烦。

LineCode:私有Enum类,它定义6种通用可能的代码行类型。我使用Enum实例化发送正则表达式模式,并在构造函数__init__中对其进行编译,然后将正则表达式匹配器作为类变量保存。

解析器:解析一种编程语言,与什么语言无关。解析器正在使用LineCode来标识行并相应地进行处理。

问题:我无法从静态方法访问__LineCode的枚举成员。我希望在__LineCode中有一个static方法“ matchLineCode(line)”,该方法从解析器接收一个字符串,然后按以下逻辑对Enum成员进行迭代:

  • 如果找到匹配项:返回枚举
  • 如果没有更多的枚举:不返回

这似乎并不简单,我无法访问枚举成员来执行此操作。

尝试:我尝试使用以下方法遍历枚举:

  1. __LineCode .__ members __。values()
  2. 解析器.__ lineCode .__成员__。values()

两者均失败,因为找不到__lineCode。

理想情况下: LineCode类必须是私有的,并且对于导入解析器的任何其他类都不可见。解析器必须使用LineCode类提供的静态方法来返回Enum。我愿意接受任何解决此问题或模仿此行为的解决方案。

我省略了一些不相关的Parser方法以提高可读性。码:

class Parser:
    class __LineCode(Enum):
        STATEMENT = ("^\s*(.*);\s*$")
        CODE_BLOCK = ("^\s*(.*)\s*\{\s*$")
        CODE_BLOCK_END = ("^\s*(.*)\s*\}\s*$")
        COMMENT_LINE = ("^\s*//\s*(.*)$")
        COMMENT_BLOCK = ("^\s*(?:/\*\*)\s*(.*)\s*$")
        COMMENT_BLOCK_END = ("^\s*(.*)\s*(?:\*/)\s*$")
        BLANK_LINE = ("^\s*$")

        def __init__(self, pattern):
            self.__matcher = re.compile(pattern)

        @property
        def matches(self, line):
            return self.__matcher.match(line)

        @property
        def lastMatch(self):
            try:
                return self.__matcher.groups(1)
            except:
                return None

        @staticmethod
        def matchLineCode(line):
            for lineType in **???**:
                if lineType.matches(line): …
Run Code Online (Sandbox Code Playgroud)

python enums static-methods

3
推荐指数
1
解决办法
1771
查看次数

标签 统计

enums ×1

python ×1

static-methods ×1