программистское, python
May. 17th, 2009 12:21 amЯ наконец начал писать на Пайтоне. Но, по-моему, пишу в нем пока что в стиле Перла.
Из того, что не нравится:
- это ненормально, когда в языке есть встроенная функция open(), а встроенной функции close() нету. Есть в этом что-то извращенное.
- основной аргумент поклонников Пайтона - что в нем все продумано, логично, и на все есть один логичный способ это сделать, в отличие от Перла, где все можно сделать сотней разных способов. Но при приближении к объекту начинают бросаться в глаза трещины и морщины. Меня поразило количество встроенных в язык путей интерполировать значение внутри строки: 1) синтаксис %s и оператор % 2) синтаксис {0} и метод str.format() 3) синтаксис $x и класс string.Template. При этом все три способа оказались недостаточно мощными для моих достаточно скромных целей.
- какая-то фигня с Юникодом происходит. print не умеет выводить ничего, кроме байтов; нет способа объяснить ему, что юникодные строки надо выводить всегда в такой-то кодировке. Поэтому печать utf-8 строк либо включает в себя кучу вызовов decode() практически на каждую строку, либо пользуется менее удобными функциями, чем print.
В целом язык приятный. К significant whitespace привыкаешь очень быстро, и к {} обратно не тянет. Вообще синтаксис очень легкий, простой и интуитивный в большинстве случаев. Посмотрим, что он еще расскажет.
Из того, что не нравится:
- это ненормально, когда в языке есть встроенная функция open(), а встроенной функции close() нету. Есть в этом что-то извращенное.
- основной аргумент поклонников Пайтона - что в нем все продумано, логично, и на все есть один логичный способ это сделать, в отличие от Перла, где все можно сделать сотней разных способов. Но при приближении к объекту начинают бросаться в глаза трещины и морщины. Меня поразило количество встроенных в язык путей интерполировать значение внутри строки: 1) синтаксис %s и оператор % 2) синтаксис {0} и метод str.format() 3) синтаксис $x и класс string.Template. При этом все три способа оказались недостаточно мощными для моих достаточно скромных целей.
- какая-то фигня с Юникодом происходит. print не умеет выводить ничего, кроме байтов; нет способа объяснить ему, что юникодные строки надо выводить всегда в такой-то кодировке. Поэтому печать utf-8 строк либо включает в себя кучу вызовов decode() практически на каждую строку, либо пользуется менее удобными функциями, чем print.
В целом язык приятный. К significant whitespace привыкаешь очень быстро, и к {} обратно не тянет. Вообще синтаксис очень легкий, простой и интуитивный в большинстве случаев. Посмотрим, что он еще расскажет.
no subject
Date: 2009-05-16 09:59 pm (UTC)Портировать этот зоопарк, например, на солярис - это сплошные танцы с бубнами.
в общем, если есть возможность не использовать пайтон, то я и не использую :)
no subject
Date: 2009-05-16 10:02 pm (UTC)no subject
Date: 2009-05-16 10:03 pm (UTC)f.write('eggs\n')
f.close()
Вполне себе есть.
open (он же file) правильнее рассматривать как конструктор, а не как функцию.
PS Кстати %s может быть и %(key)s -- тогда правый аргумент % трактуется как dict
no subject
Date: 2009-05-16 10:09 pm (UTC)no subject
Date: 2009-05-16 10:11 pm (UTC)#!/usr/bin/env python2.5
# -*- coding: utf-8 -*-
?
no subject
Date: 2009-05-16 10:15 pm (UTC)a = u"не работает"
print a
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ordinal not in range(256)
no subject
Date: 2009-05-16 10:23 pm (UTC)[2:20 /tmp]$ cat >test.py
#!/usr/bin/env python2.5
# -*- coding: utf-8 -*-
a = u"не работает"
print a
[2:21 /tmp]$ ./test.py
не работает
А питона версия какая? А с локалью всё хорошо?
no subject
Date: 2009-05-16 10:30 pm (UTC)Я с этим столкнулся, когда писал скрипт для AppEngine, где я локаль, соответственно, не контролирую никак. Но возможно меня проглючило и там тоже все заработает, надо проверить.
no subject
Date: 2009-05-16 10:30 pm (UTC)no subject
Date: 2009-05-16 10:32 pm (UTC)(но в 3.0 тип file выкинули, заменив на ряд более подробных типов из модуля io, так что open() ещё и разбирается, какой конструктор вызвать.)
no subject
Date: 2009-05-16 10:33 pm (UTC)len=dir
len(len)
хехехехе.
no subject
Date: 2009-05-16 10:48 pm (UTC)суть как раз в том, что интуитивно понятен должен быть один способ, а сделать можно множеством способов.
print как раз адекватно работает.
другое дело, что люди не отличают unicode и utf8
надо просто уметь общаться с encode() decode() и люди к вам потянутся.
это как раз культуру прививает ;)
кстати в python3000 вроде изначально все в юникоде и это кажется еще лучше.
no subject
Date: 2009-05-16 10:48 pm (UTC)no subject
Date: 2009-05-16 10:49 pm (UTC)no subject
Date: 2009-05-16 10:50 pm (UTC)no subject
Date: 2009-05-16 10:51 pm (UTC)no subject
Date: 2009-05-16 10:53 pm (UTC)no subject
Date: 2009-05-16 10:54 pm (UTC)no subject
Date: 2009-05-16 10:55 pm (UTC)no subject
Date: 2009-05-16 10:55 pm (UTC)no subject
Date: 2009-05-16 10:56 pm (UTC)no subject
Date: 2009-05-16 10:57 pm (UTC)Но в Хаскеле ещё лучше :)
no subject
Date: 2009-05-16 10:58 pm (UTC)(И что есть декораторы?)
no subject
Date: 2009-05-16 10:59 pm (UTC)no subject
Date: 2009-05-16 11:00 pm (UTC)спать пора, что-то пока не придумывается ещё различий, где перл сильно более другой :)