Python:将unicode字符串转换为原始对象/文本
我在Django应用中有一组键值对的字典,字典里的值是字符串类型。
{u'question': u'forms.CharField(max_length=512)'}
我需要把这个“值”的字符串转换成一个真正的对象,得到类似这样的结果。
properties = {
'question' : forms.CharField(max_lenth=512)
}
注意,第二个字典里的值是真正的Django表单字段,而不是字符串。我需要这样处理是为了创建动态表单。第二个字典将会传递给内置的“type”函数。你可以在这个页面找到示例代码。 http://dougalmatthews.com/articles/2009/dec/16/nicer-dynamic-forms-django/。
3 个回答
0
编辑:根据提问者的进一步说明,这个解决方案并不合适。
我不太清楚你面临的具体限制,但也许下面这种表示方式会更好:
{u'question': lambda: forms.CharField(max_length=512)}
然后你可以这样“实现”这些字段:
dict((k, v()) for (k, v) in props.iteritems())
3
如果你稍微调整一下你的表示方式:
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
根据你的代码,我建议把字段名称和字段属性分开:
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'])