gentoo.ru
python
python@conference.gentoo.ru
Вторник, 21 сентября 2010< ^ >
krigstask установил(а) тему: Python: простой и удобный язык программирования широкого применения
Конфигурация комнаты
Участники комнаты

GMT+4
[11:14:51] krigstask вошёл(а) в комнату
[12:35:47] krigstask вышел(а) из комнаты
[14:02:02] maksbotan вошёл(а) в комнату
[15:19:35] qnikst вошёл(а) в комнату
[15:20:22] <qnikst> ыть, как в питоне форкнуться вызвать другую программу и потом продолжить работу после завершения первой
[15:20:33] <qnikst> *после её завершения
[15:20:39] <qnikst> да, мне лень читать мануалы
[15:21:25] <maksbotan> os.fork есть
[15:21:55] <maksbotan> также есть модуль multiprocessing
[15:22:35] <maksbotan> ну типа if os.fork:
    subprocess.call("blabla")
else:
    /continue work
[15:22:37] <maksbotan> имхо
[15:23:17] <qnikst> хм..
[15:23:28] <qnikst> ок
[15:23:35] <maksbotan> os.fork() конечно
[15:23:40] <maksbotan> но я с таким не работал
[16:21:24] krigstask вошёл(а) в комнату
[16:22:06] lk4d4 вошёл(а) в комнату
[16:22:44] <krigstask> lk4d4: так зачем оно тебе?
[16:22:54] <lk4d4> так вот
[16:23:27] <qnikst> чтобы работать с классами на уровне абстракции а не реализации
[16:23:41] <lk4d4> я просто по старой памяти как в крестах хотел замутить
[16:23:50] <qnikst> но зачем запрещать для языка типа питона я не могу объяснить :)
[16:23:58] <lk4d4> да вот я и сам думаю
[16:24:02] <krigstask> Вопрос был не «зачем абстрактный класс», а зачем запрещать делать его экземпляры
[16:24:05] <lk4d4> ааа
[16:24:12] <lk4d4> ну мало ли балбесов
[16:24:22] <lk4d4> как начнут создавать экземпляры
[16:24:37] <maksbotan> ...а они не заработают!111!!11
[16:24:44] <lk4d4> вот именно
[16:24:51] <krigstask> Паника в селе!
[16:25:35] <qnikst> lk4d4, а интерфейсы не?
[16:26:14] <qnikst> или оно тоже в 3ке?
[16:26:22] <lk4d4> я ваще не знаю что это
[16:26:28] <lk4d4> щас в книжке гляну
[16:26:46] <krigstask> Интерфейсы — это, по-моему, плюсатый костыль заместо множественного наследования
[16:27:05] <qnikst> если по аналогии с плюсами, то это классы в которых только константы и абстрактные публичные методы
[16:27:18] <qnikst> krigstask, если честно я даже не знаю что больше костыль
[16:27:29] <qnikst> плюсатое множественное наследование или интерфейсы
[16:27:59] <lk4d4> не, абстрактный класс может содержать и не чисто виртуальные методы
[16:28:42] <qnikst> я знаю
[16:31:41] <qnikst> и всё (
[16:31:48] <qnikst> придётся дальше тех мучать
[16:32:10] <krigstask> qnikst: вроде же в плюсах нету простого множественного наследования
[16:33:17] <qnikst> там же пишешь class Foo : public Bar,Baz
[16:33:30] <qnikst> вот тебе и класс наследующий Bar и Baz
[16:34:08] <qnikst> только там сразу возникает куча проблем :) которые решили гениальным образом - запретили множественное наследование в общем виде
[16:34:53] <krigstask> Шикарно
[16:34:55] <qnikst> это как с иммутабельными языками типа erlang — для хорошей многозадачности изменяемость переменных это проблема, решение сделать почти всё неизменяемым
[16:35:18] <qnikst> решили в смысле в java и в последствии c#
[16:35:56] <qnikst> и прочих современных языках поддерживающих ооп (в питоне вроде как есть, но я глупый и не шарю)
[16:36:16] <krigstask> В питоне есть полноценное множественное наследование
[16:36:18] <qnikst> про неизменяемость это тоже имхо, и я готов выслушать альтернативное мнение
[16:36:56] <krigstask> Ну… "Variables that don't vary" — это, на мой вкус, особенность языка, а не ограничени
[16:37:01] <krigstask> *ограничение
[16:37:22] <qnikst> class A { a=3}; class B { a=4} ;class C extends A,B{} досуп к полю а, как будет? и что будет внутри объекта класса C ?
[16:37:35] <lk4d4> в общем чисто виртуальные классы наследуются от метакласса abc.ABCMeta
[16:37:50] <krigstask> qnikst: это ты типа спрашиваешь, как в питоне?
[16:37:58] <lk4d4> и в питоне 2 тоже
[16:38:03] <qnikst> это особенность языка заключающася в ограничении на изменение переменных
[16:38:08] <qnikst> krigstask, ага
[16:38:31] <qnikst> спрашиваю
[16:38:36] <krigstask> Есть документированный порядок ращрешения имён членов
[16:38:40] <krigstask> *разрешения
[16:39:33] <krigstask> Я его, конечно, не помню так сходу, тем паче что он поменялся в «новых» классах (-:Е
[16:39:38] <qnikst> и будет ли внутри объекта класса C 2 поля a или одно? и если в A и B есть методы обращающиеся к self.a, то к чему они будут обращаться в контексте объекта класса C
[16:40:12] <qnikst> в общем в явах по причине этой неоднозначности и неочевидности поведения решили упростить себе жизнь
[16:40:13] <maksbotan> возьми книжечку, там подробно расписано
[16:40:20] <maksbotan> я тоже уже не помню
[16:40:48] <krigstask> 1. Одно; 2. К нему
[16:40:55] <qnikst> ясно
[16:41:00] <krigstask> Если не ошибаюсь
[16:41:12] <krigstask> А в Питоне это просто прояснили и документировали
[16:41:14] <qnikst> у питона правда есть огромный бонус, он полностью динамический
[16:41:15] <qnikst> =)
[16:41:36] <krigstask> Ну в данном случае я не вижу, чем это может помочь
[16:41:50] <krigstask> Это всё вполне может разрешать компилятор
[16:42:07] <qnikst> вот не уверен
[16:42:12] <qnikst> у тебя есть 2 струтуры данных
[16:42:14] <krigstask> Во всяком случае, если классы не создавать динамически
[16:42:40] <qnikst> struct в которых значения полей объекта
[16:43:39] <qnikst> и поидее новый класс к этому добавляет свой личный struct
[16:44:00] <qnikst> при объединении 2ух классов возникает реальная проблема куда обращаться методам :)
[16:44:17] <qnikst> т.к. все отсуты и т.п. в непереопределённых функциях уже известны
[16:44:25] <krigstask> Так класс же создаётся на этапе компиляции
[16:45:22] <qnikst> т.е. у меня есть structA{}, structB{} и методы классов A,B адекватно работающие с ними при одиночном наследовании, а при множественном получается компилятор долен автоматически все их переделывать
[16:46:10] <qnikst> если в питоне можно сделать словарь{name->value} для значений полей объекта
[16:46:25] <krigstask> Ну знаешь, эти структуры компилятор всё равно переделывает при расширении класса
[16:46:50] <qnikst> не уверен, даже поспорил бы с этим утверждением )
[16:47:16] <qnikst> там структура вида {{structA} structB\structA}
[16:47:32] <qnikst> \ - обозначает разность множеств :)
[16:48:33] <krigstask> Эвон оно как
[16:48:39] <qnikst> в питоне доступ к полям через словарь, и там таких проблем в принципе нет - ты словарю имя он тебе значение. и данная структура может динамически меняться
[16:51:35] <krigstask> Тем не менее, ведь эта структура генерируется компилятором
[16:51:45] <krigstask> Почему он не может создавать новую?
[16:54:29] <qnikst> может
[16:54:37] <qnikst> только ему все методы нужно будет переписать
[16:55:02] <qnikst> (в случае множественного наследования)
[16:55:07] <qnikst> что видимо в сях и делается
[16:55:33] <qnikst> т.к. там множественное наследование есть
[16:55:49] <qnikst> но получается так, что это сложно реализовывается :)
[16:56:19] <qnikst> в питоне это проще
[16:57:45] <krigstask> Понятно дело, что проще
[16:57:55] <krigstask> Но не так уж это сложно, мне кажется
[16:59:02] <qnikst> я может самые неудобные случаи не описал
[16:59:15] <qnikst> т.к. не понимаю их и не запомнил
[17:03:51] <krigstask> Может быть, может быть
[17:04:11] <krigstask> Интересно, как в плюсцах с динамическим созданием классов
[17:05:17] <krigstask> Вот это геморрой почище множественного наследования должен быть
[17:09:33] <qnikst> ага
[17:10:01] <qnikst> но думаю такая задача там не часто ставится
[17:28:45] lk4d4 вышел(а) из комнаты
[17:29:14] <qnikst> имхо в 90% задача может быть решена без этого
[17:29:16] <qnikst> =)
[17:29:47] <krigstask> …и без множественного наследования тоже
[17:35:23] <qnikst> согласен
[17:35:58] <qnikst> вобще идеология интерфейсов мне нравится =) там множественность "наследования" оправдана
[17:39:42] <krigstask> Частный случай его, вот и всё (-:Е
[17:40:52] <qnikst> несовсем )
[17:42:01] <qnikst> т.е. в общем-то наследования множественного нет
[17:42:11] <qnikst> просто ты говоришь что у класса есть данные методы
[17:42:24] <qnikst> а уж откуда он их наследует или где реализует никого не волнует
[17:42:48] <qnikst> грубо говоря равносильно import-у header файла описывающего существующие функции
[17:43:14] <krigstask> Ну ясно
[17:44:45] <qnikst> есть ещё какой-то подход mixin-ов, но в этом я не шарю )
[17:45:02] <qnikst> енмип в питоне есть или реализуется при желании или что-то такое
[17:48:14] <krigstask> Так это просто не особо-то нужно
[17:48:59] <qnikst> в общем-то согласен
[18:03:07] qnikst вышел(а) из комнаты
[18:54:44] reonaydo вошёл(а) в комнату
[19:05:50] reonaydo вышел(а) из комнаты
[19:46:08] reonaydo вошёл(а) в комнату
[20:07:26] reonaydo вышел(а) из комнаты
[20:07:41] reonaydo вошёл(а) в комнату
[20:26:27] <krigstask> .readlines() не нужен
[20:30:25] <reonaydo> krigstask: м?
[20:30:49] <krigstask> Это максботану
[20:30:57] <krigstask> maksbotan: ↑
[20:31:01] <maksbotan> а почему?
[20:31:03] <maksbotan> а, понял
[20:31:04] <reonaydo> ну я понял, шо ему ^_^
[20:31:05] <maksbotan> не нужен
[20:31:10] <krigstask> А незачем
[20:31:12] <reonaydo> а почему не нужен?
[20:31:24] <krigstask> Файловые объекты и так итераторы по строкам
[20:31:26] <maksbotan> reonaydo: файл в некотором роде итерируемый
[20:31:28] reonaydo вообще почти всегда readlines() юзает
[20:31:44] <reonaydo> по-русски плиз
[20:31:48] <maksbotan> krigstask: я вот правда не знаю чтоо там с кодировками
[20:32:07] <maksbotan> reonaydo: ну for line in open("file") будет работать само по себе
[20:32:11] <maksbotan> почитай книжечку
[20:32:15] <maksbotan> learning pyhton
[20:32:47] <reonaydo> чукча -  не читатель!
[20:32:52] <maksbotan> =)
[20:33:00] <krigstask> А readlines() сразу читает файл в память списком строк
[20:33:20] <reonaydo> ну так удобно, считал, файл закрыл и делай шо хошь
[20:33:39] <krigstask> Ага, а если файл большой, хотя бы мегабайт?
[20:33:49] <maksbotan> krigstask: ты опережаешь
[20:34:06] <reonaydo> krigstask: а представь искать в этом мегабайтном файле шевеля диском?
[20:34:15] <krigstask> maksbotan: ась?
[20:34:25] <krigstask> reonaydo: а ты его считаешь, не шевеля им? (-%Е
[20:34:26] <reonaydo> -rw-r--r--  1 root  wheel   1.3M Sep 21 15:17 /usr/local/etc/apache22/httpd.conf
[20:34:38] <maksbotan> ну я вот только хотел написать про память и файл
[20:34:39] <maksbotan> а ты уже
[20:34:40] <reonaydo> в память я 1 раз считал
[20:34:55] <reonaydo> а потом 100 операций поиска, замены и т.п. уже в памяти
[20:35:04] <maksbotan> reonaydo: а каким ключиком лс выводит человекопонятный размер?
[20:35:12] <reonaydo> maksbotan: омг
[20:35:25] <reonaydo> -h
[20:35:25] <maksbotan> reonaydo: по крайней мере в моем скрипте файл читается построчно
[20:35:28] <maksbotan> reonaydo: спс
[20:35:42] maksbotan обычно натравливал du -sh на файлы
[20:35:51] <krigstask> о-8Е
[20:36:00] <reonaydo> вот на таком файле парсилка находит нужный vhost за 0.3 секунды
[20:36:47] <reonaydo> да и безопаснее как-то. Залочил, считал, закрыл, разлочил. А то мало-ли кто файлик потрогает
[20:37:01] <krigstask> Ужас какой
[20:37:04] <reonaydo> правда, vim чхать хотел на лочку >_<
[20:37:07] <maksbotan> =)
[20:38:03] <krigstask> reonaydo: и что делать с твоими 0.3 секунды?
[20:38:15] <maksbotan> /dev/mapper/vg-large   24G   23G     0 100% /home/maks/Other/Large
[20:38:22] <maksbotan> чорт, не то окно
[20:38:22] <reonaydo> krigstask: ну можешь на стенку повесить ^_^
[20:38:28] <krigstask> То-то и оно
[20:38:35] <maksbotan> =)
[20:38:53] <reonaydo> это я к тому, что вот такой файл считывается readlines + кое какие операции достаточно быстро
[20:39:10] <krigstask> Кто б сомневался, что достаточно быстро
[20:39:50] <krigstask> Но файлы по уму целиком в память не считывают
[20:39:56] <krigstask> В общем случае
[20:40:02] <krigstask> Если обработка построчно
[20:40:13] <maksbotan> именно что построчно
[20:40:20] <maksbotan> у него как я понял не совсем
[20:45:29] <krigstask> Я пользуюсь правилом «Не считывай в память целиком, если без этого можно обойтись»
[20:46:02] <reonaydo> krigstask: ну обойтись можно, но зачем?
[20:46:13] <krigstask> Я уже объяснил, зачем
[20:46:35] <reonaydo> придётся много-много думать, писать много-много кода, ради сомнительных благ
[20:46:55] <krigstask> Так а что тебе надо сделать?
[20:47:30] reonaydo находит в конфиге vhost (а может и не один), дописывает туда всякую фигню, что-то удаляет и т.п.
[20:48:16] <reonaydo> в случае неполного чтения файла в памяти, придётся бегать по файлу вперёд-назад много раз
[20:49:39] <krigstask> maksbotan: твоё творение выжрало 120 Мб, к примеру
[21:08:59] reonaydo вышел(а) из комнаты
[21:10:58] <maksbotan> ути
[21:11:01] <maksbotan> каким образом?
[21:15:24] krigstask вышел(а) из комнаты
[23:16:15] maksbotan вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!