LINUX.ORG.RU

Аналог режима PHP для Python/Ruby


0

2

Знаю, на ЛОРе не любят PHP (я собственно его тоже не люблю), но у него есть классная фишка - отсутсвие необходимости перезагружать сервер. То есть отредактированный файл тут же подхватывается - никакой задержки ни при разработке, ни пре деплоее.

Вообще лучше всего из скриптовых языков я знаю Python, но вообще можно и Ruby - есть ли для них такой же механизм работы?

Я сейчас использую bottle.py - у него есть ощутимая (хотя и не долгая) задержка при перезагрузке сервера. Может у других фреймворков с этим лучше?

★★★
Ответ на: комментарий от theos

Еще примеры стройных языков - Lisp, Haskell, Smalltalk, Javascript - в них нет каких то исключений в синтаксисе, есть небольшой набор базовых правил. Javascript мне не слишком нравится, но стройность ортогональна моим вкусовым предпочтениям, это я не делю на «нравится-не нравится».

Не стройный: PHP, Delphi - порождения эволюции, когда в язык постепенно напихивали разных фич. Внезапный Reference Counting в Deliphi для объектов унаследованных от COM объектов - это нифига не стройно. Это может быть полезно в некоторых случаях (для того и впихнули) - но это делает язык не стройным.

theos ★★★
() автор топика
Ответ на: комментарий от maloi

не использую <> никогда не видел и не пользовался.

Судя по комментариям и «глубине знаний» — не видел и не пользовался. Только иногда на форумах читал отзывы других, таких же, как ты :)

KRoN73 ★★★★★
()

Смолтокер смотрит на вас с непониманием.

yoghurt ★★★★★
()
Ответ на: комментарий от tailgunner

И какой индекс будет у 'some'?

Array
(
    [0] => field1
    [fiel2] => name2
    [1] => some
    [some2] => 10
)
VirRaa ★★★
()
Ответ на: комментарий от KRoN73

Если я правильно понянимаю PHP-конструкцию, это вполне обычный ассоциативный масив. В Python он есть.

P.S. согласен с maloi.

tailgunner ★★★★★
()
Ответ на: комментарий от VirRaa

private и protected появится, тогда и можно будет рассуждать ;)

Я тебя разочарую - private и protected нету во многих стройных языках: JavaScript, SmallTalk - в нем все поля приватны а все методы публичны.

Да, то мне тоже кажется что инкапсуляции в пиотне не хватает, но стройность языка это не отменяет.

theos ★★★
() автор топика

Просто в последнее время стало модным кричать «Похапэ гавно!», при этом совсем не зная его, а что ещё хуже - не зная ничего и о других ЯП.

VirRaa ★★★
()

при использовании nginx+passenger для мягкого рестарта используется «touch tmp/restart.txt» после чего passenger перезапускает все инстансы без отказа от приема запросов.

exception13 ★★★★★
()
Ответ на: комментарий от KRoN73

ага, конечно.
говоришь, что mod_php - не большая проблема, оппонент сразу начинает подозревать, что ты не видел ничего кроме mod_php, хотя подразумевалось-то совсем обратное - от кривого mod_php легко отказаться, и от проблем избавится, но лоровские ясновидящие такие ясновидящие.
говоришь, что виденные тобой акселераторы только добавляют глюков - тут же оказывается, что ты вообще ничего не знаешь (я не спорю, очень может быть, что есть неглючные акселераторы, но почему-то php-бойцы предпочитают утверждать, что они есть, а не называть конкретные единицы неглючных акселераторов)

maloi ★★★★★
()
Ответ на: комментарий от tailgunner

В Python он есть

Вопрос не в массиве. Вопрос в смешанной записи.

Практический пример. Мне нужно описать поля БД для ORM. Свойства объекта могут совпадать с именами полей таблицы БД, могут не совпадать.

Я пишу:

    function table_fields()
    {
        return array(
            'id',
            'login' => 'username',
            'username',
            'user_nick',
            'group_id',
            'user_title' => 'title',
// ...
        );
    }

Как делать такую смешанную запись компактной на Питоне?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

$x = array('field1', 'fiel2' => 'name2', 'some', 'some2' => 10);

Нет пути! Это же читать просто ад. Лучше уж вербозно писать x = {0:'field1', 'field2':'name2', 1:'some', 'some2':10) - не надо считать аргументы и выфильтровывать где ключ-значение, а где только значение. И несмотря на большую вербозность и большую читабельность это таки в питоне записалось короче чем в PHP ;)

theos ★★★
() автор топика
Ответ на: комментарий от maloi

но почему-то php-бойцы предпочитают утверждать, что они есть, а не называть конкретные единицы неглючных акселераторов

Пожалуйста. На высоких нагрузках и в сложных проектах (примеры выше) у меня не глючит xcache. Которым и пользуюсь уже много лет. Проблем за это время не наблюдаю.

KRoN73 ★★★★★
()
Ответ на: комментарий от theos

Это же читать просто ад

Мне лениво было в LORCODE переключаться :) Вот в таком виде оно практически у меня используется: Аналог режима PHP для Python/Ruby (комментарий)

не надо считать аргументы

А оно и не предназначено для ручной «фильтрации». Машина должна работать, человек — думать (c) IBM :)

это таки в питоне записалось короче чем в PHP

Если бы я хотел краткости, я бы писал на Perl'е :) Краткость != не избыточность. Я легко терплю многословные языки (более того, в больших проектах я их предпочитаю), но я ненавижу избыточность.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Вопрос в смешанной записи.

На поверхности, вопрос в том, что в литеральных значениях типа «ассоциативный массив» ты не хочешь указывать ключи для некоторых элементов. Если чуть глубже, сама эта возможность является востребованной только в PHP (из известных мне языков). Так что...

Как делать такую смешанную запись компактной на Питоне?

Такой же компактной, как в PHP - никак. Но написать функцию php_array - дело несложное:

>>> php_array({'foo': 'bar', 'yuk': 'yuk'}, 3, 4)
{0: 3, 1: 4, 'yuk': 'yuk', 'foo': 'bar'}
tailgunner ★★★★★
()
Ответ на: комментарий от KRoN73

Как делать такую смешанную запись компактной на Питоне?

Как то так:

def table_fields(): 
  return fields_mapping('id', ('login', 'username'), 'username', 'user_nick', 'group_id', ('user_title', 'title'))

def fields_mapping(*args):
  result = {}
  i = 0
  for arg in args:
    if isinstance(arg, str):
       result[i] = arg
       i += 1
    else:
      result[arg[0]] = arg[1]  

theos ★★★
() автор топика
Ответ на: комментарий от theos

Мой предыдущий ответ :)

Вообще, написал большой ответ на удалённый (с ошибкой) коммент, но вкратце суть такая — такой вариант допустим, вполне короткий, но весьма избыточный.

Если буду свой фреймворк переводить на Питон, видимо, придётся реализовывать смешанные списки в таком стиле, но, надеюсь, в обозримом будущем не понадобится :D

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Я не лиспер, я фортер, ненавижу лишние скобочки.

А я ненавижу невнятные структуры данных (и, судя по отношению к PHP, не я один).

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

А я ненавижу невнятные структуры данных (и, судя по отношению к PHP, не я один).

Боюсь, в формировании отношения к PHP, его структуры данных лежат на последнем месте :D

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

но весьма избыточный.

Тебе может быть несимпатичен такой синтаксис, по сравнению с php-шным (что я вполне могу понять), но избыточности там нет - отличия лишь синтаксические (если говорить о моем решении, а не tailgunner-a). Ничего считать самому не надо.

theos ★★★
() автор топика
Ответ на: комментарий от theos

отличия лишь синтаксические

Я и имею в виду синтаксическую избыточность.

Ладно, это уже вопросы вкусов :)

KRoN73 ★★★★★
()
Ответ на: комментарий от VirRaa

Стройность всё! ООП ничто! Оу йе!

Так это, мы же говорили про стройность. Инкапсуляцию еще можно добавить в язык, а вот стройность в него уже не вернуть. А во вторых это ломает только инкапсуляцию - которая просто документация, и использование такого костыля как _ в начале имени (или просто комментом что оно private) что бы всем показать что это мое - не трожь я готов использовать. Тем более что ничего серьезного я на языках с динамической типизацией писать не буду :)

theos ★★★
() автор топика
Ответ на: комментарий от theos

Так это, мы же говорили про стройность. Инкапсуляцию еще можно добавить в язык, а вот стройность в него уже не вернуть. А во вторых это ломает только инкапсуляцию - которая просто документация, и использование такого костыля как _ в начале имени (или просто комментом что оно private) что бы всем показать что это мое - не трожь я готов использовать. Тем более что ничего серьезного я на языках с динамической типизацией писать не буду :)

Это ломает накорню всю стройность, путём наращивания костылей в виде комментов или «_» символов.

VirRaa ★★★
()
Ответ на: комментарий от VirRaa

Да не будь белкой-истеричкой. Прекрасно питон живет без инкаспусляции (как и smalltalk), мало того, она в силу его диначиности плохо в него вписывается (потому ее там и нет). Стройная система - это когда нечего удалить, а не нечего добавить.

theos ★★★
() автор топика
Ответ на: комментарий от KRoN73

Это не кусок орм это сдыдоба какая то, но

return Table('id',
          'username',
          'user_nick',
          'group_id',
          user_title= 'title',
          login='username',
);

Но обычно делают декларотивоту в виде:

class MyTable(Table):
 id = String()
 login = String(db_field='username')
 etc

zz ★★★★
()
Ответ на: комментарий от KRoN73

Если буду свой фреймворк переводить на Питон

То что на питоне пишут как на жабе — встречал не раз, и, в принципе, терпеть можно. Но твой код точно заставит кровоточить глаза.

baverman ★★★
()
Ответ на: комментарий от baverman

Но твой код точно заставит кровоточить глаза.

Уговорил, тебе я его не покажу :)

KRoN73 ★★★★★
()
Ответ на: комментарий от baverman

