avva: (Default)
[personal profile] avva
Я наконец начал писать на Пайтоне. Но, по-моему, пишу в нем пока что в стиле Перла.

Из того, что не нравится:

- это ненормально, когда в языке есть встроенная функция open(), а встроенной функции close() нету. Есть в этом что-то извращенное.

- основной аргумент поклонников Пайтона - что в нем все продумано, логично, и на все есть один логичный способ это сделать, в отличие от Перла, где все можно сделать сотней разных способов. Но при приближении к объекту начинают бросаться в глаза трещины и морщины. Меня поразило количество встроенных в язык путей интерполировать значение внутри строки: 1) синтаксис %s и оператор % 2) синтаксис {0} и метод str.format() 3) синтаксис $x и класс string.Template. При этом все три способа оказались недостаточно мощными для моих достаточно скромных целей.

- какая-то фигня с Юникодом происходит. print не умеет выводить ничего, кроме байтов; нет способа объяснить ему, что юникодные строки надо выводить всегда в такой-то кодировке. Поэтому печать utf-8 строк либо включает в себя кучу вызовов decode() практически на каждую строку, либо пользуется менее удобными функциями, чем print.

В целом язык приятный. К significant whitespace привыкаешь очень быстро, и к {} обратно не тянет. Вообще синтаксис очень легкий, простой и интуитивный в большинстве случаев. Посмотрим, что он еще расскажет.

Date: 2009-05-16 09:59 pm (UTC)
From: [identity profile] xxqs.livejournal.com
а ещё куча библиотек под питон заточена на линукс - особенно те, что линкуются с native libraries, например, для сетевых вызовов.
Портировать этот зоопарк, например, на солярис - это сплошные танцы с бубнами.

в общем, если есть возможность не использовать пайтон, то я и не использую :)

Date: 2009-05-16 10:48 pm (UTC)
From: [identity profile] ob3r0n.livejournal.com
вы просто не умеете его готовить ;)

(no subject)

From: [identity profile] xxqs.livejournal.com - Date: 2009-05-16 10:53 pm (UTC) - Expand

(no subject)

From: [identity profile] ob3r0n.livejournal.com - Date: 2009-05-16 10:54 pm (UTC) - Expand

(no subject)

From: [identity profile] xxqs.livejournal.com - Date: 2009-05-16 11:00 pm (UTC) - Expand

(no subject)

From: [identity profile] ob3r0n.livejournal.com - Date: 2009-05-16 11:04 pm (UTC) - Expand

(no subject)

From: [identity profile] xxqs.livejournal.com - Date: 2009-05-17 10:19 am (UTC) - Expand

(no subject)

From: [identity profile] ob3r0n.livejournal.com - Date: 2009-05-17 10:58 am (UTC) - Expand

Date: 2009-05-17 08:38 am (UTC)
From: [identity profile] squadette.livejournal.com
про Hurd я просто молчу :(

в этом отношении сосут практически все языки и библиотеки!

включая, кстати, и Солярис!

(no subject)

From: [identity profile] xxqs.livejournal.com - Date: 2009-05-17 10:34 am (UTC) - Expand

Date: 2009-05-16 10:02 pm (UTC)
From: [identity profile] unbe.livejournal.com
а еще раздражает self и __такие__ методы

Date: 2009-05-16 10:49 pm (UTC)
From: [identity profile] ob3r0n.livejournal.com
как-то методы надо отделять друг от друга. и хорошо что они отделяются графически (символьно), а уже использовать для этого знаки подчеркивания или что-то другое - тут на вкус и цвет

Date: 2009-05-17 09:29 am (UTC)
From: [identity profile] avnik.livejournal.com
Ну из них все кроме __init__ означают перегрузку оператора, или перехват какой-то сткандартной операции. И хорошо что всякая черная магия выделена синтаксически.

А self всего лишь соглашение о именовании, также как для классметодов принято писать cls.

Date: 2009-05-17 02:57 pm (UTC)
From: [identity profile] obiwanus.livejournal.com
self чем хуже чем this? :)
а меня после питона стало раздражать { }

Date: 2009-05-16 10:03 pm (UTC)
From: [identity profile] avnik.livejournal.com
f=open('spam')
f.write('eggs\n')
f.close()
Вполне себе есть.

open (он же file) правильнее рассматривать как конструктор, а не как функцию.

PS Кстати %s может быть и %(key)s -- тогда правый аргумент % трактуется как dict

Date: 2009-05-16 10:09 pm (UTC)
From: [identity profile] unbe.livejournal.com
конструктор - это, например, в ruby, а здесь натурально built-in function. Вместе с другими built-in functions типа len() вызывает некоторое недоумение.

