LINUX.ORG.RU

Изящество и неловкость Python


0

0

В этой статье автор рассматривает некоторые неочевидные возможности последних версий Python и постарается определить, какие из них действительно полезны, а какие - просто лишнее усложнение языка. Эта статья - попытка указать на несколько важных моментов специалистам, не использующим Python постоянно: от программистов на других языках до ученых, для которых программирование - только вспомогательный инструмент. При возникновении затруднений автор предлагает возможные решения.

>>> Подробности

Ответ на: комментарий от Laz

>> CPU0: AMD Athlon(tm) XP 3000+ stepping 00 >Моя домашня машинка по сомременным офисным стандартам - говно

> Это что это вы там в офисах такое запускаете? о_О

Что-то на Яве, очевидно 8)

tailgunner ★★★★★
()

Питон за один только синтаксис может уже считаться одним из лучших языков. А когда я читаю код Java или C#, мне хочется блевать вот так - буээээ буэээ буээээ.

anonymous
()
Ответ на: комментарий от r

> Ага - часов. Выкинь уже 486 компьютер - сколько можно.

Компьютер у меня A-64 2800+. Не первой свежести, но вроде бодр. Запуск гуёвых приблуд на дотнете (винда, есессно) занимает секунд тридцать. Памяти тоже кушается прилично.

Как там оно под моно - мне не особо интересно. Технологии .Net и Java во всех их воплощениях считаю дурацкими. Либо надо делать полностью интепретируемые языки, с динамической типизацией, полной рефлексией и т.п.; либо надо делать просто автоматическую память без всяких рантаймов, на нативном коде. Жаба вроде умеет в нативный код компиляться - вот под таким соусом её ещё можно употребить, но синтаксис языка всё равно убожественно многословен...

yk4ever
()
Ответ на: комментарий от fury3

> Кулек питов?:) автор питон, смысл неиспользовать язык не постоянно?

??? животне чочо упячка голактеко опасносте ???

Ardolynk
()
Ответ на: комментарий от r

> Это моя домашняя:) Разрабаю я на

>CPU0: AMD Athlon(tm) 64 X2 Dual Core Processor 5000+ stepping 02 CPU1: AMD Athlon(tm) 64 X2 Dual Core Processor 5000+ stepping 02

Ну и далбайоп. письками ещё померяйся.

anonymous
()
Ответ на: комментарий от anonymous

> Я вот постоянно пользуюсь Trac (http://trac.edgewall.org/) - очень хорошая программка, но со скоростью у нее огромные проблемы...

А ты уверен что ты Trac нормально поставил? Надёюсь не в CGI режиме?.. У нас она сейчас на 100 человек с Wiki, Timeline, Tickets и Subversion, и всё в порядке. Объём кода: 100.000 файлов на 5 ГБ.

anonymous
()
Ответ на: комментарий от anonymous

>только за Hello.exe (EXE,бля!) тебя нужно вне очереди в биореактор

Ты изучи сначала моно, а потом звезди. Нихера устриц не пробовал но о вкусе рассуждать собрался. Это вообще .NET ассембли и расширение оно такое имеет даже под линуксом. Иди поищи себе стену неуч.

r ★★★★★
()
Ответ на: комментарий от Laz

>Это что это вы там в офисах такое запускаете? о_О

Предлагаю посмотреть в конторы торгующире железом что они предлагают как Office Edition.

r ★★★★★
()
Ответ на: комментарий от anonymous

> Питон за один только синтаксис может уже считаться одним из лучших языков. А когда я читаю код Java или C#, мне хочется блевать вот так - буээээ буэээ буээээ.

+1

sv75 ★★★★★
()
Ответ на: комментарий от r

> Это моя домашняя:) Разрабаю я на

> CPU0: AMD Athlon(tm) 64 X2 Dual Core Processor 5000+ stepping 02 CPU1: AMD Athlon(tm) 64 X2 Dual Core Processor 5000+ stepping 02

Пэтому потом такие монстры как Java и .Net появляются. На такой как у тебя машинке я играю в игры, а программирую исключительно на P3 800MHz на Питоне и C++. У клиентов потом всё летает. Выкинь своего монстра, сделай добро людям.

anonymous
()

>>> u1 < s2
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 0:
ordinal not in range(128)

непонятно чему удивляется автор

alt0v14 ★★★
()
Ответ на: комментарий от r

> Ты изучи сначала моно, а потом звезди.

