LINUX.ORG.RU

Спецификация метода класса в виде строки

 ,


0

1

Есть ли в Питон поддержка проверки объекта на соответствие декларации? По типу проверки препроцессором .c - .h в Си, только - в рантайме.

Т.е., проверка актуальности фактического определения метода (кол-ва аргументов и т.п.) - декларации в строковой форме.

Встречал что-то подобное в pydantic.



Последнее исправление: i_am_not_ai (всего исправлений: 1)

Есть. Pydantic, typeguard и прочее. Только с ними и без того небыстрый пистон становится совсем черепахой.

Если хочешь питоновый синтаксис и статику без тормозов - юзай cython

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

Как это нет? В питоне duck typing во все поля. Можно объявить подкласс typing.Protocol, а затем с помощью mypy или любого другого тайпчекера проверять соответствие конкретного объекта этому протоколу.

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

Протоколы появились только в 3.8, их почти никто ещё не использует, просто из-за инерции мышления, а автор вопроса, скорее всего, о них и не знает (судя по формулировке вопроса, он вообще едва знаком с Python).

Ну и протокол - не «декларация в строкой форме», хотя даже не знаю, что под этим имел в виду автор вопроса, который видимо, ни разу не зашёл, чтобы увидеть ответы на свой вопрос.

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

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

Ну и протокол - не «декларация в строкой форме», хотя даже не знаю, что под этим имел в виду автор вопроса, который видимо, ни разу не зашёл, чтобы увидеть ответы на свой вопрос.

Вот именно. Автор судя по всему и сам не знает, чего хочет, так что стоит научить его использовать актуальные инструменты для той задачи, которая перед ним стоит. «Строковая форма» конечно не относится к протоколам, но в основе это именно то что он хочет - декларация сложного составного типа с полями и методами и возможностью проверки объектов на соответствие этому типу (пусть и не в рантайме).

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

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

Большинству из нас приходится работать с legacy. Хорошо, если не с Python 2.

У меня лично львиная доля кода крутится на 3.7. Учитывая размеры бэклога реально необходимых фич, я делаю грустные прогнозы, что 3.8 этот код не увидит никогда.

Новые сервисы, конечно, делаю сразу на 3.11, но это случается исключительно редко.

emorozov
()