Tại sao việc sử dụng từ __future__ nhập print_function lại phá vỡ kiểu in Python2? [đóng cửa]


135

Tôi mới lập trình với python và tôi đang cố in ra bằng dấu phân cách và kết thúc nhưng nó vẫn khiến tôi bị lỗi cú pháp.

Tôi đang sử dụng python 2.7.

Đây là mã của tôi:

from __future__ import print_function
import sys, os, time

for x in range(0,10):
    print x, sep=' ', end=''
    time.sleep(1)

Và đây là lỗi:

$ python2 xy.py
  File "xy.py", line 5
    print x, sep=' ', end=''
          ^
SyntaxError: invalid syntax
$

4
Bạn đã nhập bản in dưới dạng hàm nhưng bạn vẫn coi đó là một tuyên bố .
jonrsharpe

4
bạn không thể gọi in mà không có dấu ngoặc đơn vì bạn đã thay đổi in thành chức năng in (args)
Charlie Parker

Câu trả lời:


210

Trước hết, from __future__ import print_functioncần phải là dòng mã đầu tiên trong tập lệnh của bạn (ngoài một số trường hợp ngoại lệ được đề cập dưới đây). Thứ hai, như các câu trả lời khác đã nói, bạn phải sử dụng printnhư một chức năng ngay bây giờ. Đó là toàn bộ quan điểm của from __future__ import print_function; để đưa print hàm từ Python 3 vào Python 2.6+.

from __future__ import print_function

import sys, os, time

for x in range(0,10):
    print(x, sep=' ', end='')  # No need for sep here, but okay :)
    time.sleep(1)

__future__các câu lệnh cần ở gần đầu tập tin vì chúng thay đổi những điều cơ bản về ngôn ngữ và vì vậy trình biên dịch cần biết về chúng ngay từ đầu. Từ tài liệu :

Một tuyên bố trong tương lai được công nhận và xử lý đặc biệt tại thời gian biên dịch: Các thay đổi về ngữ nghĩa của các cấu trúc cốt lõi thường được thực hiện bằng cách tạo mã khác nhau. Thậm chí có thể là một tính năng mới giới thiệu cú pháp không tương thích mới (chẳng hạn như một từ dành riêng mới), trong trường hợp đó, trình biên dịch có thể cần phân tích mô-đun khác nhau. Những quyết định như vậy không thể được đẩy ra cho đến khi thời gian chạy.

Tài liệu này cũng đề cập rằng những điều duy nhất có thể đi trước một __future__câu lệnh là chuỗi mô-đun, nhận xét, dòng trống và các câu lệnh khác trong tương lai.


1
First of all, from __future__ import print_function needs to be the first line of code in your script Tôi có thể biết tại sao không?
Avinash Raj

1
@UHMIS, làm end=' '.
Cyphase

14
Như đã nêu trong tài liệu ( docs.python.org/2/reference/simple_stmts.html#future ) nó không phải là dòng đầu tiên : A future statement must appear near the top of the module. The only lines that can appear before a future statement are: the module docstring (if any), comments, blank lines, and other future statements.
ngulam

1
@ngulam, tôi đã chỉnh sửa để đề cập đến điều đó, nhưng nó không rõ ràng trong đoạn đầu tiên, vì vậy tôi đã sửa nó. Cảm ơn đã chỉ ra điều đó.
Cyphase

1
@AvinashRaj, tôi không biết; bạn phải hỏi UHMIS. Nhưng như tôi đã nói trong một bình luận cho câu trả lời của bạn, có lẽ OP đã thay đổi và không đề cập đến nó. Và nhận xét đầu tiên của OP rằng vẫn còn một lỗi.
Cyphase
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.