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

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

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

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

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

如果找到匹配项:返回枚举

如果没有更多的枚举:不返回

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

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

__LineCode .__ members __。values()

解析器.__ 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):

return lineType

return None

def __init__(self, source=None):

self.__hasNext = False

self.__instream = None

if source:

self.__instream = open(source)

def advance(self):

self.__hasNext = False

while not self.__hasNext:

line = self.__instream.readline()

if line == "": # If EOF

self.__closeFile()

return

lineCode = self.__LineCode.matchLineCode(line)

if lineCode is self.__LineCode.STATEMENT:

pass

elif lineCode is self.__LineCode.CODE_BLOCK:

pass

elif lineCode is self.__LineCode.CODE_BLOCK_END:

pass

elif lineCode is self.__LineCode.COMMENT_LINE:

pass

elif lineCode is self.__LineCode.COMMENT_BLOCK:

pass

elif lineCode is self.__LineCode.COMMENT_BLOCK:

pass

elif lineCode is self.__LineCode.BLANK_LINE:

pass

else:

pass # TODO Invalid file.

我已经用Java实现了它,我想用Python重建同样的东西:

private enum LineCode {

STATEMENT("^(.*)" + Syntax.EOL + "\\s*$"), // statement line

CODE_BLOCK("^(.*)" + Syntax.CODE_BLOCK + "\\s*$"), // code block open line

CODE_BLOCK_END("^\\s*" + Syntax.CODE_BLOCK_END + "\\s*$"), // code block close line

COMMENT_LINE("^\\s*" + Syntax.COMMENT + "(.*+)$"), // comment line

BLANK_LINE("\\s*+$"); // blank line

private final static int CONTENT_GROUP = 1;

private Pattern pattern;

private Matcher matcher;

private LineCode(String regex) {

pattern = Pattern.compile(regex);

}

boolean matches(String line) {

matcher = pattern.matcher(line);

return matcher.matches();

}

String lastMatch() {

try {

return matcher.group(CONTENT_GROUP);

} catch (IndexOutOfBoundsException e) {

return matcher.group();

}

}

static LineCode matchLineCode(String line) throws UnparsableLineException {

for (LineCode lineType : LineCode.values())

if (lineType.matches(line)) return lineType;

throw new UnparsableLineException(line);

}

谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值