Вопрос:

Как получить ссылку на атрибуты текущего модуля в Python

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:01

5 плюса

2538 Репутация автора

Также проверьте встроенный модуль проверки . Это может быть очень удобно.

Автор: DrBloodmoney Размещён: 13.06.2009 05:32

148 плюса

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 на допустимых модулях в зависимости от перехвата
Автор: Andry Размещён: 02.11.2019 08:38
Вопросы из категории :
32x32