портирование программы Python 2 на Python 3, генератор случайных строк - PullRequest
6 голосов
/ 15 октября 2011

У меня есть программа для генерации случайных строк, написанная на Python2, но мне нужно перенести ее на Python3. Вы даете программе опцию -n [число] и аргумент файла, чтобы сообщить ей случайным образом вывести число строк из файла. Вот источник для программы:

#!/usr/bin/python

import random, sys
from optparse import OptionParser

class randline:
    def __init__(self, filename):
        f = open(filename, 'r')
        self.lines = f.readlines()
        f.close()

    def chooseline(self):
        return random.choice(self.lines)

def main():
    version_msg = "%prog 2.0"
    usage_msg = """%prog [OPTION]... [FILE] [FILE]...

Output randomly selected lines from each FILE."""

    parser = OptionParser(version=version_msg,
                          usage=usage_msg)
    parser.add_option("-n", "--numlines",
                      action="store", dest="numlines", default=1,
                      help="output NUMLINES lines (default 1)")
    options, args = parser.parse_args(sys.argv[1:])

    try:
        numlines = int(options.numlines)
    except:
        parser.error("invalid NUMLINES: {0}".
                     format(options.numlines))
    if numlines < 0:
        parser.error("negative count: {0}".
                     format(numlines))
    if len(args) < 1:
        parser.error("input at least one operand!")

    for index in range(len(args)):
        input_file = args[index]
        try:
            generator = randline(input_file)
            for index in range(numlines):
                sys.stdout.write(generator.chooseline())
        except IOError as (errno, strerror):
            parser.error("I/O error({0}): {1}".
                        format(errno, strerror))

if __name__ == "__main__":
    main()


Когда я запускаю это с python3:

python3 randline.py -n 1 file.txt

Я получаю следующую ошибку:

  File "randline.py", line 66
    except IOError as (errno, strerror):
                      ^
SyntaxError: invalid syntax

Скажите, что означает эта ошибка и как ее исправить?

Спасибо!

Ответы [ 3 ]

11 голосов
/ 15 октября 2011

Строка "except IOError as (errno, strerror)" основана на малоизвестном неясном факте, что исключения в Python 2 являются итеративными, и что вы можете перебирать параметры, заданные для исключения, перебирая само исключение.

Это, конечно, нарушает правило Python «Явное лучше, чем неявное» и, как таковое, было удалено в Python 3, поэтому вы больше не можете этого делать. Вместо этого сделайте:

except IOError as e:
   errno, strerror = e.args

Это более понятно и работает во всех версиях Python.

6 голосов
/ 15 октября 2011

У этой строки неверный синтаксис:

except IOError as (errno, strerror):

Правильная форма:

except IOError as err:

тогда вы можете проверить err на такие атрибуты, как errno и т. Д.

Я не уверен, откуда вы взяли исходную строку, это также недопустимый синтаксис Python 2.x.

0 голосов
/ 15 октября 2011

Чтобы преобразовать вашу программу из python 2 в python 3, используйте инструмент 2to3.

http://docs.python.org/library/2to3.html

...