我目前有一个很深的对象,它是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}}
答案 0 :(得分:1)
type
,除非您非常确定。在这种情况下,你没有 - 尤其是检查bool
,因为Python具有可以被视为布尔值的灵活性!例如,如果给你None
怎么办?空字符串怎么样? []
怎么样?
此问题的解决方案是使用抽象基类(ABCs),它允许您准确指定对象应该能够执行的操作,而不是type
。 collections
模块附带了许多这些:
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)))