Каковы различия между type () и isinstance ()?

Однолинейное решение:

В следующем коде используются URL-адреса объектов, что намного эффективнее, чем URL-адрес данных для просмотра больших изображений (URL-адрес данных - это огромная строка, содержащая все данные файла, тогда как URL-адрес объекта - это просто короткая строка, ссылающаяся на данные файла в памяти):

<img id="blah" alt="your image" width="100" height="100" />

<input type="file" 
    onchange="document.getElementById('blah').src = window.URL.createObjectURL(this.files[0])">

Сгенерированный URL-адрес будет выглядеть следующим образом:

blob:http%3A//localhost/7514bc74-65d4-4cf0-a0df-3de016824345
1121
задан TylerH 4 January 2018 в 22:09
поделиться

4 ответа

1) По какому стандарту подходит? Какие свойства вам нужны?

Сортировка списка? Легко. Давайте сделаем быструю сортировку на Haskell:

sort [] = []
sort (x:xs) = sort (filter (< x) xs) ++ [x] ++ sort (filter (>= x) xs)

Этот код имеет то преимущество, что его очень легко понять. Если список пуст, он отсортирован. В противном случае вызовите первый элемент x, найдите элементы меньше x и отсортируйте их, найдите элементы больше x и отсортируйте их. Затем объедините отсортированные списки с x посередине. Попробуйте сделать это понятным в C ++.

Конечно, Mergesort намного быстрее для сортировки связанных списков, но код также в 6 раз длиннее.

2) Очень легко реализовать императивный стиль, оставаясь при этом чисто функциональным. Суть императивного стиля - последовательность действий. Действия упорядочены в чистой настройке с использованием монад. Суть монад - это функция привязки: было бы плохо остановить использование вашего кода!), поэтому isinstance менее вредно, чем проверка идентичности типа s, потому что он поддерживает наследование без проблем.

Это не то, что isinstance is good , заметьте, это просто менее плохо , чем проверка равенства типов. Обычное, питоническое, предпочтительное решение почти всегда - это «утиная печать»: попробуйте использовать аргумент , как если бы он был определенного желаемого типа, сделайте это в попробуйте / except оператор, улавливающий все исключения, которые могли возникнуть, если аргумент не был фактически этого типа (или любого другого типа, красиво имитирующего его ;-), а в предложении except попробуйте что-нибудь еще (используя аргумент «как если бы» он был другого типа).

basestring - это , однако это довольно частный случай - встроенный тип, который существует только , чтобы позволить вам использовать isinstance (оба str и unicode подкласс basestring ). Строки - это последовательности (вы можете перебирать их, индексировать, разрезать и т. Д.), Но обычно вы хотите рассматривать их как «скалярные» типы - это несколько неудобно (но достаточно частый вариант использования) для обработки всех видов строки (и, возможно, другие скалярные типы, т. е. те, которые вы не можете использовать в цикле) в одну сторону, все контейнеры (списки, множества, dicts, ...) в другую сторону и basestring плюс isinstance поможет вам в этом - общая структура этой идиомы выглядит примерно так:

if isinstance(x, basestring)
  return treatasscalar(x)
try:
  return treatasiter(iter(x))
except TypeError:
  return treatasscalar(x)

Можно сказать, что basestring является абстрактным базовым классом («ABC») - он не предлагает конкретных функций для подклассов, а скорее существует как «маркер», в основном для использовать с isinstance . Эта концепция, очевидно, набирает обороты в Python, поскольку PEP 3119 , который вводит ее обобщение, был принят и реализован, начиная с Python 2.6 и 3.0.

PEP дает понять, что, хотя ABC часто могут заменить утиную печать, обычно нет большого давления, чтобы это сделать (см. здесь ). Однако ABC, реализованные в последних версиях Python, предлагают дополнительные преимущества: isinstance issubclass ) теперь могут означать больше, чем просто «[экземпляр] производного класса» (в частности, любой класс может быть «зарегистрирован» с помощью ABC, чтобы он отображался как подкласс, а его экземпляры как экземпляры ABC); и ABC также могут предложить дополнительное удобство для реальных подклассов очень естественным образом с помощью приложений шаблонов проектирования шаблонного метода (см. здесь и здесь [[часть II]] для получения дополнительной информации о TM DP , в целом и в частности в Python, независимо от ABC).

Для получения информации о механике поддержки ABC, предлагаемой в Python 2.6, см. здесь ; их версию 3.1, очень похожую, см. здесь . В обеих версиях стандартный библиотечный модуль collections (это версия 3.1 - очень похожая версия 2.6 см. здесь ) предлагает несколько полезных ABC.

Для целей этого ответа. ,

1200
ответ дан 19 December 2019 в 20:15
поделиться

Here's an example where isinstance achieves something that type cannot:

class Vehicle:
    pass

class Truck(Vehicle):
    pass

in this case, a truck object is a Vehicle, but you'll get this:

isinstance(Vehicle(), Vehicle)  # returns True
type(Vehicle()) == Vehicle      # returns True
isinstance(Truck(), Vehicle)    # returns True
type(Truck()) == Vehicle        # returns False, and this probably won't be what you want.

In other words, isinstance is true for subclasses, too.

Also see: How to compare type of an object in Python?

322
ответ дан 19 December 2019 в 20:15
поделиться

According to python documentation here is a statement:

8.15. types — Names for built-in types

Starting in Python 2.2, built-in factory functions such as int() and str () также являются именами для соответствующие типы.

Так что isinstance () следует предпочесть type () .

14
ответ дан 19 December 2019 в 20:15
поделиться

The latter is preferred, because it will handle subclasses properly. In fact, your example can be written even more easily because isinstance()'s second parameter may be a tuple:

if isinstance(b, (str, unicode)):
    do_something_else()

or, using the basestring abstract class:

if isinstance(b, basestring):
    do_something_else()
63
ответ дан 19 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: