🔍 Type Checking in Python
Type checking means finding out what type of data a value or variable contains.
Python provides two common ways to do this:
type()isinstance()
1️⃣ type()
The type() function tells us the exact type of a value.
x = 10
print(type(x))<class 'int'>Examples
print(type(10)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type("Python")) # <class 'str'>
print(type(True)) # <class 'bool'>
print(type([1, 2, 3])) # <class 'list'>You can also use it to compare types:
x = 10
print(type(x) == int) # True
print(type(x) == str) # False2️⃣ isinstance()
isinstance() checks whether a value belongs to a particular type.
Syntax
isinstance(value, type)Example:
x = 10
print(isinstance(x, int)) # True
print(isinstance(x, str)) # FalseMultiple Types
You can check multiple types at once:
x = 10
print(isinstance(x, (int, float))) # TrueThis returns True if x is either an int or a float.
⚖️ type() vs isinstance()
|
|
|---|---|
Returns the exact type | Checks whether a value is an instance of a type |
|
|
Useful for finding the type | Useful for type checking |
Doesn't account for inheritance | Works with inheritance |
⭐ Remember
type(x)👉 "What exactly is the type of x?"
isinstance(x, int)👉 "Is x an integer?"
<div class="infographic-pytypes">
<style>
.infographic-pytypes {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--true-c: #1f9d55; --true-soft: #e3f5ec;
--false-c: #c0392b; --false-soft: #fbe9e7;
--warn: #b45309; --warn-soft: #fdf0dc;
--mono-font: 'IBM Plex Mono', 'SFMono-Regular', Menlo, monospace;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', system-ui, sans-serif;
box-sizing: border-box;
max-width: 780px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-pytypes[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--true-c: #6fdc8c; --true-soft: #1c3324;
--false-c: #e57373; --false-soft: #3a2222;
--warn: #e0a458; --warn-soft: #3a2c14;
}
.infographic-pytypes *, .infographic-pytypes *::before, .infographic-pytypes *::after { box-sizing: border-box; }
.infographic-pytypes .tc-wrap { padding: 0 clamp(1rem, 4vw, 2rem) 1.5rem; }
.infographic-pytypes h1 {
font-family: var(--display-font); font-weight: 600;
font-size: clamp(1.5rem, 5vw, 2.05rem); text-align: center; margin: 1.5rem 0 0.25rem; letter-spacing: -0.01em;
}
.infographic-pytypes .tc-sub { text-align: center; color: var(--ink-soft); font-size: 0.86rem; margin: 0 0 1.4rem; }
/* value tester */
.infographic-pytypes .val-input-row { display: flex; justify-content: center; margin-bottom: 0.8rem; }
.infographic-pytypes .val-input {
font-family: var(--mono-font); font-size: 1.05rem; font-weight: 700; text-align: center;
padding: 0.5rem 0.7rem; border: 2px solid var(--line); border-radius: 8px;
background: var(--paper-alt); color: var(--ink); width: 220px;
}
.infographic-pytypes .val-input:focus { outline: none; border-color: var(--accent); }
.infographic-pytypes .chip-row { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.35rem; margin-bottom: 1.1rem; }
.infographic-pytypes .chip {
font: inherit; font-family: var(--mono-font); font-size: 0.75rem; font-weight: 700;
background: var(--paper-alt); border: 1.5px solid var(--line); color: var(--ink-soft);
padding: 0.28rem 0.55rem; cursor: pointer; border-radius: 999px;
}
.infographic-pytypes .chip:hover { border-color: var(--accent); color: var(--accent); }
.infographic-pytypes .type-readout {
text-align: center; font-family: var(--mono-font); font-size: 1rem; font-weight: 700; color: var(--accent);
margin-bottom: 1rem;
}
.infographic-pytypes .target-row { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.4rem; margin-bottom: 1rem; }
.infographic-pytypes .target-btn {
font: inherit; font-family: var(--mono-font); font-size: 0.8rem; font-weight: 700;
background: var(--paper-alt); border: 1.5px solid var(--line); color: var(--ink-soft);
padding: 0.4rem 0.7rem; cursor: pointer; border-radius: 6px;
}
.infographic-pytypes .target-btn.is-selected { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); }
.infographic-pytypes .result-line {
text-align: center; font-family: var(--mono-font); font-size: 0.95rem; margin-bottom: 0.4rem;
}
.infographic-pytypes .result-badge-inline {
font-weight: 700; padding: 0.1rem 0.5rem; border-radius: 999px; margin-left: 0.3rem;
}
.infographic-pytypes .result-badge-inline.t { background: var(--true-soft); color: var(--true-c); }
.infographic-pytypes .result-badge-inline.f { background: var(--false-soft); color: var(--false-c); }
.infographic-pytypes .gotcha-note {
text-align: center; font-size: 0.82rem; color: var(--warn); background: var(--warn-soft);
border: 1px solid var(--warn); border-radius: 8px; padding: 0.6rem 0.8rem; margin-top: 0.9rem;
display: none;
}
.infographic-pytypes .gotcha-note.is-visible { display: block; }
/* hierarchy tab */
.infographic-pytypes .make-row { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.4rem; margin-bottom: 1.3rem; }
.infographic-pytypes .make-btn {
font: inherit; font-family: var(--mono-font); font-size: 0.82rem; font-weight: 700;
background: var(--paper-alt); border: 1.5px solid var(--line); color: var(--ink-soft);
padding: 0.45rem 0.8rem; cursor: pointer; border-radius: 6px;
}
.infographic-pytypes .make-btn.is-selected { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); }
.infographic-pytypes .chain-stage { display: flex; flex-direction: column; align-items: center; margin-bottom: 1.1rem; }
.infographic-pytypes .chain-box {
font-family: var(--mono-font); font-size: 0.9rem; font-weight: 700;
padding: 0.5rem 1.1rem; border-radius: 8px; border: 2px solid var(--line);
background: var(--paper-alt); color: var(--ink); margin-bottom: 0.15rem;
}
.infographic-pytypes .chain-arrow { color: var(--accent); font-size: 1.1rem; margin: 0.1rem 0; }
.infographic-pytypes .chain-box.is-instance { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); }
.infographic-pytypes .type-readout-fixed {
text-align: center; font-family: var(--mono-font); font-size: 0.88rem; color: var(--ink-soft); margin-bottom: 1rem;
}
.infographic-pytypes .type-readout-fixed strong { color: var(--accent); }
.infographic-pytypes .test-row { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.4rem; margin-bottom: 1rem; }
.infographic-pytypes .test-btn {
font: inherit; font-family: var(--mono-font); font-size: 0.8rem; font-weight: 700;
background: var(--paper); border: 1.5px solid var(--line); color: var(--ink);
padding: 0.4rem 0.7rem; cursor: pointer; border-radius: 6px;
}
.infographic-pytypes .test-btn.is-selected.t { border-color: var(--true-c); background: var(--true-soft); color: var(--true-c); }
.infographic-pytypes .test-btn.is-selected.f { border-color: var(--false-c); background: var(--false-soft); color: var(--false-c); }
.infographic-pytypes .tc-note { text-align: center; font-size: 0.8rem; color: var(--ink-soft); margin-top: 0.6rem; }
@media (prefers-reduced-motion: reduce) {
.infographic-pytypes *, .infographic-pytypes *::before, .infographic-pytypes *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="tc-wrap">
<h1>type() vs isinstance()</h1>
<p class="tc-sub">type() tells you the exact class. isinstance() also counts the ancestors.</p>
<div class="tc-panel" id="tabTester">
<div class="val-input-row">
<input class="val-input" id="valInput" type="text" value="True" spellcheck="false" />
</div>
<div class="chip-row" id="valChips"></div>
<div class="type-readout" id="typeReadout">type(x) = <class 'bool'></div>
<div class="target-row" id="targetRow"></div>
<p class="result-line" id="resultLine">isinstance(x, int) <span class="result-badge-inline t" id="resultBadgeInline">True</span></p>
<div class="gotcha-note" id="gotchaNote">Surprise: <strong>bool</strong> is a subclass of <strong>int</strong> in Python — so isinstance(True, int) is True, even though type(True) is bool, not int.</div>
</div>
</div>
<script>
(function () {
var root = document.currentScript.closest('.infographic-pytypes')
|| document.querySelector('.infographic-pytypes');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) root.setAttribute('data-theme', 'dark');
/* ================= TAB 1: value tester ================= */
var valInput = root.querySelector('#valInput');
var typeReadout = root.querySelector('#typeReadout');
var targetRow = root.querySelector('#targetRow');
var resultLine = root.querySelector('#resultLine');
var resultBadgeInline = root.querySelector('#resultBadgeInline');
var gotchaNote = root.querySelector('#gotchaNote');
var valChips = root.querySelector('#valChips');
var targetTypes = ['int', 'float', 'str', 'bool', 'list', 'tuple', 'dict', 'set', 'NoneType'];
var currentTarget = 'int';
targetTypes.forEach(function (t) {
var btn = document.createElement('button');
btn.className = 'target-btn' + (t === currentTarget ? ' is-selected' : '');
btn.textContent = t;
btn.dataset.target = t;
btn.addEventListener('click', function () {
root.querySelectorAll('#targetRow .target-btn').forEach(function (b) { b.classList.toggle('is-selected', b === btn); });
currentTarget = t;
recomputeTester();
});
targetRow.appendChild(btn);
});
function detectType(raw) {
if (raw === 'None') return 'NoneType';
if (raw === 'True' || raw === 'False') return 'bool';
if (/^-?\d+$/.test(raw)) return 'int';
if (/^-?\d*\.\d+$/.test(raw)) return 'float';
if (/^".*"$/.test(raw) || /^'.*'$/.test(raw)) return 'str';
if (/^\[.*\]$/.test(raw)) return 'list';
if (/^\(.*\)$/.test(raw)) return 'tuple';
if (/^\{.*:.*\}$/.test(raw) || raw === '{}') return 'dict';
if (/^\{.*\}$/.test(raw)) return 'set';
return 'str'; // bare text fallback
}
function isInstanceOf(pyType, target) {
if (pyType === target) return true;
if (pyType === 'bool' && target === 'int') return true; // bool is a subclass of int
return false;
}
function recomputeTester() {
var raw = valInput.value;
var pyType = detectType(raw);
typeReadout.textContent = "type(x) = <class '" + pyType + "'>";
var result = isInstanceOf(pyType, currentTarget);
resultLine.innerHTML = 'isinstance(x, ' + currentTarget + ') <span class="result-badge-inline ' + (result ? 't' : 'f') + '" id="resultBadgeInline">' + (result ? 'True' : 'False') + '</span>';
var isGotcha = pyType === 'bool' && currentTarget === 'int';
gotchaNote.classList.toggle('is-visible', isGotcha);
}
valInput.addEventListener('input', recomputeTester);
[
['True', 'True'], ['5', '5'], ['3.14', '3.14'], ['"hi"', '"hi"'],
['[1, 2]', '[1, 2]'], ['(1, 2)', '(1, 2)'], ['{"a": 1}', '{"a": 1}'], ['{1, 2}', '{1, 2}'], ['None', 'None']
].forEach(function (pair) {
var chip = document.createElement('button');
chip.className = 'chip';
chip.textContent = pair[0];
chip.addEventListener('click', function () { valInput.value = pair[1]; recomputeTester(); });
valChips.appendChild(chip);
});
recomputeTester();
})();
</script>
</div>