RefactoringTool: ParseError: неправильный ввод: тип = 22, значение = '='

Я реорганизую некоторый код python2 и меняю его на python3, используя модуль 2to3. Я получил следующую ошибку синтаксического анализа:

RefactoringTool: There was 1 error:
RefactoringTool: Can't parse ./helpers/repo.py: ParseError: bad input: type=22, value='=', context=(' ', (45, 25))

Вот код, который дает ошибку:

    except ImportError as error_msg:  # pragma: no cover                           
        print(' ',  file = sys.stderr) # this is a line that yields error                                          
        print("Could not locate modifyrepo.py", file=sys.stderr)                
        print("That is odd... should be with createrepo", file=sys.stderr)      
        raise ImportError(error_msg)

Я понятия не имею, что может быть не так. Не могли бы вы помочь?


person cmd    schedule 13.08.2019    source источник
comment
Возможный дубликат 2to3 ParseError в файле python   -  person ejderuby    schedule 14.08.2019


Ответы (3)


Проблема в том, что код, который вы пытаетесь преобразовать, не является допустимым кодом Python 2.

При запуске кода с использованием Python 2 вы получите следующую ошибку:

  File "repo.py", line 5
    print(' ',  file = sys.stderr) # this is a line that yields error
                     ^
SyntaxError: invalid syntax

Похоже, что этот код уже является кодом Python 3. Используя Python 3, ваш код не приводит к SyntaxError.

person wovano    schedule 13.08.2019
comment
Ой! Спасибо! Тем временем я нашел это: bugs.python.org/issue35260, но все еще не мог понять, что неправильный. - person cmd; 13.08.2019
comment
@cmd, первый ответ на этот отчет об ошибке на самом деле говорит то же самое: 2to3 ожидает действительный файл Python 2 в качестве входных данных, а файл a.py не является допустимым файлом Python 2: строка print является SyntaxError в отсутствие from __future__ import print_function. Так что да, этот обрабатывается как код Python 2, но для этого и предназначен 2to3. - person wovano; 13.08.2019

Я обнаружил, что абсолютная адресация импорта решает эту проблему. С синтаксисом все было в порядке, но относительный импорт со следующим выдавал ошибку.

Не удалось:

from . import classes.utility as util

Работает:

from classes import utility as util

Это может быть просто мое непонимание импорта в Python3.

person Doug    schedule 13.05.2020

Если вы уже преобразовали свои операторы print в функции (как вы это сделали), вы можете использовать параметр -p при вызове 2to3.

-p, --print-function Изменить грамматику, чтобы print() была функцией

E.g.

2to3 -p yourfile.py
person joctee    schedule 26.10.2020