Helpex - Trao đổi & giúp đỡ Đăng nhập
3

Khi tôi cố gắng chạy mã này trong Python 3.6:

import sys

print >>sys.stderr, 'waiting for a connection'

Tôi nhận được điều này TypeError:

Traceback (most recent call last):
  File "D:/Users/Chanhc1997/Desktop/test_c.py", line 8, in <module>
    print >>sys.stderr, 'waiting for a connection'
TypeError: unsupported operand type(s) for >>:
'builtin_function_or_method' and 'PseudoOutputFile'.
Did you mean "print(<message>, file=<output_stream>)"?

Mã hoạt động tốt trong Python 2. Điều gì đang xảy ra?

3 hữu ích 2 bình luận 3.6k xem chia sẻ
4

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, printtrở 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ờ đó printlà 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 printchức năng đúng bởi sys.stderrbit" - đó 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 printnhư 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 đó.

4 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python python-3.x printing python-2.x python-3.6 , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading