LINUX.ORG.RU

Generics в Python или помогите победить mypy

 , , ,


0

2

Вот в таком MWE:

from typing import Generic, TypeVar

import dataclasses

T = TypeVar('T')


@dataclasses.dataclass()
class A(Generic[T]):
    attr: T


A(attr=0)  # OK!


@dataclasses.dataclass()
class B(A[float]):
    ...


B(attr=float(0))  # Argument "attr" to "B" has incompatible type "float"; expected "T"

mypy ругается на последнюю строчку ошибкой «Argument „attr“ to „B“ has incompatible type „float“; expected „T“. Но ведь класс B уточнил, что T - это float, так что все должно быть нормально.

★★★

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

from typing import Generic, TypeVar

import dataclasses

T = TypeVar('T')


@dataclasses.dataclass()
class A(Generic[T]):
    attr: T


A(attr=0)  # OK!


@dataclasses.dataclass()
class B(A[T]):
    ...


b = B[float](attr=float(0))
anonymous
()
Ответ на: комментарий от anonymous

Не вариант, т.к. в B необходим этот функционал

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

Не вариант, т.к. в B есть метод, который _требует_, что бы T являлось флотом (иными словами - накладывает на Т новое ограничение)

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

Не, я знал о том, что аннотации вырвиглазно выглядят в питоне, да. Но обобщения? Вы что там, рехнулись совсем уже вместе с Гвидой? Здесь вам не C++, здесь утиная типизация и объект как ассоциативный массив.

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

здесь утиная типизация и объект как ассоциативный массив.

Во-первых, это только когда не slots, который нет смысла не использовать, что бы там Гвидо не вякал. Во-вторых, мало ли что там внутри, когда используется оно кроме редких случаев вполне стандартным образом неотличимым от языков со статической типазацией - фиксированные типы, перегрузки и дженерики. И без аннотаций нет никакого способа найти ошибку до того как оно рухнет в проде.

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

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

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

Проблема не в динамической типизации. Проблема в скриптухе.

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

Проблема не в динамической типизации. Проблема в скриптухе.

Проблема не в скриптухе, а в говнокодерах, которые не знают «никакого способа найти ошибку до того как оно рухнет в проде» но таки прут на ней писать. Продукт немного предсказуем.

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

Именно в скриптухе.

а в говнокодерах, которые не знают «никакого способа найти ошибку до того как оно рухнет в проде» но таки прут на ней писать. Продукт немного предсказуем.

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

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

За примерами далеко ходить ненужно - тот же го. Гугл вбросил и бам - хомячки уже всё наваяли и «всё» есть.

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

Пора уже питонщикам Rust для себя открыть.

И что, профессионалы уже пишут на нем серьезные продукты? Или только школьники очередной grep переписывают?

На питоне полезного софта на два порядка больше. А может и на три.

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

И тут ты попался в ловушку.

Ты ловилку ещё не отрастил, чтобы меня в ловушку ловить.

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

У тебя мания. Скриптуха — не живое существо, чтобы кому-то что-то позволять и тем более что-то забирать. Если тебе кажется, что она у тебя мозг и умение делать, то причина тому проста: Ты — жопорукий говнокодер, а мозга у тебя и так нету.

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

Во-первых, это только когда не slots, который нет смысла не использовать, что бы там Гвидо не вякал.

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

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

https://google.github.io/styleguide/pyguide.html
Предлагаю поискать здесь фиксированные типы, перегрузки, и дженерики. Не, они там есть - пару строчек о них написано. Например, про аннотации типов можно почитать такие вещи:

2.21.2 Pros
Type annotations improve the readability and maintainability of your code. The type checker will convert many runtime errors to build-time errors, and reduce your ability to use Power Features.
2.21.3 Cons
You will have to keep the type declarations up to date. You might see type errors that you think are valid code. Use of a type checker may reduce your ability to use Power Features.
И без аннотаций нет никакого способа найти ошибку до того как оно рухнет в проде.

Тесты. Точно так же в проде падают языки с жесткой статической типизацией.

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

Наверное, поэтому в топах по языкам находятся Javascript и Python, да?

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

Здесь вам не C++, здесь утиная типизация

Сообщаю тебе новость - в С++ тоже.

Может быть, может быть. Правда, чаще всего ее не используют. Примерно как чаще всего в питоне ее используют. В исходном сообщении проверка утиных типов не используется, а используется именно иерархия. Насколько мне известно, проверщики типов умеют в ABC, которые и полагалось бы использовать.

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

Может быть, может быть. Правда, чаще всего ее не используют. Примерно как чаще всего в питоне ее используют. В исходном сообщении проверка утиных типов не используется, а используется именно иерархия. Насколько мне известно, проверщики типов умеют в ABC, которые и полагалось бы использовать.

В С++ статическая утиная типизация. Со всеми вытекающими. Вернее даже не это причина - причина в мощности и сложности самого языка.

Поэтому да - чаще всего рядовые адепты её не используют. Слишком много бекграунда и умения она требует, но мы ведь говорим не об этом? Она есть, она везде.

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

Провальная система классов привела к появлению slots

Ну ты уж определись, «здесь утиная типизация и объект как ассоциативный массив», или всё-таки ущербная.

Предлагаю поискать здесь фиксированные типы, перегрузки, и дженерики

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

Тесты. Точно так же в проде падают языки с жесткой статической типизацией.

Нет. Пересечение множеств ошибок выявляемых тестами и типизацией вообще почти не пересекаются, и в стоимости поддержки они несравнимы.

Наверное, поэтому в топах по языкам находятся Javascript и Python, да?

