1. Список говнокодов пользователя j123123

    Всего: 331

  2. PHP / Говнокод #27104

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    https://habr.com/ru/company/vk/blog/527420/
    
    ВКонтакте снова выкладывает KPHP 
    
    ....
    
    Сгенерировать С++ из PHP — этого мало. Собственно говоря, это самое простое.
    
    Во-первых, в PHP мы используем кучу функций стандартной библиотеки: header(),
     mb_strlen(), curl_init(), array_merge(). Их тысячи — и все должны быть
    реализованы внутри KPHP с учётом типизации и работать так же, как в PHP.
    Реализация всего PHP stdlib (а также KPHP-дополнений), всех PHP-типов с
    операциями и допущениями — это называется runtime, вон там квадратик сверху.
    
    Во-вторых, PHP-сайт — это веб-сервер. Следовательно, и в KPHP должна быть вся
    серверная часть, чтобы можно было в том же nginx подменить PHP-шный upstream
    на KPHP-шный — и всё продолжало работать так же. KPHP поднимает свой веб-сервер,
    оркестрирует процессы, заполняет суперглобалы и переинициализирует состояние,
    как и PHP… Это тоже хардкорная часть — называется server, квадратик снизу.
    
    И только имея результирующий код C++, написанные runtime и server, всё это можно
    объединить и отдать на откуп плюсовым компиляторам. Мы используем g++ — там в
    диаграмме есть квадратик g++. Но не совсем так: у vk.com настолько огромная
    кодовая база, что этот компилятор не справляется, и поэтому мы применяем патченный
    distcc для параллельной компиляции на множестве агентов. В итоге всё линкуется в
    один огромный бинарник (это весь vk.com), он раскидывается на кучу бэкендов и
    синхронно перезапускается. Каждая копия запускает мастер-процесс, который порождает
    группу однопоточных воркеров. Вот они на самом деле и исполняют исходный PHP-код.
    
    Многие технические проблемы остаются за кадром — их не опишешь в статье на Хабре.
    Чего стоит один только сбор трейсов при ошибках: ведь в С++ не получить
    человекочитаемый стек, а хочется разработчику вообще его на PHP-код намаппить.
    Гигантское количество внутренних нюансов, множество подпорок и легаси — но в итоге
    продукт хорошо работает и развивается.

    PHP и C++... два говна нашли друг друга

    j123123, 11 Ноября 2020

    Комментарии (46)
  3. Си / Говнокод #27103

    +1

    1. 1
    #define LEAP_YEAR_OR_NOT(year)( ( year % 4 ) ? ( 0 ) : ( 1 ) )

    Тот кто это писал, видимо рассуждал примерно так:

    - В 2100 году это конечно забагует, но это будет уже не моя проблема.

    j123123, 11 Ноября 2020

    Комментарии (41)
  4. C++ / Говнокод #27068

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    // https://github.com/dotnet/coreclr/blob/a9f3fc16483eecfc47fb79c362811d870be02249/src/vm/i386/cgenx86.cpp#L1613
    
    PCODE DynamicHelpers::CreateHelperWithTwoArgs(LoaderAllocator * pAllocator, TADDR arg, TADDR arg2, PCODE target)
    {
    #ifdef UNIX_X86_ABI
        BEGIN_DYNAMIC_HELPER_EMIT(23);
    #else
        BEGIN_DYNAMIC_HELPER_EMIT(17);
    #endif
    
    #ifdef UNIX_X86_ABI
    	// sub esp, 4
    	*p++ = 0x83;
    	*p++ = 0xec;
    	*p++ = 0x4;
    #else
        // pop eax
        *p++ = 0x58;
    #endif
    
        // push arg
        *p++ = 0x68;
        *(INT32 *)p = arg;
        p += 4;
    
        // push arg2
        *p++ = 0x68;
        *(INT32 *)p = arg2;
        p += 4;
    
    #ifdef UNIX_X86_ABI
        // mov eax, target
        *p++ = 0xB8;
        *(INT32 *)p = target;
        p += 4;
    #else
        // push eax
        *p++ = 0x50;
    #endif
    
        *p++ = X86_INSTR_JMP_REL32; // jmp rel32
    #ifdef UNIX_X86_ABI
        *(INT32 *)p = rel32UsingJumpStub((INT32 *)p, (PCODE)DynamicHelperArgsStub);
    #else
        *(INT32 *)p = rel32UsingJumpStub((INT32 *)p, target);
    #endif
        p += 4;
    
        END_DYNAMIC_HELPER_EMIT();
    }

    Функция из дотнеткора, которая нахерачивает опкодов куда-то.

    j123123, 28 Октября 2020

    Комментарии (21)
  5. C++ / Говнокод #27054

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    /* https://habr.com/ru/company/jugru/blog/524600/
    Давайте теперь поговорим о метаклассах, коль скоро ваш вопрос был в первую очередь о них.
    Для их реализации было необходимо три фундаментальных нововведения. Во-первых, программирование
    во время компиляции. На момент начала работы над метаклассами оно частично присутствовало в
    constexpr, но тогда оно было ещё сырое и не до конца обобщённое. Во-вторых, была необходима
    рефлексия, по которой тогда только-только появились первые предложения, и рассчитывать на неё
    было рискованно. В-третьих, нужна была генерация кода, создание исходного кода C++ во время
    компиляции — на тот момент в C++ этого ещё ни разу не делали.
    
    Но при наличии этих трёх предпосылок метаклассы становятся просто синтаксическим сахаром,
    который во время компиляции применяет функцию рефлексии и генерации кода. Поэтому в
    первоначальной статье по метаклассам (P0707) также написано об этих трёх вещах: рефлексии,
    полном программировании во время компиляции, то есть возможности выполнять любой код C++
    во время компиляции, и генерации кода C++; ничего этого на тот момент в языке не было.
    
    Самым важным шагом в этом направлении стало добавление программирования во время компиляции.
    Это значит, что вторая предпосылка метаклассов в C++20 почти закончена. Функции consteval
    с гарантированным выполнением во время компиляции на самом деле были предложены именно в
    статье, которую я только что упомянул. На основе моей статьи Эндрю Саттон (Andrew Sutton)
    сделал реализацию метаклассов в Clang, с помощью которой были написаны consteval и некоторые
    другие фичи C++20.
    
    В общем, с программированием во время компиляции дела обстоят хорошо. Что касается рефлексии,
    она входит в список семи приоритетов для C++23. Даже без учёта нарушений из-за COVID-19 я
    сомневаюсь, что рефлексию завершат к 2023 году, но ей точно будет уделяться много усилий.
    Это не может не радовать. Над генерацией сейчас тоже работают Дэвид Вандевурд и, опять-таки, Эндрю Саттон.
    
    Когда рефлексия, consteval и генерация станут частью стандарта, для добавления метаклассов
    будет достаточно заявки на пяти страницах, в которой мы просто поблагодарим за реализацию
    этих трёх предпосылок, и предложим добавить поверх них синтаксический сахар, который позволит
    во времени компиляции применять функцию к классу. В общем, в этой области сделано уже очень
    многое, но, как видите, это проект, требующий много лет для завершения. Мне пришлось разбить
    его на несколько более мелких заявок, чтобы вся работа не была забракована из-за одного
    неудачного сегмента. Несмотря на это, мы всегда учитывали конечную цель — метаклассы; и мы
    всегда ориентировались на определённый вариант использования.
    
    Легковесная обработка исключений — более новый проект, я впервые предложил её комитету в 2018 году.
    В отличие от метаклассов, на начальном этапе диалога прототипа ещё не было, и я хотел узнать, готов
    ли комитет вообще двигаться в этом направлении. С самого начала мы получили положительную реакцию,
    а также некоторые технические вопросы. В следующем году мы планируем начать работу над прототипом.
    Когда прототип будет готов и мы сможем ответить на эти технические вопросы, мы составим более подробную заявку.
    
    Наконец, нужно сказать ещё об одном проекте, обсуждение которого началось только в феврале этого года.
    Это было в Праге на встрече юзер-группы, её запись выложена на YouTube. Речь идёт о передаче параметров и
    инициализации. Здесь используется подмножество правил статического анализа, которые использовались для
    Lifetime. Я уже подготовил об этом статью (под номером 708), но прежде чем подать её комитету, мне необходимо
    будет создать прототип.
    */

    Почему это выглядит как вореции?

    j123123, 24 Октября 2020

    Комментарии (59)
  6. Куча / Говнокод #27018

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    https://www.opennet.ru/opennews/art.shtml?num=53839
    
    Facebook развивает TransCoder для перевода кода с одного языка программирования на другой 
    
    Инженеры из Facebook опубликовали транскомпилятор TransCoder, использующий методы
    машинного обучения для преобразования исходных текстов с одного высокоуровневого
    языка программирования на другой. В настоящее время предоставлена поддержка
    трансляции кода между языками Java, C++ и Python. Например, TransCoder позволяет
    преобразовать исходные тексты на Java в код на Python, а код на Python в исходные
    тексты на Java. Наработки проекта реализуют на практике теоретические изыскания по
    созданию нейронной сети для эффективной автоматической транскомпиляции кода и
    распространяются под лицензией Creative Commons Attribution-NonCommercial 4.0,
    разрешающей применение только для некоммерческих целей.

    Фраза <<Перепиши на "PHP"> > может потерять свою актуальность, ведь можно будет автоматически переписывать на через нейросети.

    j123123, 09 Октября 2020

    Комментарии (16)
  7. Си / Говнокод #26982

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    /* https://habr.com/ru/company/piter/blog/491996/
    
    Пусть в Python такая штука и называется генератором, в языке C++ она
    называлась бы корутиной. Пример взят с этого сайта: https://masnun.com/2015/11/13/python-generators-coroutines-native-coroutines-and-async-await.html
    
    def generate_nums():
         num = 0
         while True:
              yield num
              num = num + 1	
    
    nums = generate_nums()
    	
    for x in nums:
         print(x)
    	
         if x > 9:
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <stdbool.h>
    
    #define START 0
    #define YIELD 1
    
    typedef struct 
    {
      uint8_t jmpto;
      int num;
    } coroutine_state;
    
    
    int generate_nums(coroutine_state *state)
    {
      switch(state->jmpto)
      {
        case START: break;
        case YIELD: goto yield;
      }
      while (true)
      {
        state->jmpto = YIELD; return state->num; yield: // какая питушня
    
        state->num = state->num + 1;
      }
    }
    
    
    
    
    int main(void)
    {
      int x;
      coroutine_state st = {START, 0};
      while(true)
      {
        x = generate_nums(&st);
        printf("%d\n", x);
    
        if (x > 9)
        {
          break;
        }
      }
      return EXIT_SUCCESS;
    }

    Попробовал переписать эту ко-ко-корутину c питуха на Си - получилась какая-то херня нечитаемая. что еще раз доказывает, что корутины нахуй не нужны

    К тому же в крестопарашном говне они требуют хип, а это нахуй не нужно на самом-то деле.

    j123123, 28 Сентября 2020

    Комментарии (17)
  8. Куча / Говнокод #26937

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    > https://habr.com/ru/post/518308/
    > Мне надоело, что индустрия зависит от прихоти создателей языков программирования. Сообществу нужно больше власти
    
    > В языках вечно не хватает чего-то простого — лямбда-функций,
    > именованных объединений, кастомных примитивных типов. Я лезу
    > в обсуждения на Stack Overflow, в Github и вижу, как разрабы жалуются
    > — им не хватает того же, чего и мне. Но обсуждения почти всегда
    > заканчиваются одинаково: нужная фича не появится, потому что
    > главный дизайнер языка и члены его команды нужной ее не считают.

    Именно поэтому я за Си. Хорошо что есть крестопарашная помойка, в которую дизайнеры языка добавляют всякую хуйню по желанию каждого встречного и поперечного. Если б такого не было, всю эту поебень пытались бы пропихнуть в Си. Так что от крестопараши определенно есть какая-то польза.

    j123123, 09 Сентября 2020

    Комментарии (67)
  9. Си / Говнокод #26864

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    #include <stdio.h>
    #include <stdlib.h>
    
    #define SPLICE(a,b) SPLICE_1(a,b)
    #define SPLICE_1(a,b) SPLICE_2(a,b)
    #define SPLICE_2(a,b) a##b
     
     
    #define PP_ARG_N( \
              _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,  _9, _10, \
             _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
             _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
             _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
             _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
             _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
             _61, _62, _63, N, ...) N
     
    /* Note 63 is removed */
    #define PP_RSEQ_N()                                        \
             62, 61, 60,                                       \
             59, 58, 57, 56, 55, 54, 53, 52, 51, 50,           \
             49, 48, 47, 46, 45, 44, 43, 42, 41, 40,           \
             39, 38, 37, 36, 35, 34, 33, 32, 31, 30,           \
             29, 28, 27, 26, 25, 24, 23, 22, 21, 20,           \
             19, 18, 17, 16, 15, 14, 13, 12, 11, 10,           \
              9,  8,  7,  6,  5,  4,  3,  2,  1,  0
     
    #define PP_NARG_(...)    PP_ARG_N(__VA_ARGS__)    
     
    /* Note dummy first argument _ and ##__VA_ARGS__ instead of __VA_ARGS__ */
    #define PP_NARG(...)     PP_NARG_(_, ##__VA_ARGS__, PP_RSEQ_N())
    
    
    #define PRINT_1(a1) \
      printf(a1);
     
    #define PRINT_2(a1, b1) \
      printf(a1, b1);
     
    #define PRINT_3(a1, b1, a2) \
      PRINT_2(a1, b1); PRINT_1(a2)
     
    #define PRINT_4(a1, b1, a2, b2) \
      PRINT_2(a1, b1); PRINT_2(a2, b2);
     
    #define PRINT_5(a1, b1, a2, b2, a3) \
      PRINT_4(a1, b1, a2, b2); PRINT_1(a3);
     
    #define PRINT_6(a1, b1, a2, b2, a3, b3) \
      PRINT_4(a1, b1, a2, b2); PRINT_2(a3, b3)
     
    #define PRINT_7(a1, b1, a2, b2, a3, b3, a4) \
      PRINT_6(a1, b1, a2, b2, a3, b3); PRINT_1(a4)
     
    #define PRINT_8(a1, b1, a2, b2, a3, b3, a4, b4) \
      PRINT_6(a1, b1, a2, b2, a3, b3);  PRINT_2(a4, b4);
    //..... дальше лень ...
     
    #define PRINTS_(N, ...) \
      SPLICE(PRINT_, N)(__VA_ARGS__)
     
    #define PRINTS(...) \
      PRINTS_(PP_NARG(__VA_ARGS__), __VA_ARGS__)
    
    
    int main(void)
    {
        PRINTS("10 = %d", 10, "; 3 + 3 = %d", 3+3, "\n" );
        return EXIT_SUCCESS;
    }

    Имитация крестопарашного cout через препроцессор
    https://wandbox.org/permlink/px4DCDSCGfUlbcFL

    j123123, 14 Августа 2020

    Комментарии (8)
  10. Си / Говнокод #26848

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    #include <stdio.h>
    #include <stddef.h>
    #include <stdlib.h>
    #include <stdint.h>
    
    #define GEN_NAME(type) struct myvec_ ## type
    
    #define MK_VEC_TYPE(type) GEN_NAME(type) {size_t sz; type arr[];}; 
    
    #define MK_VEC_NEW(type) \
    GEN_NAME(type) *myvec_new_ ## type (size_t num) \
    { \
      struct myvec_ ## type *tmp = malloc(sizeof(type) * num); \
      if (tmp == NULL) \
      { \
        return NULL; \
      } \
      tmp->sz = num; \
      return tmp; \
    }
    
    #define MK_VEC_DELETE(type) \
    void myvec_delete_ ## type (GEN_NAME(type) *v) \
    { \
      free(v); \
    }
    
    
    #define MK_VEC_GET(type) \
    type myvec_get_ ## type (GEN_NAME(type) *v, size_t pos) \
    { \
      if(pos < v->sz) \
      { \
        return v->arr[pos]; \
      } \
      else \
      { \
        exit(-1); \
      } \
    }
    // исключения - говно
    
    #define MK_VEC_SET(type) \
    void myvec_set_ ## type (GEN_NAME(type) *v, size_t pos, type val) \
    { \
      if(pos < v->sz) \
      { \
        v->arr[pos] = val; \
      } \
      else \
      { \
        exit(-1); \
      } \
    }
    
    
    #define MK_VEC_GETSZ(type) \
    size_t myvec_getsz_ ## type (GEN_NAME(type) v) \
    { \
      return v.sz; \
    }
    
    #define MK_SHIT(type) \
    MK_VEC_TYPE(type) \
    MK_VEC_NEW(type) \
    MK_VEC_DELETE(type) \
    MK_VEC_GET(type) \
    MK_VEC_GETSZ(type) \
    MK_VEC_SET(type)
    
    MK_SHIT(int)
    MK_SHIT(float)
    MK_SHIT(double)
    
    #define test(a) _Generic(a, int : 1, GEN_NAME(int) : 2, default : 0)
    
    #define MTD_C(val,mtd) _Generic( val,\
      GEN_NAME(int): myvec_ ## mtd ##_int, \
      GEN_NAME(float): myvec_ ## mtd ##_float, \
      GEN_NAME(double): myvec_ ## mtd ##_double, \
      default: 0) // хуй там!
    
    #define GET(vec,pos) MTD_C(vec,get)(&vec,pos)
    #define SET(vec, pos, val) MTD_C(vec,set)(&vec,pos,val)
    #define GETSZ(vec) MTD_C(vec,getsz)(vec)
      
    int main(void)
    {
      GEN_NAME(int) *vec1 = myvec_new_int(10);
      SET(*vec1, 0, 123);
      size_t size = GETSZ(*vec1);
      printf("vector size is %zu\n", size);
      printf("vector vec1[0] is %d\n", GET(*vec1,0));
      return 0;
    }

    Какое ООП)))

    j123123, 07 Августа 2020

    Комментарии (4)
  11. Python / Говнокод #26778

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    # https://www.opennet.ru/opennews/art.shtml?num=53248
    # Гвидо ван Россум предложил включить в Python операторы для сопоставления с образцом 
    
    # Отмечается, что предложенные операторы позволят улучшить читаемость кода,
    # упростят сопоставление произвольных Python-объектов и отладку, а также повысят
    # надёжность кода благодаря возможности расширенной статической проверки типов. 
    
    def http_error(status):
        match status:
            case 400:
                return "Bad request"
            case 401|403|404:
                return "Not allowed"
            case 418:
                return "I'm a teapot"
            case _:
                return "Something else"
    
    
    # Например, возможна распаковка объектов, кортежей, списков и произвольных последовательностей
    # для привязки переменных на основе имеющихся значений. Допускается определение вложенных
    # шаблонов, использование в шаблоне дополнительных условий "if", применение масок ("[x, y, *rest]"),
    # маппинга связок ключ/значение (например, {"bandwidth": b, "latency": l} для извлечения значений
    # "bandwidth" и "latency" и словаря), извлечения подшаблонов (оператор ":="), использования именованных
    # констант в шаблоне. В классах возможна настройка поведения при сопоставлении при помощи метода "__match__()". 
    
       from dataclasses import dataclass
    
       @dataclass
       class Point:
           x: int
           y: int
    
       def whereis(point):
           match point:
               case Point(0, 0):
                   print("Origin")
               case Point(0, y):
                   print(f"Y={y}")
               case Point(x, 0):
                   print(f"X={x}")
               case Point():
                   print("Somewhere else")
               case _:
                   print("Not a point")
    
       match point:
           case Point(x, y) if x == y:
               print(f"Y=X at {x}")
           case Point(x, y):
               print(f"Not on the diagonal")
    
    
       RED, GREEN, BLUE = 0, 1, 2
       match color:
           case .RED:
               print("I see red!")
           case .GREEN:
               print("Grass is green")
           case .BLU
       E:
               print("I'm feeling the blues :(")

    Какой прогресс)))
    Ждем когда добавят цикл for как в сишке

    j123123, 28 Июня 2020

    Комментарии (83)