четверг, 12 января 2012 г.

Иcследование python кода

Интроспекция(англ. type introspection) в программировании — возможность в некоторых объектно-ориентированных языках определить тип и структуру объекта во время выполнения программы. Wikipedia. Для python эта возможность интегрирована в сам язык. Хороший пример интроспекции в python - встроенная система помощи. Для любого кода на python достаточно набрать в командной строке:
$ pydoc "module/class/function name"
как результат будет получено описание по модулю, классу или функции (см. примечание к посту ниже).

Наибольший интерес представляет возможность анализа программы другой программой. В рамках проекта pyflowctrl это может быть очень полезной функциональностью, когда менеджер процессов ProcessFlow получает информации о процессах и осуществляет соединение на основании характеристик входных/выходных потоков.

Процесс PyMetaInfo позволяет провести анализ кода переданного имени модуля и вернуть метаданные в виде словаря. Пример использования процесса приведен в коде examples/pymetainfo1.py. На вход процесса передается пакет, содержащий имя модуля packet.module:
$ python examples/pymetainfo1.py pyflowctrl
{'__namespaces': {},
 'meta': {'data': [('__author__', 'Andrey Usov ')],
          'description': 'Python Flow Control Library ',
          'module_packages': ['core4 (package)',
                              'examples (package)',
                              'libs (package)',
                              'processes (package)',
                              'streams (package)'],
          'name': 'pyflowctrl',
          'submodules': [('core4',
                          )],
          'type': },
 'module': 'pyflowctrl'}
На выходе получаем пакет с метаданными о библиотете. Пример вывода информации о процессе:
$ python examples/pymetainfo1.py pyflowctrl.core4.processes.pymetainfo1.PyMetaInfo
{'__namespaces': {},
 'meta': {'based_on': (,),
          'classes': [('__class__', , )],
          'data': [('__dict__',
                    dict_proxy({'__module__': 'pyflowctrl.core4.processes.pymetainfo1', 'get_elements': , 'get_classes': , 'get_modpkgs': , 'get_metadata': , 'main': , '__doc__': ' Extact metadata information about module/class ', '__init__': })),
                   ('__weakref__',
                    )],
          'description': 'Extact metadata information about module/class ',
          'funcs': [('__delattr__',
                     ),
      
                    . . .

                    ('get_classes', ),
                    ('get_elements',
                     ),
                    ('get_metadata',
                     ),
                    ('get_modpkgs', ),
                    ('main', ),
                    ('run_once', )],
          'name': 'PyMetaInfo',
          'type': },
 'module': 'pyflowctrl.core4.processes.pymetainfo1.PyMetaInfo'}
Информация в выводе достаточно избыточна для работы pyflowctrl, отсутствует информация о потоках. Так как потоки создаются в __init__(), провести анализ содержимого объекта без его создания не получится. Необходимо пересмотреть принципы создания процессов для того, что бы существовала возможность получения информации о потоках без создания самого процесса.

Примечание: документация в python формируется автоматически на основании анализа кода объекта. При вызове pydoc выполняет импорт кода и проводит анализ его структуры, извлекает документацию.

0 комментариев:

Отправить комментарий