Python: преобразовать строку Юникода в необработанный объект / текст - PullRequest
0 голосов
/ 14 марта 2011

В моем приложении Django есть словарь пар ключей и значений.Значение в словаре является строковым типом.

{u'question': u'forms.CharField(max_length=512)'}

Мне нужно преобразовать эту строку «значения» в реальный объект и получить что-то вроде этого.

properties = {
    'question' : forms.CharField(max_lenth=512)
    }

Обратите внимание, что значения во втором словаре являются фактическими полями формы Django, а НЕ строками.Мне нужно сделать эту манипуляцию для создания динамических форм.Второй словарь должен быть передан встроенной функции типа.Пример кода можно найти на этой странице.http://dougalmatthews.com/articles/2009/dec/16/nicer-dynamic-forms-django/.

Ответы [ 3 ]

3 голосов
/ 14 марта 2011

Если вы немного измените свое представление:

fields = {u'question': u'{"field": "django.forms.CharField", "params": {"max_length": 512}}'}

, тогда вы можете использовать следующее:

from django.utils import importlib, simplejson

def get_field(fname):
  module, name = fname.rsplit('.', 1)
  return getattr(importlib.import_module(module), name)

print dict((k.encode('ascii', 'ignore'), get_field(v['field'])(**v['params']))
  for k, v in ((k, simplejson.loads(v)) for k, v in fields.iteritems()))
1 голос
/ 14 марта 2011

Следуя вашему коду, я предлагаю отделить имя поля от атрибута поля:

my_fields = {u'question': {'name': 'CharField', 'attrs': {'max_length': 512} }} 

, а затем что-то вроде:

properties = {}
for field_name, field_def in my_fields.items():
    properties[field_name] = getattr(forms, field_def['name'])(**field_def['attrs'])
0 голосов
/ 14 марта 2011

РЕДАКТИРОВАТЬ: Судя по поясняющим комментариям ОП, это неуместное решение.


Я не знаю, какие у вас ограничения, но, возможно,следующее представление будет работать лучше:

{u'question': lambda: forms.CharField(max_length=512)}

Затем вы можете «реализовать» поля следующим образом:

dict((k, v()) for (k, v) in props.iteritems())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...