如何在python中显示包的子包

时间:2018-10-18 15:43:21

标签: python python-3.x python-import

我有一个名为$('#demo tbody').html(<your data goes here>)的第三方库,从代码示例中我了解到它有一个子包a,即

b1

是否可以查看from a import b1 的所有子包?软件包a并不是纯python,从文件结构上还不能明显地看出子软件包。我尝试了a,但只显示了dir

的属性
a

1 个答案:

答案 0 :(得分:2)

如果程序包作者提供了程序包模块的显式索引,则约定是定义一个名为__all__的列表,其中包含该索引。因此,您可以执行以下操作来查看导入程序包的所有子模块/子程序包(示例将显示由程序包作者确定的所有json子模块):

import json

subs = json.__all__
print(subs)

# OUTPUT
# ['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder']

如果软件包作者未提供软件包模块的索引,则将其整理起来将更加困难。一种方法是使用dir,然后按类型对属性进行排序或过滤,以努力缩小到可能是子模块/子包的集合的范围。这是一个可能有用的示例。

import json

def sort_by_type(t):
    return t[0].__name__

attrs = [(type(getattr(json, attr)), attr) for attr in dir(json)]
attrs.sort(key=sort_by_type)
for t, n in attrs:
    print(t, n)

# OUTPUT
# <class 'json.decoder.JSONDecoder'> _default_decoder
# <class 'json.encoder.JSONEncoder'> _default_encoder
# <class '_frozen_importlib.ModuleSpec'> __spec__
# <class '_frozen_importlib_external.SourceFileLoader'> __loader__
# <class 'dict'> __builtins__
# <class 'function'> detect_encoding
# <class 'function'> dump
# <class 'function'> dumps
# <class 'function'> load
# <class 'function'> loads
# <class 'list'> __all__
# <class 'list'> __path__
# <class 'module'> codecs
# <class 'module'> decoder
# <class 'module'> encoder
# <class 'module'> scanner
# <class 'str'> __author__
# <class 'str'> __cached__
# <class 'str'> __doc__
# <class 'str'> __file__
# <class 'str'> __name__
# <class 'str'> __package__
# <class 'str'> __version__
# <class 'type'> JSONDecodeError
# <class 'type'> JSONDecoder
# <class 'type'> JSONEncoder