Как преобразовать объекты Unicode в обычные объекты в Python - PullRequest
0 голосов
/ 19 августа 2010

В настоящее время у меня есть глубокий объект, и все это в юникоде (к сожалению).

Я дошел до того, что переменная будет либо диктатом, либо булом.В этом случае я делаю

if type( my_variable ) is BooleanType:

Но это не срабатывает, потому что тип на самом деле является Unicode для всех значений.

Как преобразовать этот объект Unicode внормальный объект, чтобы я мог правильно прочитать тип, не уничтожая данные?

Спасибо!

Вот результат печати (repr (переменная)).Это показывает, что Bools не являются юникодом (в отличие от того, что я сначала сделал), но все еще доставляют мне неприятности.

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

1 голос
/ 19 августа 2010

Не используйте type, если вы не действительно уверены, , что вы хотите.

В этом случае вам не нужно - особенно проверять bool, учитывая гибкость Python для того, что можно рассматривать как логическое значение! Например, что если вам дают None? Как насчет пустой строки? Как насчет []?

Решением этой проблемы является использование абстрактных базовых классов (ABC), которые позволяют вам точно указать, что должен уметь делать объект, вместо того, что type. Модуль collections поставляется со следующими:

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

Это разрешает что-либо «словарное», так что вы сохраняете полиморфизм. Если вам нужна более тщательная спецификация («Я хочу __getitem__ и __delitem__, но не обязательно __setitem__!»), Вы можете написать свою собственную - смотрите определение ABC в источнике модуля коллекций для начинающих.

Вы уверены, что хотите эту функциональность? Если вы делаете это правильно (с ABC), это не плохая идея, но это не значит, что вы должны злоупотреблять ею!


Редактировать: Я не уверен, что вы понимаете, что такое Юникод или как Python справляется с этим. Это одно из основных различий между Python 2.x и Python 3.x, которое вы используете?

Повторное редактирование: О, хорошо, вы используете Python 2.x и у вас есть словарь со строковыми ключами Unicode. Я не уверен, что вы делали, что вызвало проблему, так как строки Unicode работают в основном так же, как обычные строки. Проверка MutableMapping, приведенная выше, будет работать нормально.

0 голосов
/ 19 августа 2010

Может быть, вам стоит узнать о симпатичном модуле печати, так как он заставляет вас проверять вещи (даже я согласен, что вы попали в беспорядок. Это обычно происходит как рекурсия результата с неправильным видом результата, например, выполнение добавления, когда вы должны сделать расширить список)

Здесь содержимое вашей переменной довольно напечатано:

{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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...