簡體   English   中英

print(“ hello world”,end ='')導致語法錯誤

[英]print(“hello world”, end=' ') causes syntax error

我創建了一個在其他程序中使用的模塊。 該模塊將打印一些文本,休眠一秒鍾,然后再打印一些文本(在同一行上,沒有任何空格)。 我正在運行python 2.7,並且from __future__ import print_function是程序中調用我的模塊的第一行,但是當我導入模塊時,出現此錯誤:

Traceback (most recent call last):
  File "C:\######\document.py", line 3
1, in <module>
    import mymodule
  File "C:\######\document.py", line 2
    print("hello world", end=' ')
                          ^
SyntaxError: invalid syntax

這是代碼:

def run():
    print("hello world", end =' ')
    time.sleep(0.5)
    print(".", end =' ')
    time.sleep(0.5)
    print(".", end =' ')
    time.sleep(0.5)
    print(".")
    time.sleep(0.25)

如何在不兩次導入print_function情況下解決此問題?

我正在運行python 2.7,並在調用我的模塊的程序中導入了print_function

那不行 您必須在此模塊中而不是在導入它的腳本或模塊中執行future語句。

有關詳細信息,請參見文檔 但簡短的版本是:future語句更改了模塊的編譯方式,因此Python必須能夠在模塊編譯時(而不僅僅是在運行時)看到它。 (這也是為什么它必須是文件中第一條非注釋/文檔字符串行的原因。)


好的,這樣就說明了解決方法,但沒有說明為什么會有問題,除非您已經知道何時進行模塊編譯。

稍微簡化一點: import spam (如果在此會話期間尚未import spam ),Python會尋找合適的spam.py文件。 如果找到一個,它然后尋找一個spam.pyc ,這比新spam.py 如果是這樣,它將執行該操作。 如果不是,則將spam.py編譯為spam.pyc ,然后執行它。

因此,由於將來的語句會影響代碼的編譯方式,因此,如果Python希望讓您的將來的語句影響您導入的其他模塊,則它必須為將來的語句的每種可能的組合(可能是spam.pyc存儲不同版本的spam.pyc spam.pycspam+print_function.pycspam+division.pycspam+print_function+division.pyc等。


最后:

如何在不兩次導入print_function的情況下解決此問題?

你真的不行 好吧, 可以 ,但是您不想這么做。 我能想到的最干凈,最簡單的方法是編寫一個導入鈎子 ,該鈎子將覆蓋用於查找和編譯.pyc文件的常規機制,以確保將import所有內容都視為已應用了所有將來的語句(可能使用我在上面做了一些半方面的建議,例如spam+print_function.pyc技巧,以確保您不會與普通的.pyc緩存文件發生沖突。(請參閱compile文檔,以獲取有關讓模塊繼承您將來的標志或指定它們的集合。)

如果聽起來真的很酷,那么學習Python的導入系統會很有趣,但是我強烈建議您等到至少升級到Python 3.4之前再這樣做,因為它已經做了很多更改,而且效果更好。 它更容易學習(特別是因為整個過程都是用Python編寫並有完整的文檔記錄,而不是將C語言代碼分散在三個不同的地方),並且更加靈活(因此您通常不必重復一半Python通常為您提供的功能,您只需替換要更改的那一部分即可)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM