Однолинейное решение:
В следующем коде используются 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
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.
Для целей этого ответа. ,
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.
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()
andstr ()
также являются именами для соответствующие типы.
Так что isinstance ()
следует предпочесть type ()
.
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()