Mengapa menggunakan dari __future__ impor print_function memecah cetak gaya Python2? [Tutup]

135

Saya baru dalam pemrograman dengan python, dan saya mencoba untuk mencetak dengan pemisah dan akhir tetapi masih memberi saya kesalahan sintaks.

Saya menggunakan python 2.7.

Ini kode saya:

from __future__ import print_function
import sys, os, time

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

Dan inilah kesalahannya:

$ python2 xy.py
  File "xy.py", line 5
    print x, sep=' ', end=''
          ^
SyntaxError: invalid syntax
$
UHMIS
sumber
4
Anda mengimpor cetakan sebagai fungsi tetapi Anda masih memperlakukannya sebagai pernyataan .
jonrsharpe
4
Anda tidak dapat memanggil cetak tanpa tanda kurung karena Anda telah mengubah cetak menjadi cetak fungsi (args)
Charlie Parker

Jawaban:

210

Pertama-tama, from __future__ import print_functionperlu baris kode pertama dalam skrip Anda (selain dari beberapa pengecualian yang disebutkan di bawah). Kedua, seperti jawaban lain katakan, Anda harus menggunakan printfungsi sekarang. Itulah intinya from __future__ import print_function; untuk membawa print fungsi dari Python 3 ke 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__pernyataan harus berada di dekat bagian atas file karena mereka mengubah hal-hal mendasar tentang bahasa, sehingga kompiler perlu mengetahuinya sejak awal. Dari dokumentasi :

Pernyataan di masa depan diakui dan diperlakukan secara khusus pada waktu kompilasi: Perubahan pada semantik konstruksi inti sering diimplementasikan dengan menghasilkan kode yang berbeda. Bahkan mungkin bahwa fitur baru memperkenalkan sintaksis yang tidak kompatibel baru (seperti kata yang dipesan baru), di mana kompiler mungkin perlu menguraikan modul secara berbeda. Keputusan semacam itu tidak dapat didorong sampai runtime.

Dokumentasi juga menyebutkan bahwa satu-satunya hal yang dapat mendahului __future__pernyataan adalah modul docstring, komentar, baris kosong, dan pernyataan masa depan lainnya.

Cyphase
sumber
1
First of all, from __future__ import print_function needs to be the first line of code in your script , Boleh saya tahu kenapa?
Avinash Raj
1
@UHMIS, lakukan end=' '.
Cyphase
14
Seperti yang dinyatakan oleh dokumentasi ( docs.python.org/2/reference/simple_stmts.html#future ) itu tidak harus menjadi baris pertama : 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, saya memang mengedit untuk menyebutkan itu, tapi tidak jelas di paragraf pertama, jadi saya memperbaikinya. Terima kasih telah menunjukkannya.
Cyphase
1
@AvinashRaj, saya tidak tahu; Anda harus bertanya kepada UHMIS. Tapi seperti yang saya katakan di komentar untuk jawaban Anda, mungkin OP melakukan perubahan dan tidak menyebutkannya. Dan komentar pertama OP adalah bahwa masih ada kesalahan.
Cyphase