Код: Выделить всё
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