Как получить ссылку на атрибуты текущего модуля в Python
76790 просмотра
4 ответа
4447 Репутация автора
То, что я пытаюсь сделать, будет выглядеть так в командной строке:
>>> import mymodule
>>> names = dir(mymodule)
Как я могу получить ссылку на все имена, определенные mymodule
внутри mymodule
себя?
Что-то вроде этого:
# mymodule.py
names = dir(__thismodule__)
Автор: guillermooo
Источник
Размещён: 13.06.2009 09:45
Ответы (4)
126 плюса
2263 Репутация автора
Просто используйте глобалы ()
globals () - возвращает словарь, представляющий текущую таблицу глобальных символов. Это всегда словарь текущего модуля (внутри функции или метода это модуль, в котором он определен, а не модуль, из которого он вызывается).
http://docs.python.org/library/functions.html#globals
Автор: Maciej Pasternacki Размещён: 13.06.2009 10:015 плюса
2538 Репутация автора
Также проверьте встроенный модуль проверки . Это может быть очень удобно.
Автор: DrBloodmoney Размещён: 13.06.2009 05:32148 плюса
3513 Репутация автора
Как упоминалось ранее, globals предоставляет вам словарь, а не dir (), который дает список имен, определенных в модуле. То, как я обычно это вижу, выглядит так:
import sys
dir(sys.modules[__name__])
Автор: jamesls
Размещён: 13.06.2009 05:53
0 плюса
762 Репутация автора
Возможно, уже поздно отвечать, но я не нашел правильный ответ для себя. Самое близкое и точное решение (быстрее чем inspect.stack()
) в питоне 3.7.x
:
# search for first module in the stack
stack_frame = inspect.currentframe()
while stack_frame:
print('***', stack_frame.f_code.co_name, stack_frame.f_code.co_filename, stack_frame.f_lineno)
if stack_frame.f_code.co_name == '<module>':
caller_module = inspect.getmodule(stack_frame)
if not caller_module is None:
#... do something here ...
break
stack_frame = stack_frame.f_back
Плюсы :
- Точнее, чем
globals()
метод - Не зависит от промежуточных кадров стека, которые могут быть добавлены, например, с помощью перехвата или такими инструментами 3dparty, как
pytest
:
*** foo ... ..
*** boo ... ..
*** runtest c:\python\x86\37\lib\site-packages\xonsh\pytest_plugin.py 58
*** pytest_runtest_call c:\python\x86\37\lib\site-packages\_pytest\runner.py 125
*** _multicall c:\python\x86\37\lib\site-packages\pluggy\callers.py 187
*** <lambda> c:\python\x86\37\lib\site-packages\pluggy\manager.py 86
*** _hookexec c:\python\x86\37\lib\site-packages\pluggy\manager.py 92
*** __call__ c:\python\x86\37\lib\site-packages\pluggy\hooks.py 286
*** <lambda> c:\python\x86\37\lib\site-packages\_pytest\runner.py 201
*** from_call c:\python\x86\37\lib\site-packages\_pytest\runner.py 229
*** call_runtest_hook c:\python\x86\37\lib\site-packages\_pytest\runner.py 201
*** call_and_report c:\python\x86\37\lib\site-packages\_pytest\runner.py 176
*** runtestprotocol c:\python\x86\37\lib\site-packages\_pytest\runner.py 95
*** pytest_runtest_protocol c:\python\x86\37\lib\site-packages\_pytest\runner.py 80
*** _multicall c:\python\x86\37\lib\site-packages\pluggy\callers.py 187
*** <lambda> c:\python\x86\37\lib\site-packages\pluggy\manager.py 86
*** _hookexec c:\python\x86\37\lib\site-packages\pluggy\manager.py 92
*** __call__ c:\python\x86\37\lib\site-packages\pluggy\hooks.py 286
*** pytest_runtestloop c:\python\x86\37\lib\site-packages\_pytest\main.py 258
*** _multicall c:\python\x86\37\lib\site-packages\pluggy\callers.py 187
*** <lambda> c:\python\x86\37\lib\site-packages\pluggy\manager.py 86
*** _hookexec c:\python\x86\37\lib\site-packages\pluggy\manager.py 92
*** __call__ c:\python\x86\37\lib\site-packages\pluggy\hooks.py 286
*** _main c:\python\x86\37\lib\site-packages\_pytest\main.py 237
*** wrap_session c:\python\x86\37\lib\site-packages\_pytest\main.py 193
*** pytest_cmdline_main c:\python\x86\37\lib\site-packages\_pytest\main.py 230
*** _multicall c:\python\x86\37\lib\site-packages\pluggy\callers.py 187
*** <lambda> c:\python\x86\37\lib\site-packages\pluggy\manager.py 86
*** _hookexec c:\python\x86\37\lib\site-packages\pluggy\manager.py 92
*** __call__ c:\python\x86\37\lib\site-packages\pluggy\hooks.py 286
*** main c:\python\x86\37\lib\site-packages\_pytest\config\__init__.py 90
*** <module> c:\Python\x86\37\Scripts\pytest.exe\__main__.py 7
Минусы:
- В некотором смысле очень точный и может возвращать модули, зарегистрированные в исполняемом файле, например, для
pytest.exe
которых может не быть то, что вам нужно. inspect.getmodule
все еще может возвращать None на допустимых модулях в зависимости от перехвата
Вопросы из категории :
- python Обработка XML в Python
- python Как я могу использовать Python itertools.groupby ()?
- python Python: На какой ОС я работаю?
- python Как я могу создать непосредственно исполняемое кроссплатформенное приложение с графическим интерфейсом на Python?
- python Вызов функции модуля с использованием его имени (строки)
- python Звук Питона («Колокол»)
- python Regex и unicode
- python Создать зашифрованный ZIP-файл в Python
- python Создайте базовый итератор Python
- python Функция транспонирования / распаковки (обратная сторона zip)?
- python Каков наилучший способ разбора аргументов командной строки?
- python Формат чисел в строки в Python
- python Как загрузить файл через HTTP с помощью Python?
- python Is there any difference between "foo is None" and "foo == None"?
- python Как запустить сценарий Python как службу в Windows?
- python Нахождение каких методов у объекта Python
- python Как отсортировать список строк?
- python Что ** (двойная звезда / звездочка) и * (звездочка / звездочка) делают для параметров?
- python What is the purpose of class methods?
- python Какой лучший способ вернуть несколько значений из функции в Python?