python中重复的导入路径模式

时间:2019-03-25 07:35:15

标签: python python-3.x

是否有其他方法可以防止在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

2 个答案:

答案 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),那么您很有可能应该重新考虑您的程序包结构。到那时,您实际上只是在射击自己。也许ca之外的独立软件包。或者,也许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