Обновить
3
0

Пользователь

Отправить сообщение

НЕ ТИПИЗИРОВАННЫЙ и С НЕЯВНЫМИ ПРИВЕДЕНИЯМИ язык?

Python — это язык со «строгой (сильной) динамической типизацией». Это типизированный язык и в нём нет неявных приведений. Если второй пункт, понимаю, мог был спутан с JavaScript (печально известным своими {} + []), то вот за отсутствием типизации как таковой следует идти в какое-нибудь лямбда-исчисление. В качестве хорошего сравнения можно привести C/C++, где два основных критерия системы типов инвертированы — у них «слабая статическая типизация», что как раз таки позволяет совершать жуткие неявные приведения.

нестрогость языка, которая даёт всё понимать интуитивно в самом начале

Решается поддерживаемой «из коробки» аннотацией типов и использованием нормальной IDE, которая будет показывать все соответствующие ошибки, а напрочь устраняется — линтером и тайп-чекером в CI. И да, благодаря аннотациям хорошо обученная нейросеть сумеет выразить всю суть почти без потерь, упуская лишь всякую оптимизационную магию на низком уровне.

Я не говорю, что надо всё писать на Python, нет, много где он будет плохим выбором, но именно выделенных здесь проблем у него явно нет.

Имхо, сформулировано странно. Значения по умолчанию хранятся прямо внутри объекта функции:

def f(a=[1, 2, 3], b=(4, 5, 6), *, c=set((7, 8, 9))):
    pass

print(f.__defaults__)   # ([1, 2, 3], (4, 5, 6))
print(f.__kwdefaults__) # {'c': {8, 9, 7}}

И эти же значения можно изменять даже без вызова функции, а пошаманив с __code__ так и вовсе добавлять/удалять сам факт наличия значений по умолчанию:

def f(a=[1, 2, 3]):
    print(a)

f() # [1, 2, 3]
f.__defaults__ = ([4, 5, 6],)
f() # [4, 5, 6]

При передаче же аргументов ничего не "создаётся" ­– уже существующие сущности просто добавляются в словарь локальных переменных:

def f(a=[1, 2, 3], b=(4, 5, 6), *, c=set((7, 8, 9))):
    print(locals())

f()            # {'a': [1, 2, 3], 'b': (4, 5, 6), 'c': {8, 9, 7}}
f([], c=set()) # {'a': [], 'b': (4, 5, 6), 'c': set()}

И, соответственно, если аргумент был передан явно, то его значение по умолчанию внутрь не попадёт:

a_ = [1, 2, 3]
def f(a=[1, 2, 3], b=(4, 5, 6), *, c=set((7, 8, 9))):
    print(a is a_)

f()   # False
f(a_) # True

Это полезное наблюдение, вот только основная заслуга в нём не WhatsApp'а и не Paint.NET'а, а самого Excel'я и структуры буфера обмена в Windows, в который при копировании данных помещается не какое-то одно конкретное их представление, а одновременно множество поддерживаемых форматов.

Копирование текста из редактора комментария в Chrome.
Копирование текста из редактора комментария в Chrome.

Excel добавляет в буфер обмена 20 разных форматов, среди которых также присутствует CF_BITMAP содержащий, собственно, рендер скопированного контента. Именно поэтому, например, любой графический редактор, корректно реализующий копирование/вставку, будет вести себя аналогично. Telegram также предпочитает изображение, но при закрытии окна со вставленной картинкой ещё и предложит текстовое представление.

Копирование таблички 3х2 из Excel 2024.
Копирование таблички 3х2 из Excel 2024.

К слову, около 100 строк на C++ занимает программа, отображающая актуальное изображение из буфера обмена, настолько это просто реализуется.

Полагаю, это сделано для ещё меньшего размера, ведь A вариант принимает кодировку Ansi, которая позволяет уместить строку "edit" в тот самый один long, а вот utf-16, принимаемая W вариантом, с учётом завершающего нуля потребует уже больше места, что выльется в лишние инструкции и константы, увеличив размер программы.

Информация

В рейтинге
5 140-й
Зарегистрирован
Активность