В каком месте?

id = String()
login = String(db_field='username')

Аналог PHPшной записи с точностью до кавычек.

'id',
'login' => 'username',

Я выше писал, что избыточность — это не касательно размера кода. Что за сущность String()? Нафиг мне синтаксический мусор?

В _редких_ случаях, когда не работает автоопределение типов, да, можно пойти и на усложнение синтаксиса:
'id' => array('type' => 'string'),

Но зачем такой мусор использовать постоянно, когда в 99% случаев он не нужен?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Лучше один раз написать нормальный орм (в случае с питон скорее всего взять готовый) чем всю жизнь потом ходить на костылях без метаданных о полях.

zz ★★★★
()
Ответ на: комментарий от KRoN73

Избыточность принимается, если у тебя определения полей для орм в коде занимает хотя бы 0.05%

zz ★★★★
()
Ответ на: комментарий от zz

Лучше один раз написать нормальный орм (в случае с питон скорее всего взять готовый) чем всю жизнь потом ходить на костылях без метаданных о полях

Ты прав. Я так в своё время, уже много лет тому назад и сделал. И, безусловно, использую метаданные. Типы полей, классы для их id, типы полей в форме редактора для автоадминки и т.п.

Но в 99% случаев эти параметры вычисляются. Зачем загружать код синтаксическим мусором?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

очевидно чтобы человек который получил твой код без бд не терялся в догадках что тут происходит или не прыгал из кода в шел с дб клиентом

zz ★★★★
()
Ответ на: комментарий от zz

Избыточность принимается, если у тебя определения полей для орм в коде занимает хотя бы 0.05%

Да нередко и 50% бывает, вообще-то :) Хотя точно не считал, конечно. А процентов 10 кода — очень распространённое явление.

Плюс психологический момент. Обычно описание полей — это самая объёмная разовая работа над классом. Понятно, что есть автоматические описания, генерируемые из описания таблицы в SQL — но это годится только для SQL и только для созданных под ORM таблиц, что бывает не всегда. Понятно, можно использовать автоматическую генерилку классов из таблицы БД, но и тут лишних действий набегает немало.

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

KRoN73 ★★★★★
()
Ответ на: комментарий от baverman

Что не устраивает в записи

Не знаю. Надо будет вживую погонять :)

К такому формату записи претензий нет. Претензии именно к иным вариантам :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

тоесть ты серьзено считаеш что

 array('id', 'status', 'status2') 
через два года нагляднее чем
class Status(Table)
   status = String(choices=['new', 'processed'])
   status2 = Int(min=1, max=3) 

zz ★★★★
()
Ответ на: комментарий от zz

очевидно чтобы человек который получил твой код без бд не терялся в догадках что тут происходит

А БД у меня от ORM оторвана двумя слоями абстрации. Так что в описании полей БД вообще никак не фигурирует (кроме случаев полной автогенерации полей — там, понятно, всё на БД. Но это редкий случай).

И замена бэкенда в общем случае никак со структурой класса не связана.

или не прыгал из кода в шел с дб клиентом

Не требуется :)

KRoN73 ★★★★★
()
Ответ на: комментарий от zz

Да. Намного. Но не в твоём варианте. Ты специально взял дефолтовый стиль моего варианта и с ограничениями в своём. Безусловно, в таком варианте мой код тоже будет достаточно многословен и будет содержать ограничения.

Вот только в 99% случаев это не нужно.

KRoN73 ★★★★★
()
Ответ на: комментарий от tailgunner

В эту запись не вкрячишь числовые (да и любые не-строчные) ключи.

В _моём_ варианте это не нужно. Имена методов не могут быть числовыми :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

я описал поля:

[code] function table_fields() { return array( 'id', 'login' => 'username', 'username', 'user_nick', 'group_id', 'user_title' => 'title', // ... ); } [/code]

потом делаю whatver.group_id = fopen('/dev/random'), что происходит?

zz ★★★★
()
Ответ на: комментарий от tailgunner

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

baverman ★★★
()
Ответ на: комментарий от zz

Во-первых, у меня не свойства, а методы. Свойства в наследниках переопределять геттерами-сеттерами? Мусор же :)

Во-вторых, whatver.set_group_id(fopen('/dev/random')) при жёсткой проверке типов даст исключение, при мягкой — да, запишет мусор (хотя PHP наверняка выкинет NOTICE).

В-третьих, у меня есть голова и вместо того, чтобы считать лишние токены синтаксического мусора, мне просто в голову не придёт написать такой хлам :)

KRoN73 ★★★★★
()
Ответ на: комментарий от baverman

А еще ключи без значений можно указать только в начале

Тогда не годится :-/

Думаю, наш великий PHPшник это скоро поймет, если начнет работать с языком плотнее.

Возможно :) Вполне возможно, что даже взявшись за него плотнее, я с него сбегу на что-то более подходящее.

KRoN73 ★★★★★
()
Ответ на: комментарий от tailgunner

Тогда функцию нужно переименовать

Ну, это уже не ко мне.

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.