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

Python vs Ruby

  • adw0rd

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

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

    Spritz 30 марта 2012 г. 0:16, спустя 8 минут 14 секунд

    Сапожник без сапог
  • adw0rd

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

    Spritz 30 марта 2012 г. 0:52, спустя 36 минут 17 секунд

    К слову о:

    Начиная с версии 1.9 named capture groups в регулярных выражениях можно автоматически превращать в переменные.


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


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

    import re

    class regexp(object):
       def __init__(self, pattern):
           self.pattern = pattern

       def __xor__(self, string):
           groups = re.search(self.pattern, string).groupdict()
           globals().update(groups)
           return None


    Вызывается так

    regexp(&#39;(?P<x>\d+)x(?P<y>\d+)&#39;) ^ &quot;25x30&quot;
    print x, y


    Почитав это: http://www.rafekettler.com/magicmethods.html, можете сами найти нужный вам синтаксис
    adw/0
  • adw0rd

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

    Spritz 30 марта 2012 г. 0:40, спустя 23 часа 48 минут 19 секунд

    Интерполяция строк позволяет включать в строки код на Ruby, автоматически подставляя в строку результат его выполнения.

    Опять таки, можно тоже сделать, но этом будет eval, мне больше нравится format

    И кстати format очень мощный:
    http://docs.python.org/library/string.html#formatstrings
    http://asvetlov.blogspot.com/2011/02/formatting.html
    adw/0
  • Абырвалг

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

    Spritz 30 марта 2012 г. 0:48, спустя 7 минут 53 секунды

    globals().update(groups)

    а если мне нужно заимпортить не в глобальную область видимости а в текущую?
  • adw0rd

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

    Spritz 30 марта 2012 г. 0:51, спустя 2 минуты 20 секунд


    Индексирование за пределами коллекции возвращает nil, что позволяет в ряде случаев писать очень лаконичный код.


    nil в Ruby это всё тотже None/null?
    Тогда плохо что он так делает, как можно будет отличить IndexError/StopIteration от значения в коллекции?

    >>> l = [1, 2, None]
    >>> print l[2]
    None
    >>> print l[5]
    Traceback (most recent call last):
     File &quot;<stdin>&quot;, line 1, in <module>
    IndexError: list index out of range



    >>> l = iter([1, 2, None])
    >>> print l.next()
    1
    >>> print l.next()
    2
    >>> print l.next()
    None
    >>> print l.next()
    Traceback (most recent call last):
     File &quot;<stdin>&quot;, line 1, in <module>
    StopIteration


    Вообщем за счет чего в Ruby это всё корректно обрабатывается? {+++15+++}

           globals().update(groups)

    а если мне нужно заимпортить не в глобальную область видимости а в текущую?
    locals() {+++91+++}
    ps. globals() будет распостронятся только на модуль, а locals() будет доступен только в методе regexp.__xor__
    adw/0
  • master

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

    Spritz 30 марта 2012 г. 1:09, спустя 18 минут 28 секунд

    как можно будет отличить IndexError/StopIteration от значения в коллекции?

    а это вообще нужно?
    не всё полезно, что в swap полезло
  • Абырвалг

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

    Spritz 30 марта 2012 г. 1:12, спустя 2 минуты 55 секунд

    ps. globals() будет распостронятся только на модуль, а locals() будет доступен только в методе regexp.__xor__

    мне нужно в контексте вызова этой твоей чудо-функции
  • adw0rd

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

    Spritz 30 марта 2012 г. 1:20, спустя 8 минут 17 секунд

    Чтобы не играться с globals, я бы использовал так:

    class regexp(object):
       def __init__(self, pattern):
    self.pattern = pattern

       def __xor__(self, string):
           import re
           groups = re.search(self.pattern, string).groups()
           return groups



    x, y = regexp(&#39;(\d+)x(\d+)&#39;) ^ &quot;25x30&quot;


    Это более правильных подход
    adw/0
  • artoodetoo

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

    Spritz 30 марта 2012 г. 1:17, спустя 23 часа 56 минут 52 секунды


    Начиная с версии 1.9 named capture groups в регулярных выражениях можно автоматически превращать в переменные.


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


    хм…

    preg_match(&#39;/(?<x>\d+)x(?<y>\d+)/&#39;, &#39;25x30&#39;, $matches); extract($matches);
    echo &quot;magic: $x, $y&quot;;



    magic: 25, 30
    ιιlllιlllι унц-унц
  • Абырвалг

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

    Spritz 30 марта 2012 г. 1:18, спустя 50 секунд

    adw0rd, да, вот так кулл
  • adw0rd

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

    Spritz 30 марта 2012 г. 1:18, спустя 9 секунд


    как можно будет отличить IndexError/StopIteration от значения в коллекции?

    а это вообще нужно?

    1. надо понимать что коллекция кончилась
    2. надо понимать что nil это кончилась коллекция или это значение коллекции

    Что не понятно?
    adw/0
  • Sinkler

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

    Spritz 30 марта 2012 г. 1:26, спустя 7 минут 20 секунд



    как можно будет отличить IndexError/StopIteration от значения в коллекции?

    а это вообще нужно?

    1. надо понимать что коллекция кончилась
    2. надо понимать что nil это кончилась коллекция или это значение коллекции
    это да, хороший аргумент
  • master

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

    Spritz 30 марта 2012 г. 1:26, спустя 26 секунд

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

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

    Spritz 30 марта 2012 г. 1:52, спустя 25 минут 55 секунд

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


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

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