如何在Python中将unicode对象转换为普通对象

时间:2010-08-19 08:51:12

标签: python unicode

我目前有一个很深的对象,它是unicode(遗憾的是)。

我要变量要么是dict,要么是bool。在这种情况下,我做

if type( my_variable ) is BooleanType:

但是这不会被触发,因为类型实际上是所有值的Unicode。

如何将此unicode对象转换为普通对象,以便在不破坏数据的情况下正确读取类型?

谢谢!

这是print(repr(变量))的结果。它显示Bools不是unicode(不像我第一次),但仍然给我带来麻烦。

{u'forms': {u'financing': {u'view': True, u'delete': True}, u'employment': {u'view': True, u'delete': True}, u'service': {u'view': True, u'delete': True}}, u'content': {u'articles': {u'edit': True, u'add': True, u'view': True, u'delete': True}, u'slideshow': {u'edit': True, u'view': True}, u'pages': {u'edit': True, u'add': True, u'view': True, u'delete': True}}, u'people': {u'edit': True, u'sort-staff': True, u'sort-riders': True, u'add': True, u'delete': True, u'view': True}, u'events': {u'edit': True, u'add': True, u'view': True, u'delete': True}, u'settings': {u'edit': True, u'view': True}}

2 个答案:

答案 0 :(得分:1)

请不要使用type,除非您非常确定

在这种情况下,你没有 - 尤其是检查bool,因为Python具有可以被视为布尔值的灵活性!例如,如果给你None怎么办?空字符串怎么样? []怎么样?

此问题的解决方案是使用抽象基类(ABCs),它允许您准确指定对象应该能够执行的操作,而不是typecollections模块附带了许多这些:

import collections
if isinstance( ..., collections.MutableMapping ):
    ...

这允许任何'类字典',以便保留多态性。如果您需要更仔细的规范(“我想要__getitem____delitem__但不一定是__setitem__!”),您可以编写自己的规范 - 请参阅源代码中的ABCs定义初学者的收藏模块。

您确定要使用此功能吗?如果你做得正确(使用ABCs),这不是一个天生就是坏主意,但这并不是说你应该滥用它!


编辑:我不确定您是否了解Unicode是什么或Python如何处理它。这是Python 2.x和Python 3.x之间的主要区别之一,您使用的是什么?

重新编辑:啊,好吧,你正在使用Python 2.x并且你有一个带有Unicode字符串键的字典。我不确定你做了什么导致了问题,因为Unicode字符串基本上就像普通的字符串一样。上面的MutableMapping检查可以正常使用。

答案 1 :(得分:0)

也许你应该了解漂亮的打印模块,因为它会让你检查一下(甚至我同意你把自己弄得一团糟。这通常是因为结果错误的结果递归,例如做追加,当你应该做的时候扩展列表)

这里你的变量内容很漂亮:

{u'content': {u'articles': {u'add': True,
                            u'delete': True,
                            u'edit': True,
                            u'view': True},
              u'pages': {u'add': True,
                         u'delete': True,
                         u'edit': True,
                         u'view': True},
              u'slideshow': {u'edit': True, u'view': True}},
 u'events': {u'add': True, u'delete': True, u'edit': True, u'view': True},
 u'forms': {u'employment': {u'delete': True, u'view': True},
            u'financing': {u'delete': True, u'view': True},
            u'service': {u'delete': True, u'view': True}},
 u'people': {u'add': True,
             u'delete': True,
             u'edit': True,
             u'sort-riders': True,
             u'sort-staff': True,
             u'view': True},
 u'settings': {u'edit': True, u'view': True}}

从这一点来看,很明显你只有真值,而不是假。这些值的用例是什么?为什么例如你没有使用set:{u'add',u'delete',u'edit',u'sort-riders',...}?

from pprint import pprint

def alternative(yourdict):
    for key in yourdict:
        if yourdict[key] is True:
            yield set(yourdict.keys())
            break
        else:
            yield tuple((key,tup) for tup in alternative(yourdict[key]))

my_variable = {u'forms': {u'financing': {u'view': True, u'delete': True}, u'employment': {u'view': True, u'delete': True}, u'service': {u'view': True, u'delete': True}}, u'content': {u'articles': {u'edit': True, u'add': True, u'view': True, u'delete': True}, u'slideshow': {u'edit': True, u'view': True}, u'pages': {u'edit': True, u'add': True, u'view': True, u'delete': True}}, u'people': {u'edit': True, u'sort-staff': True, u'sort-riders': True, u'add': True, u'delete': True, u'view': True}, u'events': {u'edit': True, u'add': True, u'view': True, u'delete': True}, u'settings': {u'edit': True, u'view': True}}
pprint(my_variable)

print 50 * '-'
print 'Alternative datastructure'
pprint(tuple(alternative(my_variable)))