Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Announcing typed-linter

Announcing typed-linter

8c3a2ebf7c2b84f8390d99c7bf8c8a48?s=128

Sobolev Nikita

June 13, 2021
Tweet

Transcript

  1. Никита Соболев github.com/sobolevn 1

  2. >_ X Новые и старые проблемы статического анализа в Python

    2
  3. Мы живем в уникальное время 3

  4. Проблемы накопились! 4

  5. Важно! Пользоваться текущими инструментами все равно полезно 5

  6. >_ X Карта текущих решений 6

  7. Flake8 Плагины 7

  8. Flake8 Плагины pylint Плагины 8

  9. Flake8 Плагины pylint Плагины mypy Плагины 9

  10. Flake8 Плагины pylint Плагины mypy Плагины pylance 10

  11. Flake8 Плагины pylint Плагины mypy Плагины pylance pytype 11

  12. Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check 12

  13. Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black

    13
  14. Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black

    autopep8 14
  15. Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black

    autopep8 fixit 15
  16. Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black

    autopep8 fixit yapf 16
  17. Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black

    autopep8 fixit yapf pyupgrade 17
  18. Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black

    autopep8 fixit yapf pyupgrade Линтеры 18
  19. Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black

    autopep8 fixit yapf pyupgrade Тайпчекеры Линтеры 19
  20. Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black

    autopep8 fixit yapf pyupgrade Тайпчекеры Линтеры Авто-форматеры 20
  21. >_ X Что лежит в основе? 21

  22. ast = abstract syntax tree 22

  23. print(name_with_meaning, second_name_with_meaning, third) 23

  24. <_ast.Module> ┗━ body ┣━ [0] <_ast.Expr> ┃ ┗━ value: <_ast.Call>

    ┃ ┣━ args ┃ ┃ ┣━ [0] <_ast.Name> ┃ ┃ ┃ ┗━ id: first_long_name_with_meaning ┃ ┃ ┣━ [1] <_ast.Name> ┃ ┃ ┃ ┗━ id: second_very_long_name_with_meaning ┃ ┃ ┗━ [2] <_ast.Name> ┃ ┃ ┗━ id: third ┃ ┗━ func: <_ast.Name> ┃ ┗━ id: print 24
  25. Используется > Почти во всех линтерах для анализа кода 25

  26. Проблемы 26

  27. Проблемы > Неконсистентность между версиями Python 26

  28. Проблемы > Неконсистентность между версиями Python > Нет информации о

    типах 26
  29. Проблемы > Неконсистентность между версиями Python > Нет информации о

    типах > Нет нюансов синтаксиса 26
  30. Проблемы > Неконсистентность между версиями Python > Нет информации о

    типах > Нет нюансов синтаксиса > Нет комментариев 26
  31. tokenize 27

  32. 28 print("test", a, b)

  33. 29

  34. Используется 30

  35. Используется > Для проверки нюансов синтаксиса 30

  36. Используется > Для проверки нюансов синтаксиса > Для авто-форматирования в

    некоторых инструментах 30
  37. Проблемы 31

  38. Проблемы > Представляет собой не "структуру", а простой список 31

  39. Проблемы > Представляет собой не "структуру", а простой список >

    Вообще ничего не знает / не умеет 31
  40. Проблемы > Представляет собой не "структуру", а простой список >

    Вообще ничего не знает / не умеет > Очень сложен в работе для правил с хоть какой-то логикой 31
  41. libcst = Concrete Syntax Tree 32

  42. Используется 33

  43. Используется > В инфраструктуре Инстаграма 33

  44. Используется > В инфраструктуре Инстаграма > Во многих новых библиотеках

    для авто-форматирования 33
  45. Используется > В инфраструктуре Инстаграма > Во многих новых библиотеках

    для авто-форматирования > Для проверки нюансов синтаксиса 33
  46. Используется > В инфраструктуре Инстаграма > Во многих новых библиотеках

    для авто-форматирования > Для проверки нюансов синтаксиса > Для анализа кода 33
  47. Проблемы 34

  48. Проблемы > Сбоит на некоторых синтаксических конструкциях Python3.9 https:// github.com/Instagram/LibCST/

    issues/490 34
  49. Проблемы > Сбоит на некоторых синтаксических конструкциях Python3.9 https:// github.com/Instagram/LibCST/

    issues/490 > Не работает с Python3.10+ https:// github.com/Instagram/LibCST/ issues/285 34
  50. typed-tree* *(такого нет) 35

  51. Используется 36

  52. Используется > В любом тайпчекере для представления нашего кода с

    типами 36
  53. Используется > В любом тайпчекере для представления нашего кода с

    типами > Для каждого тайпчекера - оно свое 36
  54. Проблемы 37

  55. Проблемы > У каждой реализации они свои! 37

  56. Проблемы > У каждой реализации они свои! > Нет единого

    стандарта 37
  57. Проблемы > У каждой реализации они свои! > Нет единого

    стандарта > В каждом тайпчекере поддерживается далеко не все возможности 37
  58. Проблемы > У каждой реализации они свои! > Нет единого

    стандарта > В каждом тайпчекере поддерживается далеко не все возможности > Нигде (кроме mypy) нет возможности подключать плагины 37
  59. >_ X Пару слов про устаревшие инструменты 38

  60. Flake8 39

  61. Flake8 > Примитивная конфигурация 39

  62. Flake8 > Примитивная конфигурация > Нет типов 39

  63. Flake8 > Примитивная конфигурация > Нет типов > Невозможно нормально

    внедрить 39
  64. Pylint 40

  65. Pylint > Примитивная конфигурация 40

  66. Pylint > Примитивная конфигурация > Нет типов 40

  67. Pylint > Примитивная конфигурация > Нет типов > Но лучше

    бы их совсем не было 40
  68. Pylint > Примитивная конфигурация > Нет типов > Но лучше

    бы их совсем не было > Невозможно нормально внедрить 40
  69. Black 41

  70. Black > Супер примитивный 41

  71. Black > Супер примитивный > Использует lib2to3 41

  72. >_ X Новые проблемы 42

  73. Новый парсер / новая грамматика 43

  74. 44

  75. Аннотации github.com/samuelcolvin/pydantic/issues/2678 45

  76. PEP 563 mail.python.org/archives/list/python-dev@python.org/thread/ CLVXXPQ2T2LQ5MP2Y53VVQFCXYWQJHKZ 46

  77. Pattern Matching 47

  78. >_ X Так что делать? 48

  79. typed-linter 49

  80. typed-linter > Нормальная конфигурация в духе eslint 49

  81. typed-linter > Нормальная конфигурация в духе eslint > Провайдеры типов

    49
  82. typed-linter > Нормальная конфигурация в духе eslint > Провайдеры типов

    > Гибкая система плагинов 49
  83. typed-linter > Нормальная конфигурация в духе eslint > Провайдеры типов

    > Гибкая система плагинов > Авто-форматирование 49
  84. typed-linter > Нормальная конфигурация в духе eslint > Провайдеры типов

    > Гибкая система плагинов > Авто-форматирование > Нормальное внедрение 49
  85. Конфигурация 50

  86. Как сейчас? 51

  87. [flake8] format = wemake show-source = True statistics = False

    doctests = True # darglint configuration: # https://github.com/terrencepreilly/darglint strictness = long docstring-style = numpy # Plugins: max-complexity = 6 max-line-length = 80 # wemake-python-styleguide settings: i-control-code = False 52
  88. [tool.nitpick] style = "https://raw.githubusercontent.com/wemake-services/ wemake-python-styleguide/master/styles/nitpick-style- wemake.toml" [tool.poetry.dev-dependencies] nitpick = "^0.23"

    53
  89. 54

  90. Как надо? 55

  91. extends: - typed-linter/recommended - 'url:https://path-to-my-config/file.yml' - 'file:local/path/file.yml' checks: - name:

    typed-linter/new-style-generics level: error extras: allow-old-style: [typing.List] settings: type-engine: name: typed-linter/mypy reporter: name: typed-linter/rich 56
  92. extends: - typed-linter/recommended - 'url:https://path-to-my-config/file.yml' - 'file:local/path/file.yml' checks: - name:

    typed-linter/new-style-generics level: error extras: allow-old-style: [typing.List] settings: type-engine: name: typed-linter/mypy reporter: name: typed-linter/rich 57
  93. extends: - typed-linter/recommended - 'url:https://path-to-my-config/file.yml' - 'file:local/path/file.yml' checks: - name:

    typed-linter/new-style-generics level: error extras: allow-old-style: [typing.List] settings: type-engine: name: typed-linter/mypy reporter: name: typed-linter/rich 58
  94. Игнорирование ошибок 59

  95. checks: - name: typed-linter/eqeq-is-mixup level: none overrides: - glob: some/**/*.py

    checks: - name: typed-linter/new-style-generics level: none type-overrides: - astpath: | \\ClassDef[type=django.url.URLConf]\method[name=locate] checks: - name: typed-linter/hidden-any level: none 60
  96. checks: - name: typed-linter/eqeq-is-mixup level: none overrides: - glob: some/**/*.py

    checks: - name: typed-linter/new-style-generics level: none type-overrides: - astpath: | \\ClassDef[type=django.url.URLConf]\method[name=locate] checks: - name: typed-linter/hidden-any level: none 61
  97. Не все библиотеки одинаково полезны! github.com/wemake-services/wemake-python-styleguide/issues/1737 62

  98. my_num = 5 my_num >> 2 # useless! 63

  99. unload_task = _unload_to_file(export_config) if not export_config.is_incremental: _latest_only(export_config.athena_table_name) >> unload_task unload_task

    \ >> _upload_to_s3(export_config.athena_table_name) \ >> [ _clear_export_dir_and_logs(export_config.athena_table_name), *_repair_tables(export_config), ] 64
  100. checks: - name: typed-linter/eqeq-is-mixup level: none overrides: - glob: some/**/*.py

    checks: - name: typed-linter/new-style-generics level: none type-overrides: - astpath: | \\ClassDef[type=django.url.URLConf]\method[name=locate] checks: - name: typed-linter/hidden-any level: none 65
  101. Система плагинов 66

  102. API 67

  103. class BasePlugin(object): def __init__(self, name: str, checks: CheckTypeSpec): ... @classmethod

    def load_checks( cls, configuration: Configuration, loader: ConventionalLoader, ) -> Sequence[CheckTypeSpec]: ... def run_project_checks( self, type_engine: BaseTypeEngine, project_modules: ProjectModules, configuration: Configuration, ) -> Iterable[BaseViolation]: ... def run_module_checks( self, type_checker: BaseTypeChecker, configuration: Configuration, module_spec: ModuleSpec, ) -> Iterable[BaseViolation]: ...
  104. Система конвенций 69

  105. 70

  106. 71

  107. extends: - typed-linter/recommended - flake8/recommended overrides: - glob: some/**/*.py checks:

    - name: flake8/F001 level: none settings: type-engine: name: your-project/pytype reporter: name: circle-ci/json 72
  108. Поменять провайдер типов? 73

  109. 74

  110. extends: - typed-linter/recommended - flake8/recommended overrides: - glob: some/**/*.py checks:

    - name: flake8/F001 level: none settings: type-engine: name: your-project/pytype reporter: name: circle-ci/json 75
  111. Включить flake8? 76

  112. extends: - typed-linter/recommended - flake8/recommended overrides: - glob: some/**/*.py checks:

    - name: flake8/F001 level: none settings: type-engine: name: your-project/pytype reporter: name: circle-ci/json 77
  113. Внедрение 78

  114. --baseline > FlakeHell: https:// flakehell.readthedocs.io/commands/ baseline.html > wemake-python-styleguide: https:// github.com/wemake-services/wemake-

    python-styleguide/pull/1276 79
  115. Как оно будет? 80

  116. Как оно будет? > typed-linter --baseline myproject 80

  117. Как оно будет? > typed-linter --baseline myproject > Все ошибки

    запомнились 80
  118. Как оно будет? > typed-linter --baseline myproject > Все ошибки

    запомнились > typed-linter --baseline myproject 80
  119. Как оно будет? > typed-linter --baseline myproject > Все ошибки

    запомнились > typed-linter --baseline myproject > Старых ошибок нет 80
  120. Как оно будет? > typed-linter --baseline myproject > Все ошибки

    запомнились > typed-linter --baseline myproject > Старых ошибок нет > Новые делать нельзяы 80
  121. Проблемы 81

  122. Проблемы > В текущей реализации очень сложно идентифицировать ошибку и

    привязать её к определенному месту 81
  123. Проблемы > В текущей реализации очень сложно идентифицировать ошибку и

    привязать её к определенному месту > Раньше мы оперировали только: строками, позицией, кодом ошибки 81
  124. Авто-форматирование 82

  125. 😭 😭 😭 83

  126. Есть одно "но" github.com/wemake-services/typed-linter 84

  127. 85

  128. >_ X 💰 86

  129. Планы релиза > SponsorsWare > Dual License > Contributor-based 87

  130. А пока 88

  131. Самый строгий линтер в мире github.com/wemake-services/wemake-python-styleguide 89

  132. sobolevn.me/2019/10/complexity-waterfall 90

  133. sobolevn.me Вопросы? github.com/sobolevn 91