你试图做的不仅是一个坏主意,而且是非法的。正如文档所说:
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而不是手动执行。