2013-04-11 84 views
0

如何在Python中抑制SyntaxWarning?如何在Python中抑制SyntaxWarning?

下面是生成警告的代碼行。

def myfunction(): 
    from myimportfile import * 

請注意:

  1. 導入功能之外的文件是不是一種選擇。導入工作。無論如何它只會拋出一個SyntaxWarning。

  2. warnings.simplefilter( '忽略'),因爲生成警告將無法​​正常工作之前的代碼是實際運行

例如,

def myfunction(): 
    print 'trace 1' 
    from myimportfile import * 
    print 'trace 2' 

將輸出

SyntaxWarning 
trace1 
trace2 

而不是

trace1 
SyntaxWarning 
trace2 

那麼,如何禁用警告?
是否可以單獨禁用此特定行代碼的警告?

+2

你的python版本是什麼? 另外,以這種方式導入並不是最好的想法。你最好在你的代碼文件的頂部導入 – inspectorG4dget 2013-04-11 00:16:35

+1

這個警告是因爲,正如它所說,「import *只允許在模塊級別」。這是Python的更高版本中的錯誤。它也可能大幅度擴大你的功能的當地人,這是一件壞事。爲什麼不能只從'myimportfile'導入a,b'或'import myimportfile'並使用限定名稱,或者將導入移動到模塊級別? – abarnert 2013-04-11 00:38:50

回答

2

你想要做的不只是一個壞主意,它是非法的。正如the documentation說:

from形式*可以只發生在一個模塊範圍。如果在函數中使用導入的通配符表格 - import * - 並且該函數包含或者是包含自由變量的嵌套塊,則編譯器將引發一個SyntaxError。

在過渡版(在我的頭頂,在這種情況下,我認爲這是2.6,2.7和3.0,但不引用我)那個錯誤可能是一個警告,而不是。但是,如果您升級到更高版本,或者可能只是使用相同版本的其他實現,則會發生實際錯誤。 (對於更高版本:在CPython 3.3中肯定會出錯,對於同一版本的不同實現:我使用PyPy 1.9.0 beta和PyPy 1.9.0 final進行了測試,它們都實現了Python 2.7;測試版打印出3條警告然後拋出一個異常,最終滲出物3個警告在屏幕上橫向分散,然後打印3個正常的警告)

如果可能的話,你應該做以下的一個(或多個):

  • 將導入移至模塊級別。
  • from myimportfile import foo, bar而不是*
  • import myimportfile然後按限定名稱使用所有內容。

如果你絕對必須在myimportfile給你的函數的locals範圍導入的一切,你最好拿出一個哈克的方式做到這一點是不違法的,而不是一個哈克的方式來解決警告。例如:

import myimportfile 
locals().update(myimportfile.__dict__) 

這個微不足道的版本並沒有完全相同的效果,但您可以儘可能地接近您的想法。例如,要執行常規限制,請在name in myimportfile.__all__(如果存在)或not name.startswith('_') or name.startswith('__') and name.endswith('__')上進行過濾。或者,如果您使用3.1或更高版本,請使用importlib而不是手動執行。