Да, есть разница. Хотя в Python 3 все объекты являются экземплярами object
, в том числе object
, только Any
документов, что возвращаемое значение должно игнорироваться директивой typechecker.
строку документации состояния Any
типа, что объект является подклассом Any
и наоборот:
>>> import typing
>>> print(typing.Any.__doc__)
Special type indicating an unconstrained type.
- Any object is an instance of Any.
- Any class is a subclass of Any.
- As a special case, Any and object are subclasses of each other.
Однако собственно проверки типов (тот, который выходит за рамки isinstance()
проверок, и который проверяет, как объект на самом деле в функции) может легко возражать против object
, где Any
всегда принимается.
От Any
type documentation:
Обратите внимание, что ни одна проверка типов не выполняется при присвоении значения типа Any
к более точному типу.
и
Контраст поведение Any
с поведением object
. Подобно Any
, каждый тип является подтипом object
. Однако, в отличие от Any
, обратное неверно: объект не является подтипом любого другого типа.
Это означает, что когда тип значения равен object
, средство проверки типов отклонит почти все операции над ним, а присвоение его переменной (или использованию ее как возвращаемого значения) более специализированного типа - это ошибка типа ,
и из секции Any vs. object документации mypy:
Тип object
другой тип, который может иметь экземпляр произвольного типа в качестве значения. В отличие от Any
, object
является обычным статическим типом (он похож на Object
в Java), и для значений объекта принимаются только действительные для всех типов операции.
object
может быть cast к более конкретному типу, в то время как Any
на самом деле означает что-нибудь идет и тип проверки отсоединяется от использования объекта (даже если позже вы назначили такой объект, имя которого является typechecked).
Вы уже нарисовали свою функцию в непечатаемом углу, приняв list
, что сводится к тому, что это List[Any]
.Тип typechecker отключен там, и возвращаемое значение больше не имеет значения, но поскольку ваша функция принимает список, содержащий Any
объектов, правильное возвращаемое значение будет Any
здесь.
Для правильного участия в проверенном кодом необходимо пометить свой ввод как List[T]
(типично типизированный контейнер) для typechecker, чтобы затем ухаживать за возвращаемым значением. Что в вашем случае будет T
, так как вы извлекаете значение из списка. Создание T
из TypeVar
:
from typing import TypeVar, List
T = TypeVar('T')
def get_item(L: List[T], i: int) -> T:
return L[i]
Это интересный, еще один специальный случай для структуры 'object' /' type'. Еще раз спасибо Martijn! :) –
К сожалению, это не совсем правильно - см. Мой ответ ниже. В частности, ключевым моментом является то, что 'Any' предназначен для полного безусловного - любая операция разрешена для значения типа' Any'. Напротив, объект является наиболее ограниченным типом. Если у вас есть значение типа 'Any', единственными действиями, которые вам разрешено делать, являются те, которые являются частью интерфейса' object' (например, '__str__' и т. Д.). «Объект является подклассом« Любой »и наоборот» существует в основном для объяснения того, почему все значения совместимы с «Любом», даже если они не являются технически подклассом или суперклассом этого типа. – Michael0x2a
@ Michael0x2a: справа, поэтому из точки ввода 'Any' 'позволяет использовать функцию' object .__ missing__', в то время как 'object' не будет, поскольку этот метод является необязательным. Таким образом, 'Any' документирует, как функция будет использовать аргумент, а не только сухое применение теста isinstance. На практике они остаются теми же, потому что тест 'isinstance()', используемый в 'typing', будет проходить в любом случае. –