代码之家  ›  专栏  ›  技术社区  ›  Boldewyn

如何用hasattr检查python中的子模块

  •  0
  • Boldewyn  · 技术社区  · 14 年前

    在运行时,python代码获取要加载的子模块的名称,我以前不知道。现在,我想检查一下,这个子模块是否存在于现有模块中。考虑这个结构,其中 foo bar 可以指定:

    master/
    |
    |- __init__.py
    |
    |- foo/
    |  |
    |  |- __init__.py
    |
    |- bar/
       |
       |- __init__.py
    

    现在,通常我这样做,它适用于def和变量:

    import master
    
    unknown_submodule = "foo"
    if hasattr(master, unknown_submodule):
        pass # all's well
    

    或者我正在抓取一个同样有效的属性错误。

    但是,有了上述的文件结构,我就不能提出这种方法并使其工作。 hasattr() 返回always false(也就是说,总是抛出attributeError)。

    如果我看 dir(master) ,我看到这个输出:

    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
    

    甚至明确规定 __all__ 在里面 master/__init__.py 不起作用,但将dir()更改为

    ['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
    

    有什么想法,我做错了什么,或者是否有一种方法来实现这些测试?(btw:python 2.6 on win/cygwin,如果有兴趣的话)

    3 回复  |  直到 10 年前
        1
  •  2
  •   Philipp    14 年前

    除非明确说明,否则子模块不是其父模块的属性。只需尝试导入模块并捕获 ImportError :

    try:
        __import__("os.peth", fromlist=[os])
    except ImportError:
        pass
    
        2
  •  1
  •   damir    14 年前

    你可以做到

    try:
     import module.submodule
    
    except ImportError:
      print 'failed or whatever'
    
        3
  •  1
  •   valentin    10 年前

    我最近不得不检查子模块的存在,因为我使用的是python 3.4.1,所以我对这个问题给出了一个新的答案:

    在python 3.4.1中,可以使用 importlib.util.find_spec(name, package=None) ( https://docs.python.org/3.4/library/importlib.html#importlib.util.find_spec )

    import importlib
    module_exists = importlib.util.find_spec('path.to.my.module')
    

    那容易)