ФорумПрограммированиеPython → Python vs Ruby

Python vs Ruby

  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 30 марта 2012 г. 4:53, спустя 1 минуту 24 секунды

    Удобный синтаксис подавления ожидаемых ошибок.

    Опять таки не вижу особой разницы, а глушилку можно приделать, но думаю не стоит
    adw/0
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 30 марта 2012 г. 4:56, спустя 2 минуты 39 секунд

    если для тебя важно в каком языке строк меньше, то вот:
    @unlink('file.txt')
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 30 марта 2012 г. 5:04, спустя 7 минут 57 секунд


    adw0rd, непонятно, почему программист должен решать задачу интерпретатора. в пхп например я использую foreach и не задумываюсь, последний ли индекс в массиве. в руби (и питоне наверное) есть итераторы, которые решают аналогичную задачу. когда и зачем требуется обратиться к элементу массива/коллекции по индексу?


    Например, LazyLoad:
    1. IndexError - если нет индекса, то ищет его где-то в хранилище и замещает локально
    2. StopIteration - ловим исключение, подгружаем из хранилища порцию данных, продолжаем итерацию

    Вот для чего это нужно, причем тут "почему программист должен решать задачу интерпретатора" я не понимаю вопроса
    Спустя 68 сек.

    если для тебя важно в каком языке строк меньше, то вот:
    @unlink('file.txt')

    это не мне важно, это важно автору статьи, я только обсуждаю и привожу аналоги
    Спустя 20 сек.

    Во-вторых, вот вам укороченная версия, только что написал:


    Перестаньте писать классы

    баян, перепищи гокаркас на функции
    Спустя 242 сек.

    Есть языковая конструкция switch. А в python — нету.

    http://habrahabr.ru/company/radmin/blog/137497/


    И не надо. На практике у меня не возникает в нём потребности

    http://bytebaker.com/2008/11/03/switch-case-statement-in-python/
    http://simonwillison.net/2004/may/7/switch/
    Спустя 72 сек.
    http://habrahabr.ru/company/radmin/blog/137497/
    остальное обсуждается в камментах
    adw/0
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 30 марта 2012 г. 5: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


    и подписывайтесь на его блог http://asvetlov.blogspot.com/
    adw/0
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 30 марта 2012 г. 5:17, спустя 2 минуты 16 секунд

    Например, LazyLoad

    это задача класса )

    я думаю, ответ в том, что в руби-way не принято использовать nil в качестве значений. тогда nil эквивалентно IndexError/StopIteration
    не всё полезно, что в swap полезло
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 30 марта 2012 г. 5:27, спустя 9 минут 48 секунд

    "почему программист должен решать задачу интерпретатора" я не понимаю вопроса

    это значит что язык высокого уровня не должен занимать программиста обработкой ошибок
    не всё полезно, что в swap полезло
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 30 марта 2012 г. 5:45, спустя 17 минут 59 секунд

    Задача LazyLoad для руби решается так:

    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} // анонимная функция


    стандартный метод fetch возвращает ошибку при обращении к несуществующему индексу

    другой вариант - использование примеси с перегрузкой метода [], в котором используется опять же fetch, это для случая, если значения нужно вычислять и сохранять типа в кэше


    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
    не всё полезно, что в swap полезло
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 30 марта 2012 г. 5:47, спустя 2 минуты 16 секунд


    Например, LazyLoad

    это задача класса )

    класс это только структура, в конечном итоге всеравно для прозрачности (крякать как коллекция) будет использоваться IndexError/StopIteration

    Типа того:

    class LazyChunks(object):
       pass

    chunks = LazyChunks()
    for chunk in chunks:
       pass

    # или
    chunks[100500]
    Спустя 77 сек.

    "почему программист должен решать задачу интерпретатора" я не понимаю вопроса

    это значит что язык высокого уровня не должен занимать программиста обработкой ошибок
    программист не решает проблем интерпретатора, он пользуется возможностью управлять поведением
    adw/0
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 30 марта 2012 г. 5:47, спустя 21 секунду

    adw0rd, я имею ввиду что мне совсем не интересно обрабатывать каждый случай обращения к элементу массива по индексу. меня устроит в большинстве случаев получить nil, и я буду знать что я туда ничего не записывал
    не всё полезно, что в swap полезло
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 30 марта 2012 г. 5:50, спустя 2 минуты 38 секунд

    я думаю, ответ в том, что в руби-way не принято использовать nil в качестве значений. тогда nil эквивалентно IndexError/StopIteration

    понятно, но странно
    Спустя 87 сек.

    adw0rd, я имею ввиду что мне совсем не интересно обрабатывать каждый случай обращения к элементу массива по индексу. меня устроит в большинстве случаев получить nil, и я буду знать что я туда ничего не записывал
    ну тогда тебя устроит:

    value = data.get('index', None)
    Спустя 55 сек.
    либо

    is_value = 'index' in data
    adw/0
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 30 марта 2012 г. 6:07, спустя 17 минут 5 секунд

    adw0rd, прелестные сообщения от тебя мой король :D
    Сапожник без сапог
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 30 марта 2012 г. 6:27, спустя 20 минут 4 секунды

    хм…


    preg_match('/(?<x>\d+)x(?<y>\d+)/', '25x30', $matches); extract($matches);
    echo "magic:  $x, $y";



    Ну да, можно и так, и даже в одну строку!!111!1!! :))
    globals().update(re.search('(?P<x>\d+)x(?P<y>\d+)', '25x30').groupdict()); print x, y

    но только речь была о короткости конструкции
    Спустя 30 сек.

    adw0rd, прелестные сообщения от тебя мой король :D
    стёб засчитан )
    adw/0
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 30 марта 2012 г. 7:17, спустя 49 минут 38 секунд

    стёб засчитан )

    это не стеб, мой король!
    Сапожник без сапог
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 30 марта 2012 г. 7:49, спустя 32 минуты 16 секунд

    adw0rd, классно ты пояснил про меджики)) я чето даже не задумывался что это и правда просто перегрузка операторов.

    запилил

    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')


    питон охуенен)
    Сапожник без сапог
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 30 марта 2012 г. 8:01, спустя 12 минут 31 секунду

    adw0rd, классно ты пояснил про меджики)) я чето даже не задумывался что это и правда просто перегрузка операторов.

    да, в этом плане питон очень крут
    adw/0

Пожалуйста, авторизуйтесь, чтобы написать комментарий!