Уведомления

Группа в Telegram: @pythonsu

#1 Июль 6, 2010 10:16:28

corpse
От:
Зарегистрирован: 2010-03-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по repr()

Доброго времени суток. Помогите пожалуйста понять следующую вещь. Функция repr() позволяет представить любой объёкт в некоем строковом виде, который потом может быть обратно преобразован в объект через eval().

>>> repr.__doc__
'repr(object) -> string\n\nReturn the canonical string representation of the object.\nFor most object types, eval(repr(object)) == object.'

Насколько я понял, некоторые объекты при попытке преобразовать их repr(), выдают просто некую ссылку на кусок памяти, где этот объект содержится. Но само содержимое этого объекта в строку преобразовать не удастся. Так? :(

Пример - я беру некое регулярное выражение и делаю следующее:

>>> import re
>>> tmp = re.compile(ur'(здесь-какое-то-регулярное-выражение)')
>>> repr(tmp)
'<_sre.SRE_Pattern object at 0x8804658>'
Тогда как содержимое структуры данных я могу как строку сохранить в файл и потом при следующем запуске используя содержимое этого файла и eval(), получить эту структуру в том виде, в котором она была сохранена.
>>> tmp1 = {'t1':['asd', 'asdf'], 't2':'test'} 
>>> repr(tmp1)
"{'t2': 'test', 't1': ['asd', 'asdf']}"
Т.е. оперировать с _любым_ объектом как со строкой не удастся, верно?

Была идея делать re.compile множества регулярных выражений и хранить их в blob поле sqlite вместо строк с самими выражениями. Я уже понимаю, что это вряд ли возможно, но ускорило ли бы это процесс обработки, если регулярных выражений будут сотни, возможно тысячи и использоваться они будут довольно часто и активно?



Офлайн

#2 Июль 6, 2010 10:46:52

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Вопрос по repr()

corpse
… который потом может быть обратно преобразован в объект через eval().
нет

Офлайн

#3 Июль 6, 2010 10:50:19

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Вопрос по repr()

corpse
Тогда как содержимое структуры данных я могу как строку сохранить в файл и потом при следующем запуске используя содержимое этого файла и eval(), получить эту структуру в том виде, в котором она была сохранена.
см. pickle и
json

Офлайн

#4 Июль 6, 2010 11:54:20

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Вопрос по repr()

Читайте про сериализацию, а pickle в Python это самый распространённый её способ, к тому же стандартный, т.е. включён в дистрибутив, а не распространяется третьими пакетами.

..bw



Офлайн

#5 Июль 6, 2010 12:38:05

corpse
От:
Зарегистрирован: 2010-03-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по repr()

Спасибо за подсказки, обязательно изучу.



Офлайн

#6 Июль 6, 2010 12:50:29

corpse
От:
Зарегистрирован: 2010-03-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по repr()

Попробовал.

>>> import re
>>> tmp = re.compile(ur'(то-самое-регулярное-выражение)')
>>> import cPickle
>>> tmp2 = cPickle.dumps(tmp)
>>> tmp2
'cre\n_compile\np1\n(V([^a-zA-Z\\u0430-\\u044F\\u0410-\\u042F\\u0451\\u0401]*\\u0441\\u043A\\u043E\\u043B\\u044C\\u043A\\u043E[^a-zA-Z\\u0430-\\u044F\\u0410-\\u042F\\u0451\\u0401]*.* .*([^a-zA-Z\\u0430-\\u044F\\u0410-\\u042F\\u0451\\u0401]*\\u043C\\u0435\\u0441\\u0442\\u0430[^a-zA-Z\\u0430-\\u044F\\u0410-\\u042F\\u0451\\u0401]*|[^a-zA-Z\\u0430-\\u044F\\u0410-\\u042F\\u0451\\u0401]*\\u043E\\u0441\\u0442\\u0430\\u043B\\u043E\\u0441\\u044C[^a-zA-Z\\u0430-\\u044F\\u0410-\\u042F\\u0451\\u0401]*)|[^a-zA-Z\\u0430-\\u044F\\u0410-\\u042F\\u0451\\u0401]*\\u043D\\u0430[^a-zA-Z\\u0430-\\u044F\\u0410-\\u042F\\u0451\\u0401]*.* .*[^a-zA-Z\\u0430-\\u044F\\u0410-\\u042F\\u0451\\u0401]*\\u0448\\u0430\\u0440\\u0435[^a-zA-Z\\u0430-\\u044F\\u0410-\\u042F\\u0451\\u0401]*)|[^a-zA-Z\\u0430-\\u044F\\u0410-\\u042F\\u0451\\u0401]*\\u0448\\u0430\\u0440\\u0430[^a-zA-Z\\u0430-\\u044F\\u0410-\\u042F\\u0451\\u0401]*\np2\nI0\ntRp3\n.'
Спасибо большое, просто шикарно! :) Именно то, что мне и было нужно.

Кстати, не совсем понятно, зачем необходимо делать re.compile и как это ускоряет выполнение, если полученный результат в памяти хранится в примерно таком же виде?
u'([^a-zA-Z\u0430-\u044f\u0410-\u042f\u0451\u0401]*\u0441\u043a\u043e\u043b\u044c\u043a\u043e[^a-zA-Z\u0430-\u044f\u0410-\u042f\u0451\u0401]*.* .*([^a-zA-Z\u0430-\u044f\u0410-\u042f\u0451\u0401]*\u043c\u0435\u0441\u0442\u0430[^a-zA-Z\u0430-\u044f\u0410-\u042f\u0451\u0401]*|[^a-zA-Z\u0430-\u044f\u0410-\u042f\u0451\u0401]*\u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c[^a-zA-Z\u0430-\u044f\u0410-\u042f\u0451\u0401]*)|[^a-zA-Z\u0430-\u044f\u0410-\u042f\u0451\u0401]*\u043d\u0430[^a-zA-Z\u0430-\u044f\u0410-\u042f\u0451\u0401]*.* .*[^a-zA-Z\u0430-\u044f\u0410-\u042f\u0451\u0401]*\u0448\u0430\u0440\u0435[^a-zA-Z\u0430-\u044f\u0410-\u042f\u0451\u0401]*)|[^a-zA-Z\u0430-\u044f\u0410-\u042f\u0451\u0401]*\u0448\u0430\u0440\u0430[^a-zA-Z\u0430-\u044f\u0410-\u042f\u0451\u0401]*'



Офлайн

#7 Июль 7, 2010 13:22:52

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Вопрос по repr()

>> Читайте про сериализацию
> обязательно изучу
> Кстати, не совсем понятно
>> Читайте про сериализацию

> если полученный результат в памяти хранится в примерно таком же виде?
На каком основании выдвинуто такое утверждение, вы заглядывали в память?

..bw



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version