Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Я (не)? пишу код в стилі бароко.

with 16 comments

Італійською barocco — “чудернацький”, “дивний”, “схильний до надлишків”.

Написав таке:

        x1 = int(request.form['x1'])

Потім подумав, і написав таке (назвемо це варіант A):

        x1, y1, x2, y2 = (
            int(request.form[field])
            for field in ('x1', 'y1', 'x2', 'y2')
        )

Потім ще раз подумав, повернувся до попереднього варіанту, і продовжив так (назвемо це варіант B):

        x1 = int(request.form['x1'])
        y1 = int(request.form['y1'])
        x2 = int(request.form['x2'])
        y2 = int(request.form['y2'])

Тому що кількість рядків в обох варіантах однакова, і генераторні вирази тут, пробачте мою французьку, – то таки барокко. Але схильність до нього в мене чомусь є. Може б то зайнятись мазохізмом і покодити на Java для профілактики?

UPD: Варіант DRY (Dmytrish Recommens You 🙂 )

        f = lambda n: int(request.form[n])
        x1 = f('x1')
        y1 = f('y1')
        x2 = f('x2')
        y2 = f('y2')
Advertisements

Written by bunyk

Листопад 12, 2013 at 14:19

Оприлюднено в Кодерство

Tagged with

Відповідей: 16

Subscribe to comments with RSS.

  1. А навіщо тобі 4 зміних, а якщо понадобиться більше ти ще наробиш ? А якщо int не сможе сконвертувати до числа ?

    foldl

    Листопад 12, 2013 at 15:12

    • Коли в прямокутнику стане більше кутів – перепишу. 🙂

      Якщо int не зможе сконвертувати до числа, буде ValueError, що логічно.

      bunyk

      Листопад 12, 2013 at 15:30

  2. Другий варіант краще тим, що він більш зв’язний, важче імені співставити не ту змінну.

    З другого боку, він явно не DRY, чому б не


    def extract(field): int(request.form[field]])

    Правда, з мене пітоніст не справжній, тому це запитання швидше пряме, ніж риторичне.

    dmytrish

    Листопад 12, 2013 at 15:13

    • Тому що я думав що def довго писати. Але так, можна ще краще, поновив пост. 🙂

      bunyk

      Листопад 12, 2013 at 15:36

      • І взагалі я ще думав про якусь жуть типу


        coords = lambda:0
        for field in ['x1', 'x2', 'y1', 'y2']:
        coords.__dict__[field] = int( request.form[field] )

        але це вже якось зовсім бароково, хоч і стисло

        dmytrish

        Листопад 12, 2013 at 17:28

        • А як на мене дуже навіть Ok. Хоча, можливо, це можна назвати зловживанням, але одна з причин чому мені подобається пітон – це якраз ті речі які можна зробити з __dict__ 🙂

          Sergii Gulenok (@ashenwolf)

          Листопад 12, 2013 at 23:51

          • Це все згубний вплив джаваскрипта на незміцнілий мозок 🙂

            dmytrish

            Листопад 12, 2013 at 23:52

            • На мій, я мав на увазі, мені трохи подобається, що в джаваскрипті об’єкти це словники і навпаки.

              dmytrish

              Листопад 13, 2013 at 00:00

    • це дуже близько до того, що я хотів запропонувати автору, тільки я використовую або самопальний compose або fn.py

      imap(compose(int, request.form.get), fields)

      Volodymyr Vitvitsyi (@signalpillar)

      Листопад 12, 2013 at 19:10

  3. А мені другий варіант подобається. І компактно, і зрозуміло… і взагалі DRY!

    Sergii Gulenok (@ashenwolf)

    Листопад 12, 2013 at 15:15

  4. Мені 2й спосіб приємніший.
    В джаві був би конвертер, який би брав на вхід реквест і видавав на виході об’єкт з потрібними полями. Або це міг би бути об’єкт-обгортка для реквесту, який би мав методи getTheField і конвертував на льоту.

    Nazarii Bardiuk

    Листопад 12, 2013 at 15:47

  5. а як щодо такого? (не певний чи буде працювати у такому синтаксисі, але напрямок зрозумілий)

    request.getInt = lambda x: int(self.form[x])
    

    Так, коду більше ніж в DRY, але уже немає тієї ускладненості, що в варіанті В

    danbst

    Листопад 13, 2013 at 04:31

  6. За такое меня бы выгнали с работы?

    x1, x2, y1, y2 = map(lambda name: int(request.form[name]),
                                     ['x1', 'x2', 'y1', 'y2'])
    

    (на python не пишу)

    jtimv

    Січень 4, 2014 at 21:51

    • Неа, в нас нема код рев’ю. А map іноді генераторними виразами коротше відображається, тільки я це в 4 рядки писав:

      x1, y1, x2, y2 = (int(request.form[field]) 
                  for field in 'x1', 'y1', 'x2', 'y2')
      

      bunyk

      Січень 4, 2014 at 22:28


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: