เหตุใดการใช้จาก __future__ import print_function จึงทำให้การพิมพ์แบบ Python2 แตก [ปิด]


140

ฉันใหม่ในการเขียนโปรแกรมด้วย python และฉันกำลังพยายามพิมพ์โดยใช้ตัวคั่นและสิ้นสุด แต่ก็ยังคงทำให้ฉันมีข้อผิดพลาดทางไวยากรณ์

ฉันใช้ python 2.7

นี่คือรหัสของฉัน:

from __future__ import print_function
import sys, os, time

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

และนี่คือข้อผิดพลาด:

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

4
คุณนำเข้าพิมพ์เป็นฟังก์ชั่น แต่คุณยังคงรักษามันเป็นคำสั่ง
jonrsharpe

4
คุณไม่สามารถเรียกพิมพ์โดยไม่มีวงเล็บได้เนื่องจากคุณได้เปลี่ยนการพิมพ์เป็นการพิมพ์ฟังก์ชัน (args)
Charlie Parker

คำตอบ:


214

ก่อนอื่นfrom __future__ import print_functionต้องเป็นบรรทัดแรกของโค้ดในสคริปต์ของคุณ (นอกเหนือจากข้อยกเว้นบางประการที่ระบุไว้ด้านล่าง) ประการที่สองตามที่คำตอบอื่น ๆ ได้กล่าวไว้คุณต้องใช้printเป็นฟังก์ชันในขณะนี้ นั่นคือจุดรวมของfrom __future__ import print_function; เพื่อนำprint ฟังก์ชันจาก Python 3 เข้าสู่ 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__คำสั่งต้องอยู่ใกล้ด้านบนสุดของไฟล์เนื่องจากมีการเปลี่ยนแปลงสิ่งพื้นฐานเกี่ยวกับภาษาดังนั้นคอมไพเลอร์จึงจำเป็นต้องรู้เกี่ยวกับพวกเขาตั้งแต่เริ่ม จากเอกสารประกอบ :

คำสั่งในอนาคตได้รับการยอมรับและปฏิบัติเป็นพิเศษในเวลาคอมไพล์: การเปลี่ยนแปลงความหมายของโครงสร้างหลักมักถูกนำไปใช้โดยการสร้างรหัสที่แตกต่างกัน อาจเป็นกรณีที่คุณลักษณะใหม่แนะนำไวยากรณ์ใหม่ที่เข้ากันไม่ได้ (เช่นคำสงวนใหม่) ซึ่งในกรณีนี้คอมไพลเลอร์อาจต้องแยกวิเคราะห์โมดูลให้แตกต่างกัน การตัดสินใจดังกล่าวไม่สามารถปิดได้จนกว่าจะรันไทม์

เอกสารประกอบยังระบุด้วยว่าสิ่งเดียวที่สามารถนำหน้า__future__คำสั่งคือ docstring โมดูลข้อคิดเห็นบรรทัดว่างและข้อความอื่น ๆ ในอนาคต


1
First of all, from __future__ import print_function needs to be the first line of code in your script , ขอทราบสาเหตุ?
Avinash Raj

1
@UHMIS ทำend=' '.
Cyphase

14
ตามที่ระบุไว้ในเอกสาร ( docs.python.org/2/reference/simple_stmts.html#future ) ไม่จำเป็นต้องเป็นบรรทัดแรก : 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 ฉันแก้ไขเพื่อพูดถึงเรื่องนั้น แต่มันไม่ชัดเจนในย่อหน้าแรกฉันจึงแก้ไข ขอบคุณที่ชี้ให้เห็น
Cyphase

1
@AvinashRaj ไม่รู้; คุณต้องถาม UHMIS แต่อย่างที่ฉันพูดในความคิดเห็นสำหรับคำตอบของคุณบางที OP อาจทำการเปลี่ยนแปลงและไม่ได้พูดถึงมัน และแสดงความคิดเห็นครั้งแรกของ OP เป็นว่ายังคงมีข้อผิดพลาด
Cyphase
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.