(no subject)

From: [personal profile] nine_k - Date: 2009-05-16 10:32 pm (UTC) - Expand

(no subject)

From: [identity profile] amarao-san.livejournal.com - Date: 2009-05-16 10:33 pm (UTC) - Expand

Date: 2009-05-16 10:11 pm (UTC)
From: [identity profile] http://users.livejournal.com/_nik_/
А можно подробнее про фигню с юникодом? Файл начинается ли с чего-либо вроде следующего:
#!/usr/bin/env python2.5
# -*- coding: utf-8 -*-

?

Date: 2009-05-16 10:15 pm (UTC)
From: [identity profile] avva.livejournal.com
это ничего не дает, кроме того, что можно literals внутри исходников на utf-8 писать. Конкретно, добавьте к вашим двум строчкам

a = u"не работает"
print a

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ordinal not in range(256)

(no subject)

From: [identity profile] http://users.livejournal.com/_nik_/ - Date: 2009-05-16 10:23 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2009-05-16 10:30 pm (UTC) - Expand

(no subject)

From: [personal profile] nine_k - Date: 2009-05-16 11:42 pm (UTC) - Expand

(no subject)

From: [identity profile] ezhik-israely.livejournal.com - Date: 2009-05-16 10:55 pm (UTC) - Expand

Date: 2009-05-16 10:50 pm (UTC)
From: [identity profile] ob3r0n.livejournal.com
это означает лишь то, что все нелатинские буквы будут трактоваться в кодировке utf8

(no subject)

From: [identity profile] http://users.livejournal.com/_nik_/ - Date: 2009-05-16 10:55 pm (UTC) - Expand

(no subject)

From: [identity profile] ob3r0n.livejournal.com - Date: 2009-05-16 10:56 pm (UTC) - Expand

(no subject)

From: [identity profile] janatem.livejournal.com - Date: 2009-05-17 05:28 pm (UTC) - Expand

Date: 2009-05-16 10:30 pm (UTC)
From: [identity profile] amarao-san.livejournal.com
Самое интересное там начинается в районе функционального программирования. Итератор, возвращающий функции - это же круто!

Date: 2009-05-16 10:51 pm (UTC)
From: [identity profile] ob3r0n.livejournal.com
а замыкания и декораторы - вообще верх совершенства )

(no subject)

From: [identity profile] amarao-san.livejournal.com - Date: 2009-05-16 10:58 pm (UTC) - Expand

(no subject)

From: [identity profile] ob3r0n.livejournal.com - Date: 2009-05-16 11:01 pm (UTC) - Expand

(no subject)

From: [identity profile] drmor.livejournal.com - Date: 2009-05-17 06:57 am (UTC) - Expand

(no subject)

From: [identity profile] nec-p1us-u1tra.livejournal.com - Date: 2009-05-16 10:59 pm (UTC) - Expand

(no subject)

From: [identity profile] ob3r0n.livejournal.com - Date: 2009-05-16 11:05 pm (UTC) - Expand

(no subject)

From: [identity profile] nec-p1us-u1tra.livejournal.com - Date: 2009-05-16 11:10 pm (UTC) - Expand

(no subject)

From: [identity profile] ob3r0n.livejournal.com - Date: 2009-05-16 11:22 pm (UTC) - Expand

(no subject)

From: [personal profile] nine_k - Date: 2009-05-16 11:44 pm (UTC) - Expand

(no subject)

From: [identity profile] meanab.livejournal.com - Date: 2009-05-17 09:02 am (UTC) - Expand

Date: 2009-05-17 08:55 am (UTC)
From: [identity profile] migmit.vox.com (from livejournal.com)
А там есть функциональное программирование??? Он же даже хвостовую рекурсию, вроде, до сих пор не умеет.

(no subject)

From: [identity profile] eterevsky.livejournal.com - Date: 2009-05-18 10:14 am (UTC) - Expand

Date: 2009-05-16 10:48 pm (UTC)
From: [identity profile] ob3r0n.livejournal.com
кто сказал что можно сделать одним возможным способом?

oberon@darkstar:~/Загрузки$ python
Python 2.4.6 (#2, Feb 17 2009, 20:01:48) 
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!


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

print как раз адекватно работает.

другое дело, что люди не отличают unicode и utf8

надо просто уметь общаться с encode() decode() и люди к вам потянутся.

это как раз культуру прививает ;)

кстати в python3000 вроде изначально все в юникоде и это кажется еще лучше.

