簡體   English   中英

如何在Python中將unicode對象轉換為普通對象

[英]How to convert unicode objects to normal objects in Python

我目前有一個很深的物體,而且全部都是Unicode(可悲的)。

我要說的是變量要么是字典,要么是布爾。 在這種情況下,我會

if type( my_variable ) is BooleanType:

但這不會觸發,因為所有值的類型實際上都是Unicode。

如何將這個unicode對象轉換為普通對象,以便可以正確讀取類型而不破壞數據?

謝謝!

這是print(repr(variable))的結果。 它顯示了布爾人不是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}}

除非您真的很確定要使用,否則不要使用type

在這種情況下,您不必-尤其是檢查bool ,因為Python可以靈活地視為布爾值! 舉例來說,如果你給出什么None 空字符串呢? 怎么樣[]

解決此問題的方法是使用抽象基類(ABC),該基類使您可以精確地指定對象應該執行的操作,而不是指定對象的type collections模塊附帶了許多這樣的功能:

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

這允許任何“字典式”的東西,以便您保留多態性。 如果您需要更仔細的說明(“我需要__getitem____delitem__但不一定要__setitem__ !”),則可以編寫自己的代碼-參見初學者收藏模塊中源ABC的定義。

您確定要使用此功能嗎? 如果您正確執行操作(使用ABC),這並不是一個天生的壞主意,但這並不是說您應該濫用它!


編輯:我不確定您是否了解Unicode是什么或Python如何處理它。 這是Python 2.x和Python 3.x之間的主要區別之一,您在使用哪個?

重新編輯:嗯,好的,您正在使用Python 2.x,並且您有一個帶有Unicode字符串鍵的字典。 我不確定您在做什么會導致問題,因為Unicode字符串的工作原理基本上與普通字符串一樣。 上面的MutableMapping檢查將正常工作。

也許您應該了解漂亮的打印模塊,因為它可以使您檢查事物(即使我同意您也陷入混亂。這通常是由於結果遞歸而產生了錯誤的結果,例如執行附加操作,而您應該對列表進行擴展) )

在這里,您的變量內容非常漂亮:

{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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM