Импортировать модуль python в dict (для использования в качестве глобальных переменных в execfile ())? - PullRequest
6 голосов
/ 28 декабря 2011

Я использую функцию Python execfile() в качестве простого, но гибкого способа работы с файлами конфигурации - по сути, идея такова:

# Evaluate the 'filename' file into the dictionary 'foo'.
foo = {}
execfile(filename, foo)

# Process all 'Bar' items in the dictionary.
for item in foo:
  if isinstance(item, Bar):
    # process item

Для этого требуется, чтобы у моего файла конфигурации был доступк определению класса Bar.В этом простом примере это тривиально;мы можем просто определить foo = {'Bar' : Bar}, а не пустой диктат.Однако в реальном примере у меня есть целый модуль, который я хочу загрузить.Один очевидный синтаксис для этого:

foo = {}
eval('from BarModule import *', foo)
execfile(filename, foo)

Тем не менее, я уже импортировал BarModule в мой файл верхнего уровня, поэтому мне кажется, что я должен иметь возможность просто определить foo какмножество вещей, определенных BarModule, без необходимости проходить через эту цепочку eval и import.

Есть ли простой идиоматический способ сделать это?

Ответы [ 3 ]

8 голосов
/ 28 декабря 2011

Может быть, вы можете использовать __dict__, определенный модулем.

>>> import os
>>> str = 'getcwd()'
>>> eval(str,os.__dict__)
6 голосов
/ 23 апреля 2015

Используйте встроенную функцию vars(), чтобы получить атрибуты объекта (например, модуля) в качестве диктанта.

1 голос
/ 26 февраля 2012

Типичным решением является использование getattr:

>>> s = 'getcwd'
>>> getattr(os, s)()
...