Как преобразовать строку в имя переменной? - PullRequest
8 голосов
/ 25 мая 2011

Я хотел бы знать, как преобразовать строковый ввод в имя переменной для использования в коде Python. Конкретный пример:

def insrospect(foo, bar):
    requested_module = makestringvariable(foo)
    requested_object = makestringvariable(bar)
    import requested_module
    for item in inspect.getmemebers(requested_module.requested_object):
        member = makestringvariable(item[0])
        if callable(requested_object.member):
           print item

if __name__ == '__main__':
    introspect(somemodule, someobject)

Итак, здесь выше, поскольку я не знаю, какой модуль анализировать перед запуском, мне нужно преобразовать строку в используемое имя модуля, и, поскольку getmembers() возвращает элементы в виде строк, мне также необходимо преобразовать их в пригодный для использования имена переменных, чтобы проверить, могут ли они быть вызваны.

Есть ли такая функция makestringvariable()?

Ответы [ 3 ]

11 голосов
/ 25 мая 2011

с помощью функции __ import __ и магии getattr , вы сможете написать следующее:

import importlib
def introspect(foo, bar):
    imported_module = importlib.import_module(foo)
    imported_object = getattr(imported_module, bar)
    for item in inspect.getmembers(imported_object):
        if callable(getattr(imported_object, item[0]):
           print item

if __name__ == '__main__':
    introspect(somemodule, someobject)
5 голосов
/ 25 мая 2011

Вы не можете преобразовать строку в переменную как таковую, потому что переменные являются частью вашего кода , а не ваших данных .Обычно, если вам нужны «переменные переменные», вы должны использовать dict:

data = {
    foo: foo_value,
    bar: bar_value
}

И затем использовать data[foo] вместо попытки использовать foo в качестве переменной.Однако в этом примере вы на самом деле спрашиваете об импорте модуля через строку и о получении атрибутов с использованием имени строки, оба из которых являются услугами, предоставляемыми Python: через функции __import__ и getattr.

3 голосов
/ 25 мая 2011

Члены модуля - это просто атрибуты этого модуля, поэтому вы можете использовать getattr для объекта модуля для их извлечения.

Сами объекты модуля хранятся в словаре sys.modules:

module = sys.modules[modulename]
member = getattr(module, membername)
...