Пожалуйста, напиши пару строк с вводом-выводом информации. Например, ввести "x" и "y" в консоли, вывести сумму. Хотелось бы конечно на реализацию UDP сервера на Mono посмотреть, но в другой раз. Это всё на Питоне в считанные мгновения делается и читается легко.

anonymous
()
Ответ на: комментарий от yk4ever

>Запуск гуёвых приблуд на дотнете (винда, есессно) занимает секунд тридцать.

Скорость запуска приблуд зависит от самих приблуд,.сложности приблуд и радиуса кривизны рук. Ты сказал что мона тебе не нравится из-за долго загружающегося рантайма. Я показал что рантайм грузится на машине почти аналогичной твоей - доли секунды. На примере - JEE AS JBoss поднимается в дефолтной инсталляции даже на моей X2 - от 30 секунд. JEE AS Orion поднимается мгновенно. То же самое с Tomcat (5-10 сек) vs Jetty (в пределах секунды).

Посмотри на загрузку сложных программ OOO, GIMP, MonoDevelop, KDevelop. Она с точки зрения юзера - одинаковая - немгновенная.

Мораль - если ты еще ничего не начал кликать в программе - это не значит, что программа не начала работать, а только "запускается', это значит, что она еще не перешла в интерактивный режим. А как быстро она переходит зависит от программы. Потому что скорость запуска VM как было продемонстировано - незначительна для user perception.

r ★★★★★
()
Ответ на: комментарий от anonymous

>У клиентов потом всё летает.

Что все? Названий не надо - типы приложений.

>Выкинь своего монстра, сделай добро людям.

Этот монстр за $400. Я когда-то дороже p166 купил.

r ★★★★★
()
Ответ на: комментарий от anonymous

>Пожалуйста, напиши пару строк с вводом-выводом информации.

Ты что пропустил предидущие посты? там все есть. Заняло секунды в vi.

r ★★★★★
()
Ответ на: комментарий от r

> def __init(self)__: ....

> да уж - сравним. Действительно OMG.

Во-первых, initter'ы не нужны. Во-вторых, какие *конкретно* претензии тут к синтаксису? Палки логичны, ведь иниттер не вызывается явным образом, как и конструктор C#. В-третьих, у тебя палки не в том месте. ;)

sv75 ★★★★★
()
Ответ на: комментарий от sv75

> initter'ы не нужны.

Точно. А вот метод __init__ - нужен ;)

tailgunner ★★★★★
()
Ответ на: комментарий от r

public static void Main(String[] args) { ...

def __init__(self): ...

Ну ты сравнил, повсеместный маразм с необязательной инициализацией...

anonymous
()
Ответ на: комментарий от r

> def __init(self)__: ....

> да уж - сравним. Действительно OMG.

и много ты их в программах на питоне видишь, этих __init__ ? Мало конечно, ведь в нём не нужно на каждый чих городить говнокласс. А в цешарпе постоянно идёт такая вот хренотень.

Ну и правильно было замечено: для десктоп-программ скорость работы менее важна чем скорость запуска. Поэтому языки компилирующиеся в нативный код с автоматической сборкой мусора через подсчёт ссылок и без всяких рантаймов намного лучше, чем эта моно/жабко/.нет морока

Joe_Bishop
()
Ответ на: комментарий от Joe_Bishop

Я имею ввиду, что если писать десктоп-приложения, то, по-хорошему, выбирать надо из python/vala. Всё остальное идёт лесом.

Joe_Bishop
()
Ответ на: комментарий от anonymous

> Да и для веб-приложений python отлично идет :)

Для веб - само-собой! Сетевые программы - вообще сказка.

anonymous
()
Ответ на: комментарий от anonymous

>Ну ты сравнил, повсеместный маразм с необязательной инициализацией...

Где ты тут увидел маразм? Вот self - это маразм.

r ★★★★★
()
Ответ на: комментарий от Joe_Bishop

>для десктоп-программ скорость работы менее важна чем скорость запуска.

Чего чего чего? Ты тест читал? Ты что может отличить программу запускающуюся 0.1 секунду от программы со скоростью запуска 0.05 секунд?

>Поэтому языки компилирующиеся в нативный код с автоматической сборкой мусора через подсчёт ссылок и без всяких рантаймов намного лучше

Рантайм - это стандартная библиотека. Она есть везде - даже у сей. libc называется.

Сборку мусора через подсчет ссылок ты не сделаешь. Такие программы плод твоего воображения.

Иди учи букварь.

r ★★★★★
()
Ответ на: комментарий от r

> Вот self - это маразм.

