Python динамическая типизация

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


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


Вопрос: как это устроено под капотом?

Программирование на python

936 постов11.9K подписчиков

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу

9
Автор поста оценил этот комментарий

Магия.

Гугли позднее и раннее связывание, может что-то откроется.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

danke

показать ответы
4
DELETED
Автор поста оценил этот комментарий

> мне не надо заранее указывать с каким типом переменной я буду работать, и какой тип я буду возвращать из функции


Смотри как это работает:


В C++ выражение типа

auto x = MyClass();

создает переменную с идентификатором 'x' типа MyClass и инициализирует ее дефолтным конструктором.


В Python выражение типа

x = MyClass()

создает объект типа MyClass и привязывает (bind) к этому объекту символьное имя 'x'.

При этом к одному объекту можно привязать несколько имен

x = y = MyClass();

А можно перепривязать (re-bind) имя к другому объекту

x = MyClass()

x = MyOtherClass()

У имени типа нет.

А вот уже при выполнении конкретной операцией над объектом скрывающимся за именем и произойдет проверка типа с точки зрения допустимости операции.



В примере ниже при выполнении опкода BINARY_ADD случится ошибка, т.к. один из аргументов окажется неподходящим (объект загруженный по имени 'a' будет типа MyClass).

При этом, если раскомментировать строку 5, то символьное имя MyClass будет связано с объектом, представляющим встроенный тип int (а-ля плюсовое #define MyClass int).


В строке 9 операция LOAD_GLOBAL, обращаясь по имени MyClass, загрузит уже объект, представляющий встроенный тип int.


Затем "сконструирует" (CALL_FUNCTION) экземпляр этого типа и сохранит его под именем 'a' (STORE_FAST).


И в этом случае, несмотря на то, что байт-код функции example не изменится, ошибки при выполнении BINARY_ADD уже не будет.
Иллюстрация к комментарию
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

arigatou

0
Автор поста оценил этот комментарий
Но никто тебе не мешает указывать входящие/исходящие типы и типы данных для переменных.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

ok

0
Автор поста оценил этот комментарий

python

a=1 # Это int

a="1" # Это string

a=[1] # Это list


Что значит "возвращается тот тип, который больше подходит."?

А вообще с этим лучше на stackoverflow.

Там есть ру сегмент https://ru.stackoverflow.com/ где можно задавать вопросы на русском

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

мне не надо заранее указывать с каким типом переменной я буду работать, и какой тип я буду возвращать из функции

1
DELETED
Автор поста оценил этот комментарий

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


Что  значит "возвращается тот тип, который больше подходит"?

>>> int([1])

TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

мне не надо заранее указывать с каким типом переменной я буду работать, и какой тип я буду возвращать из функции

показать ответы
4
Автор поста оценил этот комментарий

И отличия компилируемых языков от интерпретируемых

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

ok=)

3
Автор поста оценил этот комментарий

Поэтому бывает полезно полабать свой велосипедный динамический полиморфизм на C (=

Разберитесь, что такое переменная-ссылка в питоне и как она взаимодействует с объектом в памяти. Что такое статический и динамический полиморфизм. Про статическую и динамическую типизацию, что такое утиная типизация.


ЗЫ В том же C++ указателем/ссылкой типа родителя можно указывать на объект-наследник, void* может указывать на что угодно. В то же время union и std::variant позволяют в одной и той же области памяти достаточного размера размещать объекты различных типов.

раскрыть ветку (1)
Автор поста оценил этот комментарий

ok

0
Автор поста оценил этот комментарий
По умолчанию идёт string. Если указать что это, то тот тип и будет.
Есть какая-то определенная проблема?
раскрыть ветку (1)
Автор поста оценил этот комментарий

не, просто интересно

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества