Поведение линтера Python для общего глубокого копированияPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Поведение линтера Python для общего глубокого копирования

Сообщение Anonymous »

Код: Выделить всё

from typing import TypeVar

T = TypeVar("T")

def deepcopy(obj: T) -> T:
t = type(obj)

# ...
# (handling of other types)
# ...

if isinstance(obj, list):
ls = [deepcopy(item) for item in obj]

# (1) linter cannot ensure correct type
return ls

# (2) i figured out, that i can cast/call the type
# but the linter also doesn't like that
return t(ls)

# (3) finally no issues
return t.__call__(ls)

# ...
# (handling of other types)
# ...

# object is of primitive type
return obj

Код: Выделить всё

x = [[0, 1, ["a", "b", "c"]], [0, 22, 22222]]
y = deepcopy(x)

print(x)
print(y)

print(x == y)
print(x is y)
Я работаю над проектом и хочу выполнить глубокое копирование объектов любого (базового) типа.
Я придумал решение (1), которое работает успешно (насколько я проверял), но линтер не смог определить тип результирующего списка и сказал, что он не совпадает с типом объекта.
Далее я попробовал привести/вызвать результирующий список ( 2). Это удовлетворило линтер для любого другого типа, например dict, но для списков это не сработало.
По совпадению, я наткнулся на короткометражку на YouTube, в которой кто-то использовал метод dunder __call__ (для синглтон-сервис), и я опробовал его.
Теперь линтер доволен (3) :).
Я немного запутался, потому что типы должны быть ясны с самого начала (1). Может быть, общий TypeVar вызывает проблемы?
И в чем разница между вызовом с помощью t() и вызовом с помощью метода dunder t.__call__()< /code>?
Дополнительная информация:

Linter: расширение VSCode Pylance (v2024.11.3)

python: 3.11.9< /п>

Подробнее здесь: https://stackoverflow.com/questions/792 ... eepcopying
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»