3

如何在 Python 中抑制 SyntaxWarning?

这是生成警告的代码行。

def myfunction():
    from myimportfile import *

请注意:

  1. 在函数之外导入文件不是一种选择。导入工作。无论如何,它只是抛出一个 SyntaxWarning。

  2. warnings.simplefilter('ignore')将不起作用,因为警告是在代码实际运行之前生成的

例如,

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

将输出

SyntaxWarning  
trace1  
trace2  

并不是

trace1  
SyntaxWarning  
trace2  

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

4

1 回答 1

0

你试图做的不仅是一个坏主意,而且是非法的。正如文档所说:

with的from形式*只能出现在模块范围内。如果在函数中使用通配符形式的 import — import *— 并且该函数包含或者是具有自由变量的嵌套块,编译器将引发 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 个正常警告。)

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

  • 将导入移动到模块级别。
  • from myimportfile import foo, bar而不是*.
  • import myimportfile然后通过限定名称使用所有内容。

如果您绝对必须将所有内容myimportfile导入您的函数locals范围,那么您最好想出一种不合法的hacky方法,而不是解决警告的hacky方法。例如:

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

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

于 2013-04-11T00:50:26.760 回答