Как преобразовать кортеж строки (расположение объектов) в словарь объектов в Python - PullRequest
0 голосов
/ 09 февраля 2010

Я хотел бы преобразовать кортеж:

TEST_CLASSES = (
   'common.test.TestClass',
)

до

TEST_CLASSES = {
   'test': common.test.TestClass,
}

Как сделать словарь просто, но у меня проблема с преобразованием строки в объект. Кто-нибудь может мне помочь, пожалуйста? спасибо!

Ответы [ 4 ]

1 голос
/ 09 февраля 2010

Насколько я понимаю, вы пытаетесь получить класс по строковому имени. Возник подобный вопрос: Как динамически загрузить класс Python

1 голос
/ 09 февраля 2010

Вы можете использовать eval, что может быть зло , если ваши входные данные небезопасны:

>>> import os
>>> eval('os.path.join')
<function join at 0x00BBA2B8>

если common.test.TestClass не существует в текущем пространстве имен, то NameError будет повышено:

>>> eval('math.isnan')
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    eval('math.isnan')
  File "<string>", line 1, in <module>
NameError: name 'math' is not defined
0 голосов
/ 09 февраля 2010

Простой и часто не рекомендуемый способ использования eval.

Просто делаю:

obj = eval('common.test.TestClass') 

Даст вам объект, указанный в строке.

Другими, более изящными способами, может быть запрос каждого объекта в цепочке на предмет следующего атрибута - вы можете проверить это следующим образом:

string = 'common.test.TestClass'

# this retrieves the topmost name, supposedly a module, as an object:
obj = globals()[string.split(".")[0]]

# And retrieve each subobject object therein:
for part in string.split(".")[1:]:     
    obj = getattr(obj, part)

Если часть вашего пути к объекту является еще не импортированным подмодулем, то это не сработает - вам нужно «выполнить» инструкцию import для получения модуля - Exec является «более сильной» формой eval , который поддерживает операторы, а eval зарезервирован только для выражений.

0 голосов
/ 09 февраля 2010

Вы не можете напрямую «преобразовать строку в объект» (хотя в техническом смысле строки являются объектами), но вы можете использовать функцию, которая может импортировать объекты для вас. В модуле Werkzeug werkzeug.utils есть функция с именем import_string, которая делает именно это ( источник здесь ).

(Я предполагаю, что нужные вам объекты должны быть импортированы из модулей.)

Итак, если вы используете аналогичную функцию import_string, вы можете преобразовать кортеж в словарь с помощью:

test_classes = {}
for path in TEST_CLASSES:
    obj = import_string(path)
    test_classes[obj.__module__.split('.')[-1]] = obj
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...