Вот обобщение ответа, предоставленного @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;
}
Чтобы проверить, ли 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)):
большинство Pythonic способ проверить тип объекта не состоит в том, чтобы... проверить его.
, Так как Python поощряет Утка, Вводящая , Вы должны всего try...except
для использования методов объекта путем, Вы хотите использовать их. Таким образом, если Ваша функция ищет перезаписываемый объект файла, не делают проверка, что это - подкласс file
, просто попытайтесь использовать .write()
метод!
, Конечно, иногда эти хорошие абстракции терпят неудачу, и isinstance(obj, cls)
то, в чем Вы нуждаетесь. Но используйте экономно.
isinstance(o, str)
возвратится True
, если o
будет str
или будет иметь тип, который наследовался от str
.
type(o) is str
возвратится True
, если и только если o
str. Это возвратится False
, если o
будет иметь тип, который наследовался от [1 110].
Я думаю, что прохладная вещь об использовании динамического языка как Python является Вами, действительно не придется проверить что-то как этот.
я просто назвал бы требуемые методы для Вашего объекта и поймал бы AttributeError
. Позже это позволит Вам называть свои методы с другими (на вид несвязанными) объектами выполнить различные задачи, такие как насмешка объекта для тестирования.
я использовал это много при получении данных от сети с urllib2.urlopen()
, который возвращается файл как объект. Это может, в свою очередь может быть передан почти любому методу, который читает из файла, потому что он реализует тот же read()
метод как реальный файл.
, Но я уверен, что существует время и место для использования isinstance()
, иначе это, вероятно, не было бы там:)