self --- это что угодно, но не маразм. То, что где--то как--то, из ниоткуда появляется this --- вот это маразм.

anonymous
()
Ответ на: комментарий от anonymous

>То, что где--то как--то, из ниоткуда появляется this --- вот это маразм.

А появление "откуданивозьмись" полей и методов при наследованиие тебя не смущает?

А мистический вызов __init__ который ты руками не вызывал - не пугает?

А то что ты не передаешь этого параметра руками - не ужасает?

Такой странный мистический параметр, который надо декларировать, но не надо передавать. Он появляется откуданивозьмись при вызове. Руки не дрожат?

r ★★★★★
()
Ответ на: комментарий от r

> Такой странный мистический параметр, который надо декларировать, но не надо передавать.

Можешь передавать, нет проблем.

> Он появляется откуданивозьмись при вызове.

Ну что за глупости...

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>Можешь передавать, нет проблем.

Хочу передать в __init__. Я в гневе - есть параметр - хочу передавать!

r ★★★★★
()
Ответ на: комментарий от r

>> Можешь передавать, нет проблем.

> Хочу передать в __init__. Я в гневе

Когда напрямую вызываешь __init__ - можешь передать, нет проблем. При создани экземпляра вызовом Someclass(), ты __init__ напрямую не вызываешь, так что твой гнев непонятен.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>При создани экземпляра вызовом Someclass(), ты __init__ напрямую не вызываешь, так что твой гнев непонятен.

То есть он вызывается не напрямую! Мистически! Непонятно как! Я в ярости! А вызываю в случае параметризованного __init__ я вообще непонятно что! Параметризовал инит, а вызываю непонятно что нигде не описанное! Я негодую!

;))

r ★★★★★
()
Ответ на: комментарий от r

>> Можешь передавать, нет проблем.

> Хочу передать в __init__. Я в гневе - есть параметр - хочу передавать!

Да убей ты себя об стену лучше, придурок! Это у тебя от синтаксиса в Mono нервы так расшатаны? Декларируй "def init(self):..." и передавай себе. Прикопался же к "__init__"... Больше видимо ничего и не знаешь.

anonymous
()
Ответ на: комментарий от anonymous

>Да убей ты себя об стену лучше, придурок!

Стену поищи ты. Если для тебя this мистика - в виде авнгардной живописи на стене ты принесешь больше пользы.

r ★★★★★
()
Ответ на: комментарий от tailgunner

>Как Гвидо сказал, так и вызывается... :D

Когда-то была зачака с трудноформализуемой мутной логикой (по причине недостаточности данных для принятия однозначных решений) - мы думали предложить клиенту поставлять программу с ящиком подключенном к PCI в котором сидит китаец и разруливает решения:)

Сча представи себе такой ящик в котором сидит Гвидо и говорит как идти вызовам:)

r ★★★★★
()
Ответ на: комментарий от r

Гвидо настолько суров, что не разруливает вызовы - они сами разруливаются по его заветам :D

tailgunner ★★★★★
()
Ответ на: комментарий от r

Похоже у тебя что-то с психикой. Сходи лучше на приём к консультанту, а то скоро сам в ящик сядешь, националист хренов.

anonymous
()
Ответ на: комментарий от r

> То есть он вызывается не напрямую! Мистически! Непонятно как!
> Я в ярости! А вызываю в случае параметризованного __init__ я
> вообще непонятно что! Параметризовал инит, а вызываю непонятно что
> нигде не описанное! Я негодую!

Я тот самый анономус про this.

Я ни разу не работал с c#, но подозреваю, что там сам по себе
вызывается SomeClass::SomeClass.

Вот именно вызвать __init__ сложно ( кроме BaseClass.__init__(self, *args) ). А явно передать self --- без проблем:

In [5]: class q:
...: def q(self, q):
...: print q
...:
...:

In [6]: a = q()

In [7]: q.q(a, 123)
123

anonymous
()
Ответ на: комментарий от anonymous

>А явно передать self --- без проблем:

>q.q(a, 123)

Да я понимаю что в динамических языках да еще с eval можно утвортить достаточно много маразматичных примеров. Конструкция которую ты применил - не нужна. Она эквивалентна a.q(123). Ты просто вызвал метод через жопу когда ничего не мешало вызвать его прямо. У меня в проекте сидит австралиец который жабе освобождение памяти ускоряет вот такими конструкциями:

String s = null;
try {
s = "aaa";
return s;
} finally {
s = null;
}