Ага, вместе с C, C++ и Java. И можешь попробовать доказать что они там из-за динамической типизации, я на это посмотрю. А вот то что в динамических языках основная движуха сейчас именно вокруг статической типизации - показательно.

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

Нет. Пересечение множеств ошибок выявляемых тестами и типизацией вообще почти не пересекаются, и в стоимости поддержки они несравнимы.

Иксперды в треде.

Ага, вместе с C, C++ и Java. И можешь попробовать доказать что они там из-за динамической типизации, я на это посмотрю.

А чего тут пробовать, C и кресты там именно из-за извращений, которые они позволяют вытворять с памятью. Кастуем указатели как некромант зомбей.

А вот то что в динамических языках основная движуха сейчас именно вокруг статической типизации - показательно.

Показательно, что в статических языках наплодили всяких auto с varами.

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

Показательно, что в статических языках наплодили всяких auto с varами.

И давно там можно присвоить одной переменной (auto/var) значения разных типов? Auto означает, что тип задан в другом месте и чтобы не писать его дважды, пишут авто. Но тип всё равно задан явным образом и известен на момент компиляции.

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

Провальная система классов привела к появлению slots

Ну ты уж определись, «здесь утиная типизация и объект как ассоциативный массив», или всё-таки ущербная.

Утиная типизация, в том числе со slots - это проверка наличия атрибутов у объекта. Каким образом slots этому противоречит? slots не дает создавать асоциативный массив в объекте, да. Правда, ассоциативный массив из класса никуда не девался, и все вызовы атрибутов объектов и классов являются по сути доступом к ассоциативному массиву, пусть и завернутым в хитрые механизмы.

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

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

Пересечение множеств ошибок выявляемых тестами и типизацией вообще почти не пересекаются, и в стоимости поддержки они несравнимы.

Они тем более не пересекаются, чем жеще система типов в языке. Если у тебя стирание типов, как в обобщениях Java, то вот тебе, пожалуйста, и ошибка работы с типом, которая не выявляется компилятором, но выявляется при тестировании. С другой стороны, лютые шаблоны крестов, которые тяжело и долго писать, но зато они намертво ограничивают все аргументы, результаты, глубокие структуры данных, дают мало пересекающиеся проблемы типизации и райнтайма. Правда, как ты будешь писать на этом достаточно гибкие алгоритмы - понятия не имею. Малейшая необходимость - и вот уже нужно писать функции состыкования типов или дописывать шаблоны.

Ага, вместе с C, C++ и Java. И можешь попробовать доказать что они там из-за динамической типизации, я на это посмотрю. А вот то что в динамических языках основная движуха сейчас именно вокруг статической типизации - показательно.

Советую еще раз посмотреть: https://insights.stackoverflow.com/survey/2019
C и C++ медленно и уверенно покидают топ. C#, Java - да, топчик.

Я тебе объясню, почему Python, JS, PHP находятся в топе. Они там находятся потому, что на них просто написать «hello world», тупо работающее приложение, херак-херак - и в продакшен. Статическая, динамическая типизация, строгая, нестрогая - никого вообще не волнует. Так получилось, что именно языки с динамической типизацией предоставляют наибольшую простоту herak-herak-driven development.

Для крупного проекта любой вариант проверки до выполнения - это приятно, и я не спорю с тем, что это нужно. Но я еще раз напоминают, что в исходном сообщении был пример статической проверки в стиле жавы, что не подходит питону, поскольку он тупо другой. Ровно как нельзя писать на JS в стиле Java - это будет плохо читаемо и плохо поддерживаемо, так же нельзя писать на питоне в стиле Java. Ну не компилируются они в статический код с фиксированными типами и классами, и всё тут, смиритесь с этим.

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

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

На первый взгляд - очень гладко все легло: https://www.python.org/dev/peps/pep-0544/ Ждем 3.8 в продакшене.

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

Показательно, что в статических языках наплодили всяких auto с varами.

Показательно что вы даже не отличаете динамическую типизацию от неявной.

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

Показательно что вы даже не отличаете динамическую типизацию от неявной.

Показательно, что ты пытаешься увести разговор от темы к срачу об определениях. Но моё утверждение верно именно так, как оно было написано.

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

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

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

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

Заплакал от умиления. Ага, не кастуют и не используют. Второй питон не используют, с сей все перелезли на раст и джава давно вымерла.

Вторую я уже обозначил.

Я не нашёл никакого обозначения. Если ты под «обозначением» имеешь ввиду твой предыдущий комментарий, то на него тебе уже отвечено.

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

На первый взгляд - очень гладко все легло: https://www.python.org/dev/peps/pep-0544/ Ждем 3.8 в продакшене.

О, пасибо. Значит, в 3.7 все-таки этого еще не было. Странно, что сразу этого не сделали - я не верю, что Гвидо не понимал абсурдности подтипов, скорее просто дал на откуп макакам, не особо веруя в общую ценность статической типизации.

byko3y ★★★★
()
3 декабря 2019 г.
Ответ на: комментарий от slovazap

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

Можно ссылку на пункт стандарта, где запретили использовать указатели?

O02eg ★★★★★
()

В ближайшее время питон станет интерпритируемым С++. А плюсы мутируют в компилируемый питон. После чего монада перевернётся, и эта Вселенная начнёт коллапсировать в бесконечной сингулярности Рагнарёка. Произойдёт Большой взрыв. И всё начнётся заново, с повтором до секунды и миллиметра.

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

То есть через 13 миллиардов лет опять унылые пых с пистоном учить? Тоска…

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