Как отобразить подпакеты пакета в python - PullRequest
0 голосов
/ 18 октября 2018

У меня есть какая-то сторонняя библиотека с именем a, и из примеров кода, которые я узнал, у нее есть подпакет b1, т.е.

from a import b1

Можно ли увидеть все подпакеты a?Пакет a не является чистым python, и это не очевидно из структуры файла, чтобы указать подпакеты.Я пытался dir, но он показывает только атрибуты a

import a
dir(a)

1 Ответ

0 голосов
/ 18 октября 2018

Если автор пакета предоставил индекс экспликации для модулей пакета, то условием является определение списка с именем __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
...