如何在 python 中显示包的子包
How to display the subpackages of a package in python
我有一些名为 a
的第三方库,从代码示例中我了解到它有一个子包 b1
,即
from a import b1
是否可以看到a
的所有分包?包 a
不是纯 python 并且从文件结构上看分包不明显。我试过 dir
但它只显示 a
的属性
import a
dir(a)
如果包作者提供了包模块的显式索引,那么约定是定义一个名为 __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
我有一些名为 a
的第三方库,从代码示例中我了解到它有一个子包 b1
,即
from a import b1
是否可以看到a
的所有分包?包 a
不是纯 python 并且从文件结构上看分包不明显。我试过 dir
但它只显示 a
import a
dir(a)
如果包作者提供了包模块的显式索引,那么约定是定义一个名为 __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