Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Как внести изменение во встроенный тип?


Автор: Nilm 26.10.2006, 15:30
Всем привет! smile

Помогите пожалуйста, мне необходимо подменить в Python класс string. Добавить в соответствие каждой строке переменную типа boolean и новый метод для строк. Не подскажите, где и что надо изменить? Наверное ТОЛЬКО(?) в интерпретаторе? Потому, что в модулях string.py, StringIO.py, GoldString.py строка не определяется. Я ведь прав?

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

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

К несчастью нет smile
Тем более, что мне кроме метода еще надо как-то и переменную типа bool добавитьsmile 

Автор: FunnyFalcon 27.10.2006, 09:00
А если просто отнаследовать:
Код

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

Автор: Nilm 27.10.2006, 10:41
Как не обидно - нет.
Мне надо сделать что-то типа taint mode, как в PHP и Perl.

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

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


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

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

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

Автор: pythonwin 27.10.2006, 16:36
Nilm, ты пишешь под веб?

сможешь, дать постановку задачи?
smile

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

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

Автор: The_Gremlin 28.10.2006, 16:11
To slivlen:
Ну да, придется многое переписать.

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

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

+1

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

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

из http://python.promsoft.ru/index.php?action=forum&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

Автор: albertn 30.10.2006, 12:20
На сколько я понял тебе нужно просто экранировать специальные html символы. Нашел по этой теме http://gazette.linux.ru.net/lg83/evans.html:
Цитата

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


Просто во всех выводах в форму экранировать специальные символы, и никаких проблем не будет.
Или я неправильно понял твою проблему?

Автор: pythonwin 30.10.2006, 12:22
albertn, спасибо за ссылку! smile

Автор: albertn 30.10.2006, 12:24
Nilm, Если нужно экранирование символов по-умолчанию, то можно воспользоваться http://www.zope.org/, или шаблонами страниц http://zpt.sourceforge.net/ (работает без Zope).

Автор: pythonwin 30.10.2006, 12:39
Цитата(albertn @  30.10.2006,  19:20 Найти цитируемый пост)
На сколько я понял тебе нужно просто экранировать специальные html символы. Нашел по этой теме статейку:


Цитата(pythonwin @  30.10.2006,  19:22 Найти цитируемый пост)
http://gazette.linux.ru.net/lg83/evans.html 

прошу прощения, у albertn,  - это его ссылка и Он первым разместил эту ссылку, просто я её не заметил. smile
+1

Автор: Nilm 30.10.2006, 15:01
Спасибо за идеи. Я наконец-то выловил моих любимых научников и задал им конкретный вопрос. На что и получил ответ:

Смысл в том, чтобы внести изменения в языковую структуру стринг так, чтобы потом в интерпретаторе это использовать
1. добавить в этот класс своё поле. Любое.
2. добавить геттер и сеттер этого поля
3. собрать этот изменненный питон
4. в mod_python попробовать вызвать этот геттер и сеттер

Теперь буду думать какой из файлов необходимо изменить.

To pythonwin:
постановку я тебе скинул в личку.

Автор: Nilm 31.10.2006, 10:21
Цитата(Nilm @ 30.10.2006,  15:01)
Теперь буду думать какой из файлов необходимо изменить.

Скорее всего это stringobject.c

Автор: pythonwin 31.10.2006, 11:08
Цитата(Nilm @  31.10.2006,  17:21 Найти цитируемый пост)
Скорее всего это stringobject.c 


Nilm, т.е. ты уже решил писать свой питон?

Автор: Nilm 31.10.2006, 11:12
Цитата(pythonwin @ 31.10.2006,  11:08)
Цитата(Nilm @  31.10.2006,  17:21 Найти цитируемый пост)
Скорее всего это stringobject.c 


Nilm, т.е. ты уже решил писать свой питон?

Нет, за меня так решили smile smile smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)