На вопрос зачем он в файнали локальной переменной присвоил null - он сказал что так он уменьшает refcount и gc лучше работает. Декомпилер от таких конструкций - шизеет. Он пытается найти место где там может быть исключение и не может. Я спросил кто его научил так делать - он сказал что какие-то злые люди 4 года назад. Пришлось сказать что над ним поглумились и он 4 года писал пургу. Расстроился.

Так что маразмов на любом языке можно написать много. Из этого не следует что они нужны.

r ★★★★★
()
Ответ на: комментарий от yk4ever

> Ага, только вместо Vala - D.

неа, сборщик мусора всё портит, будет жрать память и временами подтормаживать. Освобождение памяти через подсчёт ссылок свободно от этих недостатков, хотя и работает медленее. К тому же, у D, имхо, немного переусложнённый синтаксис и сложности с использованием его кода в других языках.

Joe_Bishop
()
Ответ на: комментарий от Joe_Bishop

Ну и последнее - вала изначально заточена под gtk, т.е. писать приложения под кошерный тулкит будет намного проще.

Joe_Bishop
()
Ответ на: комментарий от Joe_Bishop

vala это такой с# который компилится прямо в гном?:) Гномерам отвратительны масль писать на языке на котором можно писать на Qt?:))

r ★★★★★
()
Ответ на: комментарий от r

>>q.q(a, 123)

>Да я понимаю что в динамических языках да еще с eval можно утвортить достаточно много маразматичных примеров. Конструкция которую ты применил - не нужна

А напиши-ка мне на Яве объявление переменной, аналогичной "указателю на метод" в Си++ (не помню уже, как это в Яве называется), с инициализацией? Может, станет понятнее, что такое маразм, и что нужно, а что - нет.

tailgunner ★★★★★
()
Ответ на: комментарий от Joe_Bishop

> Освобождение памяти через подсчёт ссылок свободно от этих недостатков, хотя и работает медленее.

и, в общем, не работает - не освобождает наборы объектов с циклическими ссылками. Vala - это от слова valasiped.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>А напиши-ка мне на Яве объявление переменной, аналогичной "указателю на метод" в Си++

Это типа "а у вас зато помидоры плохо родят"?

Как это меняет то что self в питоне не нужен? Если бы его не було питон бы нисколько не пострадал. И если бы там был нормальный конструктор а не __init__ - он бы тоже не пострадал, а стал бы лучше. Тогда бы вот таких добрых рекомендаций не было:

When defining your class methods, you must explicitly list self as the first argument for each method, including __init__. When you call a method of an ancestor class from within your class, you must include the self argument. But when you call your class method from outside, you do not specify anything for the self argument;

r ★★★★★
()
Ответ на: комментарий от r

>> А напиши-ка мне на Яве объявление переменной, аналогичной "указателю на метод" в Си++

> Это типа "а у вас зато помидоры плохо родят"?

Нет, это ответ на "маразм" и "не нужен". Ну так приведешь пример? Чтобы мы высказали своё "фу" Яве.

> Если бы его не було питон бы нисколько не пострадал.

Этот аргумент есть в любом ОО-языке. Просто в Питоне ему можно дать любое имя.

> И если бы там был нормальный конструктор а не __init__ - он бы тоже не пострадал, а стал бы лучше.

__init__ - это вполне нормальный конструктор.

> Тогда бы вот таких добрых рекомендаций не было:

> When defining your class methods [...]

Методы класса - они везде несколько неинтуитивны.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>Нет, это ответ на "маразм" и "не нужен". Ну так приведешь пример? Чтобы мы высказали своё "фу" Яве.

При чем тут ява? Я и без вас ей скажу.

>Этот аргумент есть в любом ОО-языке. Просто в Питоне ему можно дать любое имя.

В питоне его немобходимо объявлять руками. Зачем?

Дать любое имя можно - но при этом существует строгий конвеншен о том что можно давать любое имя при условии что это будет self.

>__init__ - это вполне нормальный конструктор.

Только с вездесущим селфом и раковым именем. Питон же вроде как суперчитаемым языком должен быть? Даже скобки похерили. А констрокутор бесчеловечное имя имеет. Аналог в той же жабе присутствует <init> называется. Толко зрение людям своим названием не портит. Что-то тут гвидо чувство прекрасного изменило.

>Методы класса - они везде несколько неинтуитивны.

ДА уж особенно когда почумуто способ вызов имеет разный синтаксис в зависимости от места вызова - внутри класса и снаружи. Замечательно. Что мешало сделать как в жабаскрипте?

r ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.