是否有其他方法可以防止在python中导入模块时键入重复的长路径。
当前代码:
from a.b.c.d.e.f.g import g1
from a.b.c.d.e.f.g import g2
from a.b.c.d.e.f.g.h import h1
from a.b.c.d.e.f.g.i import i1
我尝试了以下代码:
ref_path = a.b.c.d.e.f.g
from ref_path import g1
from ref_path import g2
from ref_path.h import h1
from ref_path.i import i1
但是不幸的是,它没有用。我无法从a.b.c.d.e.f.g import *
开始使用,因为ref_path
中可能有太多模块。
如果我能够做到这一点,我可以轻松地从一个公共位置维护在不同模块中使用的不同公共ref_paths
。
答案 0 :(得分:8)
没有解决这个问题的奇迹。
但是,有一些策略可以使您的导入变得更好:
同时导入一个模块中的所有名称
代替
from a.b.c.d.e.f.g import g1
from a.b.c.d.e.f.g import g2
使用
from a.b.c.d.e.f.g import g1, g2
使用相对导入(如果要在自己的程序包中导入)
假设此导入发生在a.b.c.d.e
中,则可以替换
from a.b.c.d.e.f.g.h import h1
使用
from .f.g.h import h1
如果您在同级(子)模块中,这也适用。例如,如果此导入是在a.b.c.d.e.x.y
进行的,则可以使用
from ...f.g.h import h1
有关相对导入的更多详细信息,请参见
重构您的软件包(如果是您自己的代码)
如果您的程序包具有4个以上级别的子模块(例如a.b.c.d.e
),那么您很有可能应该重新考虑您的程序包结构。到那时,您实际上只是在射击自己。也许c
是a
之外的独立软件包。或者,也许e
并不一定要放在d
内部,而可以上移一到两个级别。引用Python的Zen:Flat比嵌套更好。
importlib.import_module
有人建议这样做:
import importlib
ref_path = 'a.b.c.d.e.f.g'
g1 = importlib.import_module(ref_path).g1
h1 = importlib.import_module(ref_path).h.h1
这绝对没有用。现在,您必须写importlib.import_module(ref_path)
而不是from a.b.c.d.e.f import
。不短。它不可读。这不过是下一个建议的更详细的版本。 (请继续阅读...)
将a.b.c.d.e.f
分配给变量
下一个建议是:
import a.b.c.d.e.f.g as ref
g1 = ref.g1
h1 = ref.h.h1
这看起来不错,但并不总是有效。如果g
模块没有自动导入h
子模块,则此代码将引发AttributeError。演示:
>>> import urllib as ref
>>> urlopen = ref.request.urlopen
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'urllib' has no attribute 'request'
>>>
>>> from urllib.request import urlopen # this works, though
>>>
如果这是在您自己的程序包中,则此解决方案还有一个缺点:您的IDE很可能不理解您的导入,并且如果您重构程序包结构,也不会自动为您更新它们。从长远来看,老式的import
语句更易于维护。
答案 1 :(得分:7)
您可以尝试如下使用async created() {
try {
// This will wait until promise resolve
const response = await axios.get('api/studentlecture');
this.id = response.data;
console.log(this.id);
} catch(error) {
console.log(error)
}
}
:
importlib
编辑:另一种方法是将引用路径作为包导入,然后将子模块分配给局部变量,如下所示:
import importlib
ref_path = 'a.b.c.d.e.f.g'
g1 = importlib.import_module(ref_path).g1
h1 = importlib.import_module(ref_path).h.h1