Date: 2009-05-16 10:57 pm (UTC)
alexeybobkov: (Default)
From: [personal profile] alexeybobkov
К significant whitespace привыкаешь очень быстро, и к {} обратно не тянет

Но в Хаскеле ещё лучше :)

Date: 2009-05-16 11:46 pm (UTC)
nine_k: A stream of colors expanding from brain (Default)
From: [personal profile] nine_k
У Хаскеля порог вхождения много выше.
Питон всё же разрабатывался изначально как язык для обучения. (И до сих пор отлично подходит.)

(no subject)

From: [personal profile] alexeybobkov - Date: 2009-05-18 05:44 am (UTC) - Expand

Date: 2009-05-16 11:02 pm (UTC)
From: [identity profile] nec-p1us-u1tra.livejournal.com
Мой первый большой бумц в питоне случился с достаточно простым объектом -- списком списков. Оказывается присваивание в питоне это shallow copy 8( полдня ловил этот прикол.

Date: 2009-05-16 11:51 pm (UTC)
nine_k: A stream of colors expanding from brain (Default)
From: [personal profile] nine_k
Есть ещё классический прикол, когда значением параметра по умолчанию делается mutable объект: он же между вызовами сохраняется!
>>> def foo(p, x={}):
...   x[p]="used up"
...   return x
... 
>>> foo(1)
{1: 'used up'}
>>> foo(2)
{1: 'used up', 2: 'used up'}
>>> _

Не программисткое

Date: 2009-05-17 05:12 am (UTC)
nechaman: (Default)
From: [personal profile] nechaman
"есть встроенная функция open(), а встроенной функции close() "
Когда подумаешь о всем нашем мире, то наверное такое и неплохо.

Date: 2009-05-17 07:21 am (UTC)
From: [identity profile] kzn.livejournal.com
Знаю, наверное глупо спрашивать, но
1. локаль стоит?
2. случайно ли не ipython -- у него есть некоторые проблемы с юникодом.


Вообще, язык очень приятный. Как многие замечали, в чем-то похож на lisp.
И что хорошо -- есть куча различных библиотек + высокие возможности интеграции с C и C++ -- тот же boost.python.

Date: 2009-05-17 08:36 am (UTC)
From: [identity profile] pesec.livejournal.com
А ещё, а ещё -- в нём есть Глобальный Лок, и один инстанс питона не может кушать больше 100% одного процессора.

Date: 2009-05-18 10:18 am (UTC)
From: [identity profile] eterevsky.livejournal.com
Над этим работают (http://code.google.com/p/unladen-swallow/).

Date: 2009-05-17 08:39 am (UTC)
From: [identity profile] bolk.livejournal.com
Про продуманность, это байка. В интернетах можно найти статьи с критикой, там можно увидеть сколько непродуманных мест в языке, причём в Python3 мало что изменится.

А так язык приятный, да. Пишу меньше года, но этого уже достаточно, чтобы его почувствовать.

Кстати, встроенный close и не нужен. Достаточно удалить объект.

Date: 2009-05-18 09:33 am (UTC)
From: [identity profile] http://users.livejournal.com/_nik_/
> причём в Python3 мало что изменится.

А почему в будущем времени? python 3 давно уже вышел, готовится к выпуску 3.1…

(no subject)

From: [identity profile] bolk.livejournal.com - Date: 2009-05-18 10:49 am (UTC) - Expand

Stackless и Nagare

Date: 2009-05-17 11:07 am (UTC)
From: [identity profile] hml.livejournal.com
Кстати, очень советую обратить внимание на Stackless Python и построенный на его основе фреймворк Nagare (http://www.nagare.org). Если кратко, то в stackless добавляются легковесные нити и продолжения, а Nagare очень органично использует их для сохранения/восстановления состояния web-приложения, так что логика программирования для web становится абсолютно такой же, как и для обычного приложения.
А как там можно генерировать html! Например:

with h.table(border=1):
with h.tr:
with h.td:
h<<u"Cell1" with h.td: h<<u"Cell2" with h.tr: with h.td: h<<h.a("Link1").action(lambda: self.some_func("l1")) with h.td: h<<h.a("Link2").action(self.some_func2)

Re: Stackless и Nagare

Date: 2009-05-17 11:08 am (UTC)
From: [identity profile] hml.livejournal.com
упс, форматирование съелось

Date: 2009-05-18 10:19 am (UTC)
From: [identity profile] eterevsky.livejournal.com
Непонимание юникода меня тоже очень раздражает. Вроде бы, это исправили в Python 3.

Date: 2009-05-19 11:03 am (UTC)
From: [identity profile] yuripats.livejournal.com
Питон.

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 05:36 am
Powered by Dreamwidth Studios