Python2.x到3.x-附加语法错误:如何使其与Python3.x从2.x兼容?

我有一个非常简单的问题,我很难追查——这意味着一个非常简单的答案。在过去的大约 12 年左右的时间里,我有很多人在 python 2x 中编写的大量脚本,我不得不移植到 python 3x。

经过搜索和很多很多修复后,我遇到了一个难以追踪的变化。我在 e.append(lineno, line) 中有一个语法错误,如下所示。关于如何改变它以使其与 python 3x 兼容的任何想法都将非常有用。

    self.__options = {}
    lineno = 0
    e = None                                  # None, or an exception
    while 1:
        line = fp.readline()
        if not line:
            break
        lineno = lineno + 1
        # skip blank lines
        if string.strip(line) == '':
            continue
        # skip lines starting with '['
        if line[0] == '[':
            continue
        # remove anything after '#'
        line = string.split(line, '#')[0]

        # key/value pairs can be seperated by whitespaces
        for opt in string.split(line):
            #if opt in string.whitespace:
            #    continue
            keyval = string.split(opt, '=')
            if len(keyval) == 2:
                self.__options[keyval[0]] = keyval[1]
            else:
                e = ParsingError(fpname)
                e.append(lineno, `line`)

    # if any parsing errors occurred, raise an exception
    if e:
        raise e

回答

这是非常简洁的历史语法。

对于反引号,我建议您参考以下答案:https : //stackoverflow.com/a/1673087/2988730。要点是反引号是调用的简写,repr直到它们在 python 3 中被删除。它们在文档中被称为“转换”操作:

repr(对象)

返回一个包含对象的可打印表示的字符串。这与转换(反引号)产生的值相同。能够像普通函数一样访问这个操作有时很有用......

附加本身是该方法的正常使用,但未记录在案ParsingError.append

def append(self, lineno, line):

从版本 3 开始,ConfigParser已经改名了configparser,但是ParsingError.append方法还是有的。

所以你需要做一些改变:

  1. 在文件的开头,更改from ConfigParser import ParsingError

    从 configparser 导入 ParsingError

  2. 将有错误的行更改为

    e.append(lineno, repr(line))
    

笔记

自 python 2.0 以来,不支持append调用但不相关的多个参数list.append。您可以在此处找到注释:https : //docs.python.org/2/library/stdtypes.html#mutable-sequence-types。特别是脚注:

  1. Python 的 C 实现历来接受多个参数并将它们隐式地连接成一个元组;这不再适用于 Python 2.0。自 Python 1.4 起,不推荐使用此错误功能。

以上是Python2.x到3.x-附加语法错误:如何使其与Python3.x从2.x兼容?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>