Python:将unicode字符串转换为原始对象/文本

0 投票
3 回答
1596 浏览
提问于 2025-04-16 13:39

我在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'])

撰写回答