Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как внести изменение во встроенный тип? добавление переменной или метода в str 
:(
    Опции темы
Nilm
Дата 26.10.2006, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 26.10.2006

Репутация: 1
Всего: 1



Всем привет! smile

Помогите пожалуйста, мне необходимо подменить в Python класс string. Добавить в соответствие каждой строке переменную типа boolean и новый метод для строк. Не подскажите, где и что надо изменить? Наверное ТОЛЬКО(?) в интерпретаторе? Потому, что в модулях string.py, StringIO.py, GoldString.py строка не определяется. Я ведь прав?
PM MAIL   Вверх
Void
Дата 26.10.2006, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Да, к сожалению, в Python нельзя добавлять методы во встроенные типы.
Нельзя ли обойтись собственным классом, унаследованным от str?


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Nilm
Дата 26.10.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 26.10.2006

Репутация: 1
Всего: 1



Цитата(Void @ 26.10.2006,  19:12)
Да, к сожалению, в Python нельзя добавлять методы во встроенные типы.
Нельзя ли обойтись собственным классом, унаследованным от str?

К несчастью нет smile
Тем более, что мне кроме метода еще надо как-то и переменную типа bool добавитьsmile 
PM MAIL   Вверх
FunnyFalcon
Дата 27.10.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 27.3.2006

Репутация: 4
Всего: 7



А если просто отнаследовать:
Код

class A(str):
    def a(self):
        print self, self.b
a = A('Hello')
a.b = True
a.a()

PM MAIL   Вверх
Nilm
Дата 27.10.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 26.10.2006

Репутация: 1
Всего: 1



Как не обидно - нет.
Мне надо сделать что-то типа taint mode, как в PHP и Perl.
PM MAIL   Вверх
pythonwin
Дата 27.10.2006, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



согласно http://python.promsoft.ru/index.php?action...id=3378#id_3378 я понимаю, что это курсовой на питоне?

опиши пожалуста проблему подробней smile


PM WWW GTalk Jabber   Вверх
Nilm
Дата 27.10.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 26.10.2006

Репутация: 1
Всего: 1



Цитата(pythonwin @ 27.10.2006,  14:58)
согласно http://python.promsoft.ru/index.php?action...id=3378#id_3378 я понимаю, что это курсовой на питоне?

опиши пожалуста проблему подробней smile

Дело обстоит так:
   Я согласен, что надо унаслеовать класс. Но еще его надо и подменить в интерпретаторе, вместо стандартного str. Чтобы пользователю не надо было в ручную что либо подключать.
Что такое taint mode:
   Как правило, всевозможные обработчики формочек, CGI скрипты и т.п. пишут люди умные, но даже они не застрахованы от ошибки. Например рассмотрим простейший пример, где пользователь вводит в форму свое имя, и по нажатию на кнопочку Submit переходит на стр, где написано: "Привет, [имя пользователя]". Соотв всякие нехорошие редиски могут этим востользоваться и провести injection atack. Например ввести в имя пользователя Java-script, который отошлет кукисы юзера атакующему или т.п. Соотв. taint mode запрещает производить со строками, полученными от позьзователя ажные действия, например, exec. Но опасны только строки, полученные от пользователя. Мы ставим в соотв строке bool переменную, которая и обозначает, taint эта строка или нет. И ессесно есть функция, которая возвращает значение этой булевой переменной.
PM MAIL   Вверх
pythonwin
Дата 27.10.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Nilm, ты пишешь под веб?

сможешь, дать постановку задачи?
smile
PM WWW GTalk Jabber   Вверх
slivlen
Дата 27.10.2006, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.8.2006

Репутация: 1
Всего: 3



Цитата(Nilm @  27.10.2006,  15:20 Найти цитируемый пост)
Дело обстоит так:
   Я согласен, что надо унаслеовать класс. Но еще его надо и подменить в интерпретаторе, вместо стандартного str. Чтобы пользователю не надо было в ручную что либо подключать.

Может я что-то не понимаю, ну зделашь ты свой класс строк и что дальше?  Надо чтоб функции которые будут иметь с ней дело(os.system, os.popen и многие другие) проверяли является-ли данная строка 'проверенной', плюс ко всему  надо делать свой класс не только кот заменит str, но и тот кот заменит unicode string. Ты будешь переписывать стандартные модули?

PM MAIL   Вверх
The_Gremlin
Дата 28.10.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 19.10.2006

Репутация: 1
Всего: 1



To slivlen:
Ну да, придется многое переписать.

To pythonwin:
Что именно ты имеешь ввиду под постановкой зачачи? Курсовой или именно данный момент (подмана класса)
PM MAIL   Вверх
Nilm
Дата 29.10.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 26.10.2006

Репутация: 1
Всего: 1



Цитата(The_Gremlin @ 28.10.2006,  16:11)
To pythonwin:
Что именно ты имеешь ввиду под постановкой зачачи? Курсовой или именно данный момент (подмана класса)

+1
PM MAIL   Вверх
pythonwin
Дата 30.10.2006, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(The_Gremlin @  28.10.2006,  23:11 Найти цитируемый пост)

To pythonwin:
Что именно ты имеешь ввиду под постановкой зачачи? Курсовой или именно данный момент (подмана класса) 

из http://python.promsoft.ru/index.php?action...id=3378#id_3378

Цитата

По моему, встраивать это в язык в общем случае бессмысленно, т.к.

*) Python - язык общего назначения, и веб - одна из многих сфер его применения.
И фича соответственно в остальных случаях будет невостребована, а болтаться будет.
*) Exec для какой попало стороки считается моветоном в любом языке или
фрэймворке.
*) Очень трудно очертить какой-то круг "важных" действий - например сохранение
строки в базу - важное? А сохранение в файл? А использование как имя файла?
А исползование строку для генерации вывода (html или xml или csv)?...
Заметь, в каждом из этих случаев, и многих других может получиться так, что
"нехороший редиска" умудриться таки напортачить.
*) Использование "грязных" строк где не попадя - ошибка дизайна и логики
а traint - механизм времени выполнения. Т.е. он тому-же самому "редиске"
ещё и укажет дыры дизайна. smile
*) По опыту использования perl и php тот самый traint сразу рубят прямо или
косвенно.


