Trong Python 2, điều này:
print >>sys.stderr, 'waiting for a connection'
có nghĩa là "in chuỗi 'waiting for a connection'
ra đối tượng giống tệp sys.stderr
".
Trong Python 3, print
trở thành một hàm chứ không phải là một câu lệnh và cú pháp để chuyển hướng đầu ra của nó trông giống như sau:
print('waiting for a connection', file=sys.stderr)
Bạn nhận được một TypeError
(thay vì, nói, a SyntaxError
) trong Python 3 bởi vì, bây giờ đó print
là một hàm (và do đó là một đối tượng), nó có thể là một phần của một biểu thức… và vì >>
là một toán tử, nên đoạn biểu thức
print >>sys.stderr
được hiểu như là " chuyển các print
chức năng đúng bởi sys.stderr
bit" - đó là cú pháp hợp lệ, nhưng không thực hiện bất kỳ ý nghĩa đối với các đối tượng.
Nếu bạn cần viết mã chạy dưới cả Python 2 và Python 3, bạn có thể nhập hành vi của Python 3 vào Python 2:
from __future__ import print_function # works in Python 2.6 and onwards
print('whatever', file=some_file)
Lưu ý rằng điều này sẽ vô hiệu hóa khả năng coi print
như một câu lệnh, vì vậy bạn sẽ phải cập nhật bất kỳ mã nào sử dụng hành vi đó.