{"id":321,"date":"2026-07-08T15:06:42","date_gmt":"2026-07-08T07:06:42","guid":{"rendered":"https:\/\/numsimlab.com\/?p=321"},"modified":"2026-07-08T15:06:42","modified_gmt":"2026-07-08T07:06:42","slug":"python-optional-%e5%ae%8c%e5%85%a8%e5%85%a5%e9%97%a8","status":"publish","type":"post","link":"https:\/\/numsimlab.com\/?p=321","title":{"rendered":"Python Optional \u5b8c\u5168\u5165\u95e8"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Python Optional \u5b8c\u5168\u5165\u95e8 \u00b7 Python Optional Guide<\/title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nhtml{scroll-behavior:smooth}\n:root{\n  --bg:#f8f9fa;--bg2:#fff;--ink:#1a1a2e;--muted:#6c7086;--rule:#e2e4eb;\n  --accent:#2563eb;--accent2:#16a34a;--accent3:#dc2626;--accent4:#d97706;--accent5:#7c3aed;\n  --card-bg:#fff;--code-bg:#f1f3f5;\n  --tag-g:#dcfce7;--tag-g-t:#166534;--tag-b:#dbeafe;--tag-b-t:#1e40af;\n  --tag-r:#fee2e2;--tag-r-t:#991b1b;--tag-y:#fef9c3;--tag-y-t:#713f12;--tag-p:#f3e8ff;--tag-p-t:#581c87;\n  --shadow:0 1px 3px rgba(0,0,0,.08);--radius:8px;--max-w:940px\n}\n[data-theme=\"dark\"]{\n  --bg:#0b0b1a;--bg2:#16162a;--ink:#e2e4f0;--muted:#7f8396;--rule:#26263e;\n  --accent:#60a5fa;--accent2:#4ade80;--accent3:#f87171;--accent4:#fbbf24;--accent5:#a78bfa;\n  --card-bg:#16162a;--code-bg:#1e1e36;\n  --tag-g:#14532d;--tag-g-t:#bbf7d0;--tag-b:#1e3a5f;--tag-b-t:#bfdbfe;\n  --tag-r:#7f1d1d;--tag-r-t:#fecaca;--tag-y:#713f12;--tag-y-t:#fef08a;\n  --tag-p:#3b1f6e;--tag-p-t:#e9d5ff;\n  --shadow:0 1px 3px rgba(0,0,0,.3)\n}\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Noto Sans SC\",\"PingFang SC\",\"Microsoft YaHei\",sans-serif;background:var(--bg);color:var(--ink);line-height:1.7;font-size:15px;transition:background .3s,color .3s}\nheader{position:fixed;top:0;left:0;right:0;z-index:100;background:var(--bg2);border-bottom:1px solid var(--rule);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:background .3s}\n.header-inner{max-width:var(--max-w);margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem;height:56px}\n.logo{font-weight:700;font-size:.95rem;color:var(--accent);display:flex;align-items:center;gap:.4rem}\n.controls{display:flex;align-items:center;gap:.5rem}\n.lang-switch{display:flex;border:1px solid var(--rule);border-radius:6px;overflow:hidden}\n.lang-switch button{background:0 0;border:none;color:var(--muted);padding:.3rem .7rem;font-size:.8rem;cursor:pointer;transition:all .2s;font-family:inherit}\n.lang-switch button.active{background:var(--accent);color:#fff}\n.lang-switch button:not(.active):hover{color:var(--ink);background:var(--rule)}\n.theme-toggle{background:0 0;border:1px solid var(--rule);border-radius:6px;color:var(--muted);width:34px;height:34px;font-size:1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}\n.theme-toggle:hover{color:var(--ink);background:var(--rule)}\nmain{max-width:var(--max-w);margin:0 auto;padding:80px 1.5rem 3rem}\n.lang-section{display:none}.lang-section.active{display:block}\nh1{font-size:1.9rem;font-weight:800;line-height:1.3;margin-bottom:.5rem;letter-spacing:-.02em}\nh1 .sub{display:block;font-size:.85rem;font-weight:400;color:var(--muted);margin-top:.25rem;letter-spacing:0}\nh2{font-size:1.35rem;font-weight:700;margin:2.5rem 0 1rem;padding-bottom:.5rem;border-bottom:2px solid var(--accent);letter-spacing:-.01em}\nh3{font-size:1.05rem;font-weight:600;margin:1.5rem 0 .6rem;color:var(--accent)}\nh4{font-size:.95rem;font-weight:600;margin:1rem 0 .4rem;color:var(--ink)}\np{margin-bottom:.8rem}\na{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}\n.hero{text-align:center;padding:2rem 0 1rem}\n.hero p{font-size:1rem;color:var(--muted);max-width:700px;margin:0 auto}\n.tag{display:inline-block;padding:.12rem .5rem;border-radius:4px;font-size:.72rem;font-weight:600;margin-right:.25rem;white-space:nowrap}\n.tag-g{background:var(--tag-g);color:var(--tag-g-t)}.tag-b{background:var(--tag-b);color:var(--tag-b-t)}\n.tag-r{background:var(--tag-r);color:var(--tag-r-t)}.tag-y{background:var(--tag-y);color:var(--tag-y-t)}\n.tag-p{background:var(--tag-p);color:var(--tag-p-t)}\n.card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin-bottom:1rem;box-shadow:var(--shadow)}\n.info-box{background:var(--bg);border-left:4px solid var(--accent);padding:.9rem 1.1rem;margin:1rem 0;border-radius:0 var(--radius) var(--radius) 0;font-size:.88rem}\n.info-box strong{color:var(--accent)}\n.info-box.warn{border-left-color:var(--accent4)}.info-box.warn strong{color:var(--accent4)}\n.info-box.danger{border-left-color:var(--accent3)}.info-box.danger strong{color:var(--accent3)}\n.toc{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.15rem 1.4rem;margin-bottom:2rem;box-shadow:var(--shadow)}\n.toc h3{margin:0 0 .5rem;font-size:.9rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}\n.toc ol{padding-left:1.1rem;columns:2;column-gap:2rem}\n.toc li{margin-bottom:.25rem;font-size:.88rem}.toc a{color:var(--ink)}.toc a:hover{color:var(--accent);text-decoration:none}\npre.code-block{background:var(--code-bg);padding:.85rem 1rem;border-radius:var(--radius);overflow-x:auto;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.5;margin:.6rem 0;border:1px solid var(--rule)}\ncode,.inline-code{background:var(--code-bg);padding:.12rem .4rem;border-radius:4px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.83rem;border:1px solid var(--rule)}\n.table-wrap{overflow-x:auto;margin:1.2rem 0}\ntable{width:100%;border-collapse:collapse;font-size:.82rem}\nthead th{background:var(--accent);color:#fff;padding:.6rem .5rem;text-align:center;font-weight:600;white-space:nowrap}\nthead th:first-child{border-radius:6px 0 0 0}thead th:last-child{border-radius:0 6px 0 0}\ntbody td{padding:.55rem .5rem;border-bottom:1px solid var(--rule);text-align:center;vertical-align:middle}\ntbody tr:nth-child(even){background:var(--bg)}\ntbody td:first-child{text-align:left;font-weight:600}\n.terminal{background:#1a1a2e;color:#a8e6cf;border-radius:var(--radius);padding:.9rem 1rem;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.6;margin:.6rem 0;overflow-x:auto;border:1px solid #333}\n.terminal .prompt{color:#60a5fa}.terminal .comment{color:#6c7086;font-style:italic}.terminal .output{color:#e2e4f0}\n[data-theme=\"dark\"] .terminal{background:#08081a}\n.steps{counter-reset:step;list-style:none;padding:0}\n.steps li{counter-increment:step;position:relative;padding:.85rem 1rem .85rem 2.8rem;margin-bottom:.5rem;border-left:2px solid var(--rule);border-radius:0 var(--radius) var(--radius) 0;background:var(--card-bg);box-shadow:var(--shadow)}\n.steps li::before{content:counter(step);position:absolute;left:-13px;top:.85rem;width:26px;height:26px;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.78rem;font-weight:700}\n.steps li .cmd{display:block;background:var(--code-bg);padding:.4rem .7rem;border-radius:5px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;margin:.3rem 0;overflow-x:auto;border:1px solid var(--rule)}\n.steps li .note{display:block;color:var(--muted);font-size:.82rem;margin-top:.2rem}\n.flow-diagram{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin:1.25rem 0;text-align:center}\n.flow-row{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:.35rem;margin:.4rem 0}\n.flow-item{display:inline-block;padding:.4rem .8rem;border-radius:6px;font-weight:600;font-size:.82rem;text-align:center;background:var(--accent);color:#fff;min-width:60px}\n.flow-item.green{background:var(--accent2)}.flow-item.red{background:var(--accent3)}.flow-item.yellow{background:var(--accent4);color:#1a1a2e}.flow-item.purple{background:var(--accent5)}\n.flow-arrow{color:var(--muted);font-size:1rem}\n.cmd-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:.75rem;margin:1rem 0}\n.cmd-card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:.9rem;box-shadow:var(--shadow)}\n.cmd-card h4{margin:0 0 .35rem;font-size:.88rem;color:var(--accent)}\n.cmd-card .cmd{font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.8rem;background:var(--code-bg);padding:.3rem .5rem;border-radius:4px;display:block;margin-bottom:.3rem;border:1px solid var(--rule)}\n.cmd-card .desc{font-size:.8rem;color:var(--muted)}\n.two-col{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem;margin:1.25rem 0}\n.col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;box-shadow:var(--shadow)}\n.col h4{margin-top:0}\n.compare-box{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:1rem 0}\n.compare-col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1rem;box-shadow:var(--shadow)}\n.compare-col h4{margin:0 0 .4rem;font-size:.88rem}\n.compare-col.bad h4{color:var(--accent3)}\n.compare-col.good h4{color:var(--accent2)}\npre.example{background:var(--code-bg);padding:.6rem .8rem;border-radius:6px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.78rem;line-height:1.5;margin:.4rem 0;border:1px solid var(--rule);color:var(--ink)}\nfooter{max-width:var(--max-w);margin:3rem auto 0;padding:2rem 1.5rem 3rem;border-top:1px solid var(--rule);text-align:center;font-size:.82rem;color:var(--muted)}\nfooter .links{display:flex;justify-content:center;gap:1.5rem;flex-wrap:wrap;margin-bottom:.8rem}\nfooter .links a{color:var(--muted)}footer .links a:hover{color:var(--accent)}\n@media(max-width:640px){\n  h1{font-size:1.4rem}.toc ol{columns:1}.header-inner{padding:0 1rem}main{padding:72px 1rem 2rem}\n  .steps li{padding-left:2.4rem}.steps li::before{left:-11px;width:22px;height:22px;font-size:.7rem}\n  .two-col{grid-template-columns:1fr}.cmd-grid{grid-template-columns:1fr}.compare-box{grid-template-columns:1fr}\n}\n<\/style>\n<\/head>\n<body>\n\n<header>\n  <div class=\"header-inner\">\n    <div class=\"logo\"><span>\ud83d\udc0d<\/span> Python Optional Guide<\/div>\n    <div class=\"controls\">\n      <div class=\"lang-switch\">\n        <button class=\"active\" onclick=\"setLang('zh')\" id=\"btn-zh\">\u4e2d\u6587<\/button>\n        <button onclick=\"setLang('en')\" id=\"btn-en\">English<\/button>\n      <\/div>\n      <button class=\"theme-toggle\" onclick=\"toggleTheme()\" title=\"Toggle theme\">&#9788;<\/button>\n    <\/div>\n  <\/div>\n<\/header>\n\n<main>\n\n<!-- ==================== ZH ==================== -->\n<div class=\"lang-section active\" id=\"lang-zh\">\n<div class=\"hero\">\n  <h1>Python Optional \u5b8c\u5168\u5165\u95e8<\/h1>\n  <p>\u9762\u5411\u96f6\u57fa\u7840\uff1a\u4ec0\u4e48\u662f Optional\u3001\u4e3a\u4ec0\u4e48\u8981\u7528\u3001\u600e\u4e48\u7528\u3001\u5e38\u89c1\u5751<\/p>\n<\/div>\n\n<div class=\"toc\">\n  <h3>\u76ee\u5f55<\/h3>\n  <ol>\n    <li><a href=\"#zh-what\">\u4ec0\u4e48\u662f Optional<\/a><\/li>\n    <li><a href=\"#zh-why\">\u4e3a\u4ec0\u4e48\u9700\u8981 Optional<\/a><\/li>\n    <li><a href=\"#zh-basic\">\u57fa\u7840\u7528\u6cd5<\/a><\/li>\n    <li><a href=\"#zh-common\">\u5e38\u7528\u5199\u6cd5\u4e0e\u5bf9\u6bd4<\/a><\/li>\n    <li><a href=\"#zh-null\">\u5224\u65ad\u7a7a\u503c\u6b63\u786e\u65b9\u5f0f<\/a><\/li>\n    <li><a href=\"#zh-py310\">Python 3.10+ \u7b80\u5316\u5199\u6cd5<\/a><\/li>\n    <li><a href=\"#zh-mistake\">\u5e38\u89c1\u9519\u8bef<\/a><\/li>\n    <li><a href=\"#zh-example\">\u5b9e\u6218\u793a\u4f8b<\/a><\/li>\n    <li><a href=\"#zh-summary\">\u603b\u7ed3\u901f\u67e5<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<!-- Section 1 -->\n<h2 id=\"zh-what\">\u4e00\u3001\u4ec0\u4e48\u662f Optional<\/h2>\n<p><code>Optional<\/code> \u662f Python <strong>\u7c7b\u578b\u6ce8\u89e3\u5de5\u5177<\/strong>\uff0c\u6765\u81ea <code>typing<\/code> \u6807\u51c6\u5e93\u3002<\/p>\n<p>\u5b83\u7684\u4f5c\u7528\u53ea\u6709\u4e00\u4e2a\uff1a<strong>\u6807\u8bb0\u4e00\u4e2a\u53d8\u91cf\/\u53c2\u6570\/\u8fd4\u56de\u503c \u53ef\u4ee5\u662f\u6307\u5b9a\u7c7b\u578b\uff0c\u4e5f\u53ef\u4ee5\u662f None<\/strong>\u3002<\/p>\n\n<div class=\"info-box\">\n  <strong>\u4e00\u53e5\u8bdd\u603b\u7ed3\uff1a<\/strong><code>Optional[T]<\/code> = <strong>\u8981\u4e48\u662f T \u7c7b\u578b\uff0c\u8981\u4e48\u662f None<\/strong>\uff0c\u4e8c\u9009\u4e00\u3002\n<\/div>\n\n<div class=\"card\">\n  <h4>Optional \u6838\u5fc3\u542b\u4e49<\/h4>\n  <p><span class=\"tag tag-b\">\u7c7b\u578b\u6ce8\u89e3<\/span> \u544a\u8bc9\u7f16\u8f91\u5668\/\u5de5\u5177\uff1a\u8fd9\u4e2a\u503c\u5141\u8bb8\u4e3a\u7a7a<\/p>\n  <p><span class=\"tag tag-g\">\u4e0d\u662f\u8fd0\u884c\u65f6\u529f\u80fd<\/span> \u4e0d\u4f1a\u9650\u5236\u4ee3\u7801\uff0c\u53ea\u505a\u63d0\u793a<\/p>\n  <p><span class=\"tag tag-y\">\u7b49\u4ef7\u5199\u6cd5<\/span> <code>Optional[int]<\/code> = <code>int | None<\/code><\/p>\n  <p><span class=\"tag tag-p\">\u5b89\u5168\u7f16\u7801<\/span> \u63d0\u524d\u907f\u514d\u7a7a\u503c\u62a5\u9519<\/p>\n<\/div>\n\n<!-- Section 2 -->\n<h2 id=\"zh-why\">\u4e8c\u3001\u4e3a\u4ec0\u4e48\u9700\u8981 Optional<\/h2>\n\n<h3>2.1 \u6ca1\u6709 Optional \u4f1a\u600e\u6837<\/h3>\n<p>\u5982\u679c\u4e0d\u6807\u6ce8\u7c7b\u578b\uff0c\u522b\u4eba\u8bfb\u4ee3\u7801\u3001\u7f16\u8f91\u5668\u68c0\u67e5<strong>\u4e0d\u77e5\u9053\u8fd9\u4e2a\u53d8\u91cf\u662f\u5426\u53ef\u4ee5\u4e3a\u7a7a<\/strong>\uff0c\u5bb9\u6613\u51fa\u73b0 <code>AttributeError<\/code>\u3001<code>TypeError<\/code> \u7b49\u7a7a\u503c\u5d29\u6e83\u3002<\/p>\n\n<div class=\"card\">\n  <h4>\u4f7f\u7528 Optional \u7684 4 \u4e2a\u597d\u5904<\/h4>\n  <p><strong>\u4ee3\u7801\u66f4\u6e05\u6670\uff1a<\/strong>\u4e00\u773c\u770b\u61c2\u54ea\u4e9b\u503c\u53ef\u4ee5\u4f20 None<\/p>\n  <p><strong>\u7f16\u8f91\u5668\u63d0\u793a\uff1a<\/strong>\u81ea\u52a8\u63d0\u9192\u4f60\u5224\u65ad\u7a7a\u503c<\/p>\n  <p><strong>\u51cf\u5c11 Bug\uff1a<\/strong>\u63d0\u524d\u907f\u514d\u7a7a\u503c\u62a5\u9519<\/p>\n  <p><strong>\u56e2\u961f\u534f\u4f5c\uff1a<\/strong>\u7edf\u4e00\u89c4\u8303\uff0c\u51cf\u5c11\u6c9f\u901a\u6210\u672c<\/p>\n<\/div>\n\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>\u573a\u666f<\/th><th>\u4e0d\u4f7f\u7528 Optional<\/th><th>\u4f7f\u7528 Optional<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr><td>\u53ef\u8bfb\u6027<\/td><td>\u4e0d\u77e5\u9053\u662f\u5426\u80fd\u4f20 None<\/td><td>\u660e\u786e\u5141\u8bb8\u4e3a\u7a7a<\/td><\/tr>\n    <tr><td>\u7f16\u8f91\u5668\u63d0\u793a<\/td><td>\u65e0\u63d0\u9192<\/td><td>\u81ea\u52a8\u63d0\u793a\u7a7a\u503c\u5224\u65ad<\/td><\/tr>\n    <tr><td>\u62a5\u9519\u98ce\u9669<\/td><td>\u9ad8<\/td><td>\u4f4e<\/td><\/tr>\n    <tr><td>\u7ef4\u62a4\u6210\u672c<\/td><td>\u9ad8<\/td><td>\u4f4e<\/td><\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n\n<!-- Section 3 -->\n<h2 id=\"zh-basic\">\u4e09\u3001\u57fa\u7840\u7528\u6cd5<\/h2>\n\n<h3>3.1 \u5bfc\u5165<\/h3>\n<pre class=\"code-block\">from typing import Optional<\/pre>\n\n<h3>3.2 \u6807\u51c6\u683c\u5f0f<\/h3>\n<pre class=\"code-block\"># \u683c\u5f0f\uff1aOptional[\u7c7b\u578b]\nOptional[str]    # \u53ef\u4ee5\u662f str \u6216 None\nOptional[int]    # \u53ef\u4ee5\u662f int \u6216 None\nOptional[bool]   # \u53ef\u4ee5\u662f bool \u6216 None\nOptional[list]   # \u53ef\u4ee5\u662f list \u6216 None<\/pre>\n\n<h3>3.3 \u51fd\u6570\u53c2\u6570\u793a\u4f8b<\/h3>\n<pre class=\"code-block\">from typing import Optional\n\ndef greet(name: Optional[str] = None) -> str:\n    # name \u53ef\u4ee5\u662f\u5b57\u7b26\u4e32 \u6216 None\n    if name is None:\n        return \"Hello \u964c\u751f\u4eba\"\n    return f\"Hello {name}\"\n\nprint(greet())        # \u5408\u6cd5\nprint(greet(\"\u5c0f\u660e\"))  # \u5408\u6cd5\nprint(greet(None))    # \u5408\u6cd5<\/pre>\n\n<div class=\"info-box warn\">\n  <strong>\u5173\u952e\u70b9\uff1a<\/strong><br>\n  \u2705 <code>Optional[str]<\/code> = \u5141\u8bb8\u4f20 <code>str<\/code> \u6216 <code>None<\/code><br>\n  \u2705 <strong>\u5fc5\u987b\u642d\u914d = None \u624d\u662f\u53ef\u9009\u53c2\u6570<\/strong>\n<\/div>\n\n<!-- Section 4 -->\n<h2 id=\"zh-common\">\u56db\u3001\u5e38\u7528\u5199\u6cd5\u4e0e\u5bf9\u6bd4<\/h2>\n\n<div class=\"two-col\">\n  <div class=\"col\">\n    <h4>\u274c \u9519\u8bef\u5199\u6cd5<\/h4>\n    <pre class=\"example\"># \u4e0d\u77e5\u9053\u662f\u5426\u5141\u8bb8 None\ndef get_user(id: int) -> User:\n    ...<\/pre>\n    <p>\u522b\u4eba\u8c03\u7528\u65f6\uff0c\u4e0d\u77e5\u9053\u67e5\u4e0d\u5230\u662f\u5426\u8fd4\u56de None<\/p>\n  <\/div>\n  <div class=\"col\">\n    <h4>\u2705 \u6b63\u786e\u5199\u6cd5<\/h4>\n    <pre class=\"example\">from typing import Optional\n\ndef get_user(id: int) -> Optional[User]:\n    ...<\/pre>\n    <p>\u660e\u786e\uff1a\u67e5\u5230\u8fd4\u56de User\uff0c\u6ca1\u67e5\u5230\u8fd4\u56de None<\/p>\n  <\/div>\n<\/div>\n\n<h3>4.1 \u4e09\u79cd\u5e38\u89c1\u5199\u6cd5\u5bf9\u6bd4<\/h3>\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>\u4ee3\u7801<\/th><th>\u542b\u4e49<\/th><th>\u662f\u5426\u5408\u6cd5<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr><td><code>def f(x: str)<\/code><\/td><td>\u5fc5\u987b\u4f20\u5b57\u7b26\u4e32\uff0c\u4e0d\u80fd None<\/td><td>f(&#8220;a&#8221;) \u2192 \u2705<br>f(None) \u2192 \u274c<\/td><\/tr>\n    <tr><td><code>def f(x: Optional[str])<\/code><\/td><td>\u5fc5\u987b\u4f20\u53c2\uff0c\u5141\u8bb8 str\/None<\/td><td>f(&#8220;a&#8221;) \u2192 \u2705<br>f(None) \u2192 \u2705<br>f() \u2192 \u274c<\/td><\/tr>\n    <tr><td><code>def f(x: Optional[str]=None)<\/code><\/td><td>\u53ef\u9009\u53c2\u6570\uff0c\u53ef\u4f20\u53ef\u4e0d\u4f20<\/td><td>\u5168\u90e8 \u2705<\/td><\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n\n<!-- Section 5 -->\n<h2 id=\"zh-null\">\u4e94\u3001\u5224\u65ad\u7a7a\u503c\u7684\u6b63\u786e\u65b9\u5f0f<\/h2>\n\n<div class=\"info-box danger\">\n  <strong>\u81f4\u547d\u5751\uff1a<\/strong>\u5224\u65ad Optional \u5fc5\u987b\u7528 <code>is None<\/code> \/ <code>is not None<\/code>\n<\/div>\n\n<pre class=\"code-block\">data: Optional[str]\n\n# \u2705 \u6b63\u786e\uff08\u7cbe\u51c6\u5224\u65ad None\uff09\nif data is None:\n    print(\"\u7a7a\u503c\")\n\n# \u274c \u9519\u8bef\uff08\u4f1a\u628a \"\"\u30010\u3001[] \u4e5f\u5f53\u6210\u7a7a\uff09\nif not data:\n    print(\"\u7a7a\u503c\")<\/pre>\n\n<div class=\"card\">\n  <h4>\u4e3a\u4ec0\u4e48\u4e0d\u80fd\u7528 if not x<\/h4>\n  <p><code>\"\"<\/code>\u3001<code>0<\/code>\u3001<code>[]<\/code>\u3001<code>False<\/code> \u90fd\u4f1a\u88ab\u5224\u5b9a\u4e3a\u5047\uff0c\u4f46\u5b83\u4eec <strong>\u4e0d\u662f None<\/strong>\u3002<\/p>\n  <p>\u53ea\u6709 <code>is None<\/code> \u624d\u80fd\u7cbe\u51c6\u5224\u65ad\u7a7a\u503c\u3002<\/p>\n<\/div>\n\n<!-- Section 6 -->\n<h2 id=\"zh-py310\">\u516d\u3001Python 3.10+ \u7b80\u5316\u5199\u6cd5\uff08\u63a8\u8350\uff09<\/h2>\n<p>Python 3.10 \u53ca\u4ee5\u4e0a\u7248\u672c<strong>\u4e0d\u9700\u8981\u5bfc\u5165 Optional<\/strong>\uff0c\u76f4\u63a5\u7528 <code>|<\/code> \u7b26\u53f7\uff1a<\/p>\n\n<pre class=\"code-block\"># \u65b0\u7248\u5199\u6cd5\uff08\u63a8\u8350\uff09\ndef func(name: str | None) -> str | None:\n    ...\n\n# \u7b49\u4ef7\u65e7\u5199\u6cd5\nfrom typing import Optional\ndef func(name: Optional[str]) -> Optional[str]:\n    ...<\/pre>\n\n<div class=\"info-box\">\n  <strong>\u63a8\u8350\uff1a<\/strong>\u65b0\u9879\u76ee\u76f4\u63a5\u7528 <code>\u7c7b\u578b | None<\/code>\uff0c\u66f4\u7b80\u6d01\u6613\u8bfb\u3002\n<\/div>\n\n<!-- Section 7 -->\n<h2 id=\"zh-mistake\">\u4e03\u3001\u96f6\u57fa\u7840\u5e38\u89c1\u9519\u8bef<\/h2>\n\n<ol class=\"steps\">\n  <li>\n    \u4ee5\u4e3a Optional \u4ee3\u8868\u53c2\u6570\u53ef\u7701\u7565\n    <span class=\"cmd\"># \u9519\u8bef\uff1a\u5fc5\u987b\u4f20\u53c2\uff0c\u4e0d\u80fd\u7701\u7565\ndef func(x: Optional[int])\n\n# \u6b63\u786e\uff1a\u53ef\u9009\u53c2\u6570\ndef func(x: Optional[int] = None)<\/span>\n  <\/li>\n  <li>\n    \u7528 if not x \u5224\u65ad None\n    <span class=\"cmd\"># \u274c \u9519\nif not data:\n\n# \u2705 \u5bf9\nif data is None<\/span>\n  <\/li>\n  <li>\n    \u7ed9\u975e\u7a7a\u503c\u52a0\u4e0a Optional\n    <span class=\"cmd\"># \u4e00\u5b9a\u6709\u503c\uff0c\u4e0d\u8981\u52a0 Optional\ndef get_name() -> str<\/span>\n  <\/li>\n<\/ol>\n\n<!-- Section 8 -->\n<h2 id=\"zh-example\">\u516b\u3001\u5b9e\u6218\u793a\u4f8b<\/h2>\n\n<h3>8.1 \u7c7b\u5c5e\u6027\u4f7f\u7528 Optional<\/h3>\n<pre class=\"code-block\">from typing import Optional\n\nclass User:\n    # \u624b\u673a\u53f7\u53ef\u4ee5\u4e3a\u7a7a\n    phone: Optional[str] = None\n\n    def __init__(self, phone: str | None = None):\n        self.phone = phone\n\nuser1 = User()          # \u7535\u8bdd None\nuser2 = User(\"13800138000\")<\/pre>\n\n<h3>8.2 \u51fd\u6570\u8fd4\u56de\u503c Optional<\/h3>\n<pre class=\"code-block\">from typing import Optional\n\ndef find_user(user_id: int) -> Optional[str]:\n    users = {1: \"\u5c0f\u660e\", 2: \"\u5c0f\u7ea2\"}\n    # \u627e\u5230\u8fd4\u56de\u540d\u5b57\uff0c\u627e\u4e0d\u5230\u8fd4\u56de None\n    return users.get(user_id)\n\nprint(find_user(1))   # \u5c0f\u660e\nprint(find_user(99)) # None<\/pre>\n\n<!-- Section 9 -->\n<h2 id=\"zh-summary\">\u4e5d\u3001\u603b\u7ed3\u901f\u67e5<\/h2>\n\n<div class=\"card\">\n  <h4>Optional \u901f\u8bb0<\/h4>\n  <p>\u2705 <code>Optional[T]<\/code> = <code>T \u6216 None<\/code><\/p>\n  <p>\u2705 3.10+ \u63a8\u8350\uff1a<code>T | None<\/code><\/p>\n  <p>\u2705 \u53ef\u9009\u53c2\u6570\u5fc5\u987b\u5199\uff1a<code>= None<\/code><\/p>\n  <p>\u2705 \u5224\u65ad\u7a7a\u503c\uff1a<code>if x is None<\/code><\/p>\n  <p>\u2705 \u4f5c\u7528\uff1a\u63d0\u793a\u3001\u5b89\u5168\u3001\u6e05\u6670\u3001\u9632 Bug<\/p>\n<\/div>\n\n<div class=\"info-box\">\n  <strong>\u6700\u7ec8\u53e3\u8bc0\uff1a<\/strong><br>\n  \u5141\u8bb8\u7a7a\u503c\u7528 Optional\uff0c\u5224\u65ad\u7a7a\u503c is None\uff1b<br>\n  \u53ef\u9009\u53c2\u6570\u7b49\u53f7\u8ddf\uff0c\u65b0\u7248\u7ad6\u7ebf\u66f4\u7b80\u5355\u3002\n<\/div>\n\n<\/div><!-- \/zh -->\n\n\n<!-- ==================== EN ==================== -->\n<div class=\"lang-section\" id=\"lang-en\">\n<div class=\"hero\">\n  <h1>Python Optional Complete Guide<\/h1>\n  <p>For beginners: what Optional is, why use it, how to use it, common mistakes<\/p>\n<\/div>\n\n<div class=\"toc\">\n  <h3>Table of Contents<\/h3>\n  <ol>\n    <li><a href=\"#en-what\">What is Optional<\/a><\/li>\n    <li><a href=\"#en-why\">Why Optional<\/a><\/li>\n    <li><a href=\"#en-basic\">Basic Usage<\/a><\/li>\n    <li><a href=\"#en-common\">Common Patterns<\/a><\/li>\n    <li><a href=\"#en-null\">Check None Correctly<\/a><\/li>\n    <li><a href=\"#en-py310\">Python 3.10+ Syntax<\/a><\/li>\n    <li><a href=\"#en-mistake\">Common Mistakes<\/a><\/li>\n    <li><a href=\"#en-example\">Examples<\/a><\/li>\n    <li><a href=\"#en-summary\">Summary<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<h2 id=\"en-what\">1. What is Optional<\/h2>\n<p><code>Optional<\/code> is a Python <strong>type hint<\/strong> from the <code>typing<\/code> module.<\/p>\n<p>It means: <strong>a variable can be a specific type OR None<\/strong>.<\/p>\n\n<div class=\"info-box\">\n  <strong>In short:<\/strong> <code>Optional[T]<\/code> = <strong>either T or None<\/strong>.\n<\/div>\n\n<div class=\"card\">\n  <h4>Core Meaning<\/h4>\n  <p><span class=\"tag tag-b\">Type Hint<\/span> Tells tools this value can be null<\/p>\n  <p><span class=\"tag tag-g\">Not Runtime<\/span> No enforcement, just hints<\/p>\n  <p><span class=\"tag tag-y\">Equivalent<\/span> <code>Optional[int]<\/code> = <code>int | None<\/code><\/p>\n  <p><span class=\"tag tag-p\">Safer Code<\/span> Avoid None errors early<\/p>\n<\/div>\n\n<h2 id=\"en-why\">2. Why Optional<\/h2>\n<p>Without Optional, you <strong>cannot know<\/strong> if a value can be <code>None<\/code>. This causes crashes like <code>AttributeError<\/code>.<\/p>\n\n<div class=\"card\">\n  <h4>Benefits<\/h4>\n  <p><strong>Clear code:<\/strong> Everyone sees nullable values<\/p>\n  <p><strong>Editor hints:<\/strong> Auto warn you to check None<\/p>\n  <p><strong>Fewer bugs:<\/strong> Prevent null crashes<\/p>\n  <p><strong>Team friendly:<\/strong> Standard and clear<\/p>\n<\/div>\n\n<h2 id=\"en-basic\">3. Basic Usage<\/h2>\n<pre class=\"code-block\">from typing import Optional\n\n# Format: Optional[Type]\nOptional[str]\nOptional[int]\nOptional[bool]<\/pre>\n\n<pre class=\"code-block\">def greet(name: Optional[str] = None) -> str:\n    if name is None:\n        return \"Hello stranger\"\n    return f\"Hello {name}\"<\/pre>\n\n<h2 id=\"en-common\">4. Common Patterns<\/h2>\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>Code<\/th><th>Meaning<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr><td><code>x: str<\/code><\/td><td>Must be string, no None<\/td><\/tr>\n    <tr><td><code>x: Optional[str]<\/code><\/td><td>str or None, required<\/td><\/tr>\n    <tr><td><code>x: Optional[str] = None<\/code><\/td><td>Optional, can be empty<\/td><\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n\n<h2 id=\"en-null\">5. Check None Correctly<\/h2>\n<div class=\"info-box danger\">\n  <strong>Rule:<\/strong> Always use <code>is None<\/code> \/ <code>is not None<\/code>\n<\/div>\n<pre class=\"code-block\"># \u2705 Correct\nif data is None:\n\n# \u274c Wrong\nif not data:<\/pre>\n\n<h2 id=\"en-py310\">6. Python 3.10+ Simplified (Best)<\/h2>\n<pre class=\"code-block\"># Modern (no import needed)\ndef func(name: str | None) -> str | None:\n    ...<\/pre>\n\n<h2 id=\"en-mistake\">7. Common Mistakes<\/h2>\n<ol class=\"steps\">\n  <li>Think Optional means optional parameter<\/li>\n  <li>Use <code>if not x<\/code> to check None<\/li>\n  <li>Add Optional to always-present values<\/li>\n<\/ol>\n\n<h2 id=\"en-example\">8. Examples<\/h2>\n<pre class=\"code-block\">def find_user(id: int) -> Optional[str]:\n    users = {1: \"Alice\", 2: \"Bob\"}\n    return users.get(id)<\/pre>\n\n<h2 id=\"en-summary\">9. Summary<\/h2>\n<div class=\"card\">\n  <h4>Cheat Sheet<\/h4>\n  <p>\u2705 <code>Optional[T]<\/code> = T or None<\/p>\n  <p>\u2705 Modern: <code>T | None<\/code><\/p>\n  <p>\u2705 Optional param: <code>= None<\/code><\/p>\n  <p>\u2705 Check: <code>is None<\/code><\/p>\n<\/div>\n\n<\/div><!-- \/en -->\n\n<\/main>\n\n<footer>\n  <div class=\"links\">\n    <a href=\"https:\/\/docs.python.org\/3\/library\/typing.html\" target=\"_blank\" rel=\"noopener\">Python Typing Docs<\/a>\n    <a href=\"https:\/\/github.com\/python\/typing\" target=\"_blank\" rel=\"noopener\">GitHub<\/a>\n  <\/div>\n  <p>Python Optional Complete Guide \u00b7 Python Optional \u5b8c\u5168\u5165\u95e8<\/p>\n<\/footer>\n\n<script>\nfunction setLang(lang){\n  document.querySelectorAll('.lang-section').forEach(function(el){el.classList.remove('active')});\n  document.getElementById('lang-'+lang).classList.add('active');\n  document.querySelectorAll('.lang-switch button').forEach(function(btn){btn.classList.remove('active')});\n  document.getElementById('btn-'+lang).classList.add('active');\n  document.documentElement.lang=lang==='zh'?'zh-CN':'en';\n  var p=lang==='zh'?'zh':'en';\n  var h=window.location.hash.replace(\/^#(zh|en)-\/,p+'-');\n  if(h)window.location.hash=h;\n}\nfunction toggleTheme(){\n  var html=document.documentElement;\n  if(html.hasAttribute('data-theme')){html.removeAttribute('data-theme');localStorage.removeItem('theme')}\n  else{html.setAttribute('data-theme','dark');localStorage.setItem('theme','dark')}\n}\n(function(){\n  if(localStorage.getItem('theme')==='dark')document.documentElement.setAttribute('data-theme','dark');\n  var h=window.location.hash;\n  if(h){var t=document.querySelector(h);if(t)setTimeout(function(){t.scrollIntoView({behavior:'smooth'})},100)}\n})();\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Python Optional \u5b8c\u5168\u5165\u95e8 \u00b7 Python Optional Guide \ud83d\udc0d Python O [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,9],"tags":[],"class_list":["post-321","post","type-post","status-publish","format-standard","hentry","category-cad","category-ai"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/321","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=321"}],"version-history":[{"count":1,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/321\/revisions"}],"predecessor-version":[{"id":322,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/321\/revisions\/322"}],"wp:attachment":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=321"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=321"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}