我有一个要导入的库的列表,但其中一些库可能不在文件系统中。你知道吗
基本上,我想这样做:
list_of_imports = ['from path1.path2.path3 import x', 'from path1.path2.path4 import y', 'from path1.path2.path3 import z', 'from path1.path2.path2 import a']
for statement in list_of_imports:
try:
execute statement
except:
ignore error and import the next statement
我之所以要这样做,是因为列表中的一些库可能不在文件系统中,而且我不希望一次失败就让整个文件抛出导入错误。你知道吗
我该怎么做?你知道吗
您可以这样尝试:
说明:
使用
exec()
迭代列表中的每个元素,可以执行那些import
语句。因此,如果没有错误,它将导入该模块首先,你可能真的不想这么做,如果你解释了你为什么这么想,我们可能会给你一个更好的方法。你知道吗
但在某些情况下,这可能是合理的。例如,我可以想象一个
PYTHONSTARTUP
文件为一个交互式会话预加载了一堆模块;作为一个交互式用户,您可以查看加载了什么并决定要做什么。你知道吗如果您只需要其中的一小部分,那么最好明确地这样做:
对于除交互式使用以外的任何其他用途,您实际上可能需要
x = None
而不是pass
,除非您希望在代码中包装一堆try:
/except NameError:
测试。你知道吗如果你想让每一个都是1行而不是4行,你可以用^{} 来做,代价是重复你自己:
如果您需要做一大堆这样的工作,那么最好还是编写一个包装函数,再次使用
importlib
:如果您有一个动态生成的模块列表,那么您需要弄清楚如何存储结果,因为您可能还需要动态地访问它们。一个明显的可能性是把它们放进一个字典里:
…或者,如果要跳过缺少的模块而不是使用
None
:…或者,如果这是准静态的,比如交互示例,可能是一个名称空间,所以您可以访问
mods.x
:…或者,如果您想将它们转储到全局变量中,这样您就可以作为
x
访问它们,这很简单:如果确实需要构建语句列表而不是模块列表,请使用^{} :
但是请注意,除了必须以这种方式比使用其他动态选项更频繁地重复自己之外,如果不解析
exec
块中的语句,您也不能做任何明智的事情,比如x = None
,因为否则您就没有名称x
。在本例中,这并不是很难做到的,但是它增加了更多的复杂性和代码的味道相关问题 更多 >
编程相关推荐