如何在Python中抑制SyntaxWarning?

时间:2013-04-11 00:09:39

标签: python warnings suppress-warnings

如何在Python中抑制SyntaxWarning?

这是生成警告的代码行。

def myfunction():
    from myimportfile import *

请注意:

  
      
  1. 不能选择在函数外导入文件。进口工作。无论如何它只会抛出一个SyntaxWarning。

  2.   
  3. warnings.simplefilter('忽略')将无效,因为警告是在代码实际运行之前生成的

  4.   

例如,

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

将输出

SyntaxWarning  
trace1  
trace2  

而不是

trace1  
SyntaxWarning  
trace2  

那么,如何禁用警告?
是否可以单独禁用此特定代码行的警告?

1 个答案:

答案 0 :(得分:3)

你要做的不仅仅是一个坏主意,这是非法的。正如the documentation所说:

  带有from的{​​{1}}表单可能只出现在模块范围内。如果导入的通配符形式 - * - 在函数中使用,并且函数包含或是带有自由变量的嵌套块,则编译器将引发SyntaxError。

在过渡版本中(在我的头顶,在这种情况下,我认为是2.6,2.7和3.0,但不要引用我),错误可能是一个警告。但是,如果您升级到更高版本,或者可能只是使用相同版本的不同实现,则会收到实际错误。 (对于更高版本:你肯定会在CPython 3.3中出现错误。对于相同版本的不同实现:我使用PyPy 1.9.0 beta和PyPy 1.9.0 final测试,它们都实现了Python 2.7; beta打印出3个警告然后引发异常,最后在屏幕上水平散布3个警告,然后再打印3个正常警告。)

如果可能,您应该执行以下一项(或多项):

  • 将导入移至模块级别。
  • import *代替from myimportfile import foo, bar
  • *然后按限定名称使用所有内容。

如果您绝对必须将import myimportfile中的所有内容导入到您的函数的myimportfile范围内,那么您最好采用一种黑客的方式来做到这一点并非违法,而不是采用hacky方式解决警告。例如:

locals

这个简单的版本没有完全相同的效果,但你可以尽可能接近。例如,要执行常规限制,请在import myimportfile locals().update(myimportfile.__dict__) (如果存在)或name in myimportfile.__all__上进行过滤。或者,如果您使用的是3.1或更高版本,请使用not name.startswith('_') or name.startswith('__') and name.endswith('__')而不是手动执行此操作。