Почитай про классы "нового стиля" они появились со 2 версии.
Ты можешь просто пронаследоваться от стандартной строки и добавить нужную
тебе функциональность. Причём, в соответствии с ООП все смогут работать
с твоим классом как с обычной строкой.
Только надо хорошенько продумать работу с преобразованиями и кодировками.
Например должна ли строка оставаться "грязной" при таких преобразованиях:
s + s; s * 3; s + 'abc'; '%s' % s; s[0]; s[1:-4];
''.join(x for x in s);
unicode(s, coding); s.encode(coding)
и т.п.

По моему, реализация такого класса (может не одного) вполне потянет на
нормальный курсовик. smile 



Nilm, ты усложняешь - можно решить проблему по другому. smile

а нужно описание (постановка задачи) для курсового! smile
возможно твою ппроблему можно решить по другому smile
PM WWW GTalk Jabber   Вверх
albertn
Дата 30.10.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



На сколько я понял тебе нужно просто экранировать специальные html символы. Нашел по этой теме статейку:
Цитата

Всегда экранируйте введенную строку прежде, чем выведете ее на web-страничку или вставите в SQL-запрос.  Делаться это должно в дополнение к процедуре проверки ввода. Неэкранированные специальные символы могут нарушить форматирование страницы HTML или внедрить код Javascript. Неэкранированные строки в SQL-запросе могут породить синтаксическую ошибку при разборе этого запроса на стороне сервера или выполнить не предусмотренные программой действия. Для экранирования специальных символов в HTML-коде можно воспользоваться функцией 'cgi.escape()'. За справками, по экранированию символов в SQL-запросах, обращайтесь к документации по вашей базе данных.


Просто во всех выводах в форму экранировать специальные символы, и никаких проблем не будет.
Или я неправильно понял твою проблему?
PM WWW ICQ   Вверх
pythonwin
Дата 30.10.2006, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



albertn, спасибо за ссылку! smile

Это сообщение отредактировал(а) pythonwin - 31.10.2006, 07:14
PM WWW GTalk Jabber   Вверх
albertn
Дата 30.10.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Nilm, Если нужно экранирование символов по-умолчанию, то можно воспользоваться Zope, или шаблонами страниц ZPT (работает без Zope).
PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0793 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.