如何在Python中抑制SyntaxWarning?
这是生成警告的代码行。
def myfunction():
from myimportfile import *
请注意:
不能选择在函数外导入文件。进口工作。无论如何它只会抛出一个SyntaxWarning。
- 醇>
warnings.simplefilter('忽略')将无效,因为警告是在代码实际运行之前生成的
例如,
def myfunction():
print 'trace 1'
from myimportfile import *
print 'trace 2'
将输出
SyntaxWarning
trace1
trace2
而不是
trace1
SyntaxWarning
trace2
那么,如何禁用警告?
是否可以单独禁用此特定代码行的警告?
答案 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('__')
而不是手动执行此操作。