Какой канонический способ проверить тип в Python?

Вот обобщение ответа, предоставленного @Jon Skeet. Это в основном то же самое, только он может использоваться для любого типа массива, а не только для байтов:

public static T[] Combine<T>(T[] first, T[] second)
{
    T[] ret = new T[first.Length + second.Length];
    Buffer.BlockCopy(first, 0, ret, 0, first.Length);
    Buffer.BlockCopy(second, 0, ret, first.Length, second.Length);
    return ret;
}

public static T[] Combine<T>(T[] first, T[] second, T[] third)
{
    T[] ret = new T[first.Length + second.Length + third.Length];
    Buffer.BlockCopy(first, 0, ret, 0, first.Length);
    Buffer.BlockCopy(second, 0, ret, first.Length, second.Length);
    Buffer.BlockCopy(third, 0, ret, first.Length + second.Length,
                     third.Length);
    return ret;
}

public static T[] Combine<T>(params T[][] arrays)
{
    T[] ret = new T[arrays.Sum(x => x.Length)];
    int offset = 0;
    foreach (T[] data in arrays)
    {
        Buffer.BlockCopy(data, 0, ret, offset, data.Length);
        offset += data.Length;
    }
    return ret;
}
1095
задан Peter Mortensen 11 November 2017 в 13:33
поделиться

5 ответов

Чтобы проверить, ли o экземпляр str или какой-либо подкласс str, используйте isinstance (это было бы "каноническим" путем):

if isinstance(o, str):

, Чтобы проверить, точно ли тип o str (исключают подклассы):

if type(o) is str:

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

if issubclass(type(o), str):

См. Встроенные функции в Справочном руководстве по библиотеке Python для релевантной информации.

Еще одно примечание: в этом случае при использовании python 2 можно на самом деле хотеть использовать:

if isinstance(o, basestring):

, потому что это также поймает строки Unicode ( unicode не подкласс [1 111]; и str и unicode подклассы [1 122] basestring ). Обратите внимание, что basestring больше не существует в python 3, где существует строгое разделение из строк ( str ) и двоичные данные ( bytes ).

, С другой стороны isinstance принимает кортеж классов. Это возвратит True, если x будет экземпляром какого-либо подкласса какого-либо из (str, unicode):

if isinstance(o, (str, unicode)):
1336
ответ дан smci 11 November 2017 в 13:33
поделиться

большинство Pythonic способ проверить тип объекта не состоит в том, чтобы... проверить его.

, Так как Python поощряет Утка, Вводящая , Вы должны всего try...except для использования методов объекта путем, Вы хотите использовать их. Таким образом, если Ваша функция ищет перезаписываемый объект файла, не делают проверка, что это - подкласс file, просто попытайтесь использовать .write() метод!

, Конечно, иногда эти хорошие абстракции терпят неудачу, и isinstance(obj, cls) то, в чем Вы нуждаетесь. Но используйте экономно.

175
ответ дан smci 11 November 2017 в 13:33
поделиться

isinstance(o, str) возвратится True, если o будет str или будет иметь тип, который наследовался от str.

type(o) is str возвратится True, если и только если o str. Это возвратится False, если o будет иметь тип, который наследовался от [1 110].

48
ответ дан L3viathan 11 November 2017 в 13:33
поделиться
12
ответ дан DarkCygnus 11 November 2017 в 13:33
поделиться

Я думаю, что прохладная вещь об использовании динамического языка как Python является Вами, действительно не придется проверить что-то как этот.

я просто назвал бы требуемые методы для Вашего объекта и поймал бы AttributeError. Позже это позволит Вам называть свои методы с другими (на вид несвязанными) объектами выполнить различные задачи, такие как насмешка объекта для тестирования.

я использовал это много при получении данных от сети с urllib2.urlopen(), который возвращается файл как объект. Это может, в свою очередь может быть передан почти любому методу, который читает из файла, потому что он реализует тот же read() метод как реальный файл.

, Но я уверен, что существует время и место для использования isinstance(), иначе это, вероятно, не было бы там:)

6
ответ дан Peter Mortensen 11 November 2017 в 13:33
поделиться
Другие вопросы по тегам:

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