Найти - Пользователи
Полная версия: Вопрос по repr()
Начало » Python для новичков » Вопрос по repr()
1
corpse
Доброго времени суток. Помогите пожалуйста понять следующую вещь. Функция 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 вместо строк с самими выражениями. Я уже понимаю, что это вряд ли возможно, но ускорило ли бы это процесс обработки, если регулярных выражений будут сотни, возможно тысячи и использоваться они будут довольно часто и активно?
o7412369815963
corpse
… который потом может быть обратно преобразован в объект через eval().
нет
o7412369815963
corpse
Тогда как содержимое структуры данных я могу как строку сохранить в файл и потом при следующем запуске используя содержимое этого файла и eval(), получить эту структуру в том виде, в котором она была сохранена.
см. pickle и
json
bw
Читайте про сериализацию, а pickle в Python это самый распространённый её способ, к тому же стандартный, т.е. включён в дистрибутив, а не распространяется третьими пакетами.

..bw
corpse
Спасибо за подсказки, обязательно изучу.
corpse
Попробовал.
>>> 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]*'
bw
>> Читайте про сериализацию
> обязательно изучу
> Кстати, не совсем понятно
>> Читайте про сериализацию

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

..bw
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB