Подтвердить что ты не робот

Оператор Python 3 >> для печати в файл

У меня есть следующий код Python для записи файлов зависимостей проекта. Он отлично работает с Python 2.x, но, тестируя его с помощью Python 3, он сообщает об ошибке.

depend = None
if not nmake:
    depend = open(".depend", "a")
dependmak = open(".depend.mak", "a")
depend = open(".depend", "a")
print >>depend, s,

Вот ошибка:

Traceback (most recent call last):
  File "../../../../config/makedepend.py", line 121, in <module>
    print >>depend, s,
    TypeError: unsupported operand type(s) for >>:
      'builtin_function_or_method' and '_io.TextIOWrapper'

Каков наилучший способ заставить это работать с Python 2.x и 3.x?

4b9b3361

Ответ 1

В Python 3 оператор печати стал функцией. Новый синтаксис выглядит следующим образом:

print(s, end="", file=depend)

Это нарушение в Python 3 означает, что невозможно использовать один и тот же код в Python 2 и 3 при записи в файл с помощью оператора print statement/function. Один из возможных вариантов - использовать depend.write(s) вместо печати. ​​

Update: J.F. Себастьян правильно указывает, что вы можете использовать from __future__ import print_function в своем коде Python 2, чтобы включить синтаксис Python 3. Это был бы отличный способ использовать один и тот же код в разных версиях Python.

Ответ 3

Обратите внимание, что, начиная с Python 3.6.3 (сентябрь 2017 г.), сообщение об ошибке для этого случая будет меняться, чтобы рекомендовать правописание Python 3:

>>> print >> sys.stderr
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for >>:
    'builtin_function_or_method' and '_io.TextIOWrapper'.
    Did you mean "print(<message>, file=<output_stream>)"?

(Явные разрывы строк добавлены, чтобы избежать боковой прокрутки - фактическое сообщение об ошибке просто обертывается по ширине окна вашего терминала)