Это потому, что вы должны написать
s="hello"
type(s) == type("")
тип принимает экземпляр и возвращает его тип. В этом случае вы должны сравнить два типа экземпляров.
Если вам необходимо выполнить упреждающую проверку, лучше проверить поддерживаемый интерфейс, чем тип.
Тип на самом деле мало что говорит вам, за исключением того факта, что вашему коду нужен экземпляр определенного типа, независимо от того, что у вас может быть другой экземпляр совершенно другого типа, который был бы совершенно нормальным, поскольку он реализует тот же интерфейс.
Например, предположим, у вас есть этот код
def firstElement(parameter):
return parameter[0]
Теперь предположим, что вы говорите: я хочу, чтобы этот код принимал только кортеж.
import types
def firstElement(parameter):
if type(parameter) != types.TupleType:
raise TypeError("function accepts only a tuple")
return parameter[0]
Это уменьшает возможность повторного использования этой процедуры. Это не сработает, если вы передадите список, или строку, или numpy.array. Что-то лучше было бы
def firstElement(parameter):
if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
raise TypeError("interface violation")
return parameter[0]
но в этом нет никакого смысла: параметр [0] вызовет исключение, если протокол все равно не будет удовлетворен ... это, конечно, если вы не хотите предотвратить побочные эффекты или нет необходимости восстанавливаться после вызовов, которые вы могли вызвать раньше терпит неудачу. (Глупый) пример, просто чтобы подчеркнуть:
def firstElement(parameter):
if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
raise TypeError("interface violation")
os.system("rm file")
return parameter[0]
в этом случае ваш код вызовет исключение перед выполнением системного вызова (). Без проверки интерфейса вы удалили бы файл и вызвали исключение.