2012-02-10 26 views
20

Tôi có mã Python sau để ghi các tệp phụ thuộc của dự án. Nó hoạt động tốt với Python 2.x, nhưng trong khi thử nghiệm nó với Python 3 nó báo cáo một lỗi.Toán tử Python 3 >> để in thành tệp

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

Dưới đây là lỗi:

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' 

cách tốt nhất để có được điều này làm việc với Python 2.x và 3.x là gì?

+0

"với python2.x và 3.x"? Bạn không thể có cùng mã trong cả hai phiên bản. Thông thường, bạn sử dụng công cụ '2to3' để chuyển đổi Python 2 thành Python 3. –

+3

Bạn có thể sử dụng' from __future__ import print_function' để lấy hàm Python print() vào Python 2. Xem thêm http://python3porting.com –

Trả lời

31

Trong Python 3 báo cáo kết quả in đã trở thành một chức năng. Cú pháp mới trông như thế này: thay đổi

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

phá vỡ này bằng Python 3 có nghĩa là nó không phải là có thể sử dụng cùng mã trong Python 2 và 3 khi viết vào một tập tin bằng cách sử dụng print tuyên bố/chức năng. Một lựa chọn có thể là sử dụng depend.write(s) thay vì in.

Cập nhật: J.F. Sebastian chỉ ra chính xác rằng bạn có thể sử dụng from __future__ import print_function trong mã Python 2 để kích hoạt cú pháp Python 3. Đó sẽ là một cách tuyệt vời để sử dụng cùng một mã trên các phiên bản Python khác nhau.

+3

bạn có thể sử dụng 'từ __future__ import print_function' để sử dụng hàm' print() 'trong Python 2.x. btw, 'end =" "' không giống như dấu phẩy trong câu lệnh 'print'. So sánh ['print'a ',; print'b''] (http://ideone.com/ogwCh) và [' print (' a ', end =' '); in ('b') '] (http://ideone.com/py5k7) (lưu ý: không có dấu cách giữa' a' và 'b' trong trường hợp thứ hai). ' – jfs

8

print() là một hàm trong Python 3.

Thay đổi mã của bạn để print(s, end="", file=depend), or let the 2to3 tool do it for you.

+2

bạn cần chỉ định tham số kết thúc để khớp với mã py2x –

+0

@DavidHeffeman Khá đúng. – Amber

2

Lưu ý rằng bắt đầu bằng Python 3.6.3 (tháng 9 năm 2017), được thông báo lỗi cho trường hợp này sẽ được thay đổi để đề nghị Python 3 chính tả:

>>> 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>)"? 

(ngắt dòng Explicit thêm để tránh side-scrolling - thông báo lỗi thực tế chỉ kết thúc tốt đẹp ở chiều rộng của cửa sổ đầu cuối của bạn)

Các vấn đề liên quan