Получить символ для определения в модуле в Python - PullRequest
0 голосов
/ 06 марта 2012

Я пишу интерпретатор для старого скриптового языка в игре, поэтому мне нужно скомпилировать словарь, в котором имя команды соответствует языку, сопоставленному с символом для этой функции.

Теперь я уже разобрался здесь: Как вызвать функцию на основе записи в списке?

... То, что вы можете вызывать функции таким образом, и я знаю, что вы можете использовать dir, чтобы получить список строк всех функций в модуле. Я смог получить этот список, и с помощью регулярных выражений удалил встроенные команды и все остальное, что я на самом деле не хочу, чтобы скрипт мог вызывать. Цель состоит в том, чтобы песочница здесь. :)

Теперь, когда у меня есть список элементов, которые определены в модуле, мне нужно получить символ для каждого определения.

Для более наглядного представления это тестовый модуль, для которого я хочу получить символ:

    def notify(stack,mufenv):
        print stack[-1]

Он загружается через скрипт инициализации, и я могу получить имя функции уведомления в списке, используя:

    import mufprims
    import re

    moddefs=dir(mufprims)
    primsfilter=re.compile('__.+__')
    primslist=[ 'mufprims.' + x for x in dir(mufprims) if not primsfilter.match(x) ]
    print primslist

Возвращает:

    ['mufprims.notify']

... которое является точным названием функции, для которой я хочу найти символ. Я перечитал http://docs.python.org/library/symtable.html здесь, но я не уверен, что понимаю это. Я думаю, что это ключ к тому, чего я хочу, но я не видел примера, который мог бы понять. Есть идеи, как получить символ для функций, которые я выбрал из списка?

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Я подумал, что мог бы добавить еще одно возможное предложение для получения функций объекта:

import inspect

# example using os.path
import os.path
results = inspect.getmembers(os.path, inspect.isroutine)

print results

# truncated result
[...,
('splitdrive', <function splitdrive at 0x1002bcb18>), 
('splitext', <function splitext at 0x1002bcb90>), 
('walk', <function walk at 0x1002bda28>)]

Использование dir на объекте, по сути, даст вам каждый элемент этого объекта, включая неотзываемые атрибуты и т. Д. Вы можете использовать модуль inspect, чтобы получить более контролируемый тип возвращаемого значения.

2 голосов
/ 06 марта 2012

Вы хотите получить функцию из модуля mufprims, используя getattr и имя функции.Вот так:

primslist=[getattr(mufprims, x) for x in dir(mufprims) if not primsfilter.match(x) ]
...