Удобный синтаксис подавления ожидаемых ошибок.
Опять таки не вижу особой разницы, а глушилку можно приделать, но думаю не стоит
Форум → Программирование → Python → Python vs Ruby
Страницы: ← Предыдущая страница • Следующая страница →
30 марта 2012 г. 12:53, спустя 1 минуту 24 секунды
Удобный синтаксис подавления ожидаемых ошибок.
30 марта 2012 г. 12:56, спустя 2 минуты 39 секунд
@unlink('file.txt')
30 марта 2012 г. 13:04, спустя 7 минут 57 секунд
adw0rd, непонятно, почему программист должен решать задачу интерпретатора. в пхп например я использую foreach и не задумываюсь, последний ли индекс в массиве. в руби (и питоне наверное) есть итераторы, которые решают аналогичную задачу. когда и зачем требуется обратиться к элементу массива/коллекции по индексу?
это не мне важно, это важно автору статьи, я только обсуждаю и привожу аналоги
если для тебя важно в каком языке строк меньше, то вот:@unlink('file.txt')
баян, перепищи гокаркас на функцииВо-вторых, вот вам укороченная версия, только что написал:
Перестаньте писать классы
Есть языковая конструкция switch. А в python — нету.
http://habrahabr.ru/company/radmin/blog/137497/
30 марта 2012 г. 13:15, спустя 10 минут 39 секунд
О себе:
Я пишу на Питоне десять с лишним лет, с Руби знаком довольно поверхностно.
С недавних пор являюсь Python Core Developer с commit rights.
На последнем US PyCon в Санта-Кларе Гвидо ван Россум произнес замечательную речь — всем рекомендую посмотреть.
В частности, он указал, что Питон и Руби — почти что близнецы-братья. Различия между ними гораздо меньше, чем противопоставление этих языков всем остальным.
Давайте дружить, а не выяснять кто круче.
Теперь по конкретным претензиям к автору (по части Питона, конечно — пусть знающий рубист тоже скажет веское слово).
— Питон имеет встроенный модуль ssl. Из-за древних лицензионных дрязг с Микрософт (поправьте, если не так) в дистрибутив для Windows этот модуль не включается. На всех остальных ОС он есть.
— subprocess позволяет указывать параметры командной строки одной строчкой, при этом следует вызывать с параметром shell=True. Это не так лаконично, как просто скобки — но способ есть. К тому же следует понимать, что вызов подпроцесса далеко не всегда сводится к подстановке текстового вывода в переменную. Есть еще return code, stderr, интерактивность…
— Питон может импортировать модули по относительному пути. Это именно относительный путь для модулей, а не файлов. Модули должны лежать в пакетах (папках, в которых есть __init__.py). Читатели уже указали на этот момент.
— codecs.open позволяет указать кодировку для открываемого файла. open поддерживает параметр encoding для тех же целей.
— хорошо это или нет, но при использовании потоков операционной системы нет надежного способа уничтожить поток. Всегда есть риск того, что используемые ресурсы не освободятся (память, соединения с базой данных и прочие сокеты и т.д.) Поэтому Питон и не имеет такой возможности. Нужно послать потоку сообщение тем или иным способом, а уж там он сам обязан разобраться.
Прочее: как уже читатели отметили, некоторые части не включены в дистрибутив Питона, но доступны как сторонние библиотеки.
— pytz. Список timezone обновляется чаще, чем полуторагодичный период для выпуска нового Питона. В документации ссылки на pytz нет — поправим.
— шаблонизатор. Большее, чем string.Template в стандартную поставку не включили. Потому что не ясно, какой шаблонизатор устроил бы всех. jinja2, которым я пользуюсь — отличная штука. Опять же слишком быстро развивающаяся и слишком независимая, чтобы быть частью Питона как дистрибутива.
Полезных штук много. Но если библиотека включена в Стандартный Питон — она обязана сохранять обратную совместимость. Зачастую это слишком накладно и не позволяет развиваться быстро, выпуская релизы каждые три месяца а не раз в полтора года, как это делает Питон.
И, наконец, главное.
python2 уже мертв. Да, мы часто делаем bug-fixes. python2.7.3 будет скоро. Но Двойка закончилась два года назад.
Все больше и больше библиотек подтверждают свою поддержку Тройки.
— SQLAlchemy сделала это уже давно.
— Jinga2 — тоже.
— Pyramid — неделю назад.
— WebOb, от которого зависела Pyramid — в конце прошлого года.
— Django тоже перейдет на тройку — они обещали.
Ребята, Python3 — это ваше будущее, которое наступает на пятки. Будьте готовы!
UPD: Django 1.5, которая выйдет осенью, будет иметь экспериментальную поддержку Python 3.3
30 марта 2012 г. 13:17, спустя 2 минуты 16 секунд
Например, LazyLoad
30 марта 2012 г. 13:27, спустя 9 минут 48 секунд
"почему программист должен решать задачу интерпретатора" я не понимаю вопроса
30 марта 2012 г. 13:45, спустя 17 минут 59 секунд
def square i
i*i
end
a = [0, 1, 4, 9] // массив где значения равны квадрату индекса
puts a.fetch(7) {|index| square index} // обращаемся к несуществующему индексу, вызываем функцию square(7), получаем 49
puts a.fetch(9) {|index| index * index} // анонимная функция
class MyStorage < Hash
def [] index
begin
self.fetch index
rescue IndexError
self[index] = index * index
self[index]
end
end
end
cache = MyStorage.new
puts cache[150]
puts cache.inspect
30 марта 2012 г. 13:47, спустя 2 минуты 16 секунд
класс это только структура, в конечном итоге всеравно для прозрачности (крякать как коллекция) будет использоваться IndexError/StopIterationНапример, LazyLoad
это задача класса )
class LazyChunks(object):
pass
chunks = LazyChunks()
for chunk in chunks:
pass
# или
chunks[100500]
программист не решает проблем интерпретатора, он пользуется возможностью управлять поведением"почему программист должен решать задачу интерпретатора" я не понимаю вопроса
это значит что язык высокого уровня не должен занимать программиста обработкой ошибок
30 марта 2012 г. 13:47, спустя 21 секунду
30 марта 2012 г. 13:50, спустя 2 минуты 38 секунд
я думаю, ответ в том, что в руби-way не принято использовать nil в качестве значений. тогда nil эквивалентно IndexError/StopIteration
ну тогда тебя устроит:
adw0rd, я имею ввиду что мне совсем не интересно обрабатывать каждый случай обращения к элементу массива по индексу. меня устроит в большинстве случаев получить nil, и я буду знать что я туда ничего не записывал
value = data.get('index', None)
is_value = 'index' in data
30 марта 2012 г. 14:07, спустя 17 минут 5 секунд
30 марта 2012 г. 14:27, спустя 20 минут 4 секунды
хм…
preg_match('/(?<x>\d+)x(?<y>\d+)/', '25x30', $matches); extract($matches);
echo "magic: $x, $y";
globals().update(re.search('(?P<x>\d+)x(?P<y>\d+)', '25x30').groupdict()); print x, y
стёб засчитан )
adw0rd, прелестные сообщения от тебя мой король :D
30 марта 2012 г. 15:17, спустя 49 минут 38 секунд
стёб засчитан )
30 марта 2012 г. 15:49, спустя 32 минуты 16 секунд
class regex(object):
pattern = ''
flags = 0
def __init__(self, pattern, flags=0):
self.pattern = pattern
self.flags = int(flags)
def __xor__(self, other):
import re
if isinstance(other, str):
result = re.search(self.pattern, other, self.flags)
return result.groups() if result else None
elif isinstance(other, (list, tuple,)) and len(other) == 2:
return re.sub(re.compile(self.pattern, self.flags), other[1], other[0])
print regex('(?P<name>\w+): (?P<digit>\d+)') ^ 'foobar: 2008'
print regex('(?P<name>\w+): (?P<digit>\d+)') ^ ('foobar: 2008', 'amazing \\2')
30 марта 2012 г. 16:01, спустя 12 минут 31 секунду
adw0rd, классно ты пояснил про меджики)) я чето даже не задумывался что это и правда просто перегрузка операторов.
Страницы: ← Предыдущая страница • Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!