Skip to content

Instantly share code, notes, and snippets.

@generall
Last active January 19, 2016 15:35
Show Gist options
  • Save generall/87d1c369d96db44e53a4 to your computer and use it in GitHub Desktop.
Save generall/87d1c369d96db44e53a4 to your computer and use it in GitHub Desktop.
python VS ruby in examples

##python vs ruby

###Выборка элементов из массива

ruby

arr[n..m]

python

arr[n:m]
arr[n:] # если нужно до конца

Если граница переменная - нужно обрабатывать 2 случая отдельно

###Получение элементов из мапы

ruby

map[non_existing_key]
# => nil

python

map[non_existing_key]
# => Exception
# для None нужно использовать длинный синтаксис.
# не встречал ни одной ситуации, где выброс эксепшена нужно было бы как-то обрабатывать помимо добавления этого самого ключа

Плюс в руби можно значения по-умолчанию.

###Виртуальная среда vs bundler

Сам не работал, но видел как используют в питоне - не впечатлило

###Почему отступы в питоне - неуклюжие

Пусть нужно добавить if в существующий код:

ruby way:

  • добавить if и end
  • сказать редактору, чтоб отформатировал код

python way:

  • добавить if
  • если в редакторе есть multiedit - сдвинуть нужные строки
  • если нету - страдать

###self методах

Тут просто лишние сущности в которых, к тому же, лично я часто делаю опечатки.

###Консольный питон из коробки не умеет ничего

Не может даже в автодополнение

###Ужасные внешнее функции вида len(), не соответствуют объектному подходу

К тому же это осложняет автокомплит. В руби наличие функции .size можно проверить табом, а в питоне только ловить эксепшен из len и других подобных внешних функций.

###Лямбда-выражения ужасны, невозможно написать многострочными

ruby

arr.filter{|x| x != nil}

ruby

arr.filter do |x| 
	x != nil
end

python

filter(lambda x: x != None, arr)

###Непонятно как делать многострочные комманды

Возможно, существует специальные методы, но я сколько ни пробовал, все время огребал ошибку по отступам.

ruby

foo({
	bar: 1,
	baz: 2,
	zen: 3
})

python

foo({bar : 1, baz : 2, zen: 3})

UPD:

На самом деле возможно, но это требует соблюдения определенных правил с отступами

###2 версии питона

обратная совместимость нарушена.

###Необходимость везде скобки писать

ruby

p debug_str

vs

python

print(debug_str)

Саппресс эксепшена

ruby

wired = 0/0 rescue "wtf"

python

try:
    wired = 0/0
except Exception:
    wired = "wtf"

Запись чисел

ruby

billion = 1_000_000_000;

python

billion = 100000000 # yes, I make a mistake

Где питон лучше

###Руби медленнее

###Комьюнити больше

###многострочные комментарии в питоне лучше

ruby (обязательно в начале строки)

=begin
		какой-то коммент
=end

python

'''
		какой-то коммент
'''
@generall
Copy link
Author

1, 2 - я вроде так и писал. В первом - проблема именно питона в том, что для выборки до конца нужен отдельный специальный синкасис
Во втором - "Плюс в руби можно значения по-умолчанию."
3 - если честно, не вижу идеологической разницы между лямбдами и блоками в этом случае. Ведь в каноничном определении лямбда - это анонимная функция, которая в себя захватывает контекст выполнения.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment