{"id":327,"date":"2026-07-08T15:27:31","date_gmt":"2026-07-08T07:27:31","guid":{"rendered":"https:\/\/numsimlab.com\/?p=327"},"modified":"2026-07-08T15:27:31","modified_gmt":"2026-07-08T07:27:31","slug":"toml-%e6%96%87%e4%bb%b6-python-%e5%ae%8c%e6%95%b4%e6%95%99%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/numsimlab.com\/?p=327","title":{"rendered":"TOML \u6587\u4ef6 &amp; Python \u5b8c\u6574\u6559\u7a0b"},"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>TOML \u6587\u4ef6 &#038; Python \u5b8c\u6574\u6559\u7a0b \u00b7 TOML 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,.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,.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) 0;background:var(--card-bg);box-shadow:var(--shadow)}\n.steps li::before{content:counter();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\udcdc<\/span> TOML &#038; Python 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=\"\u5207\u6362\u660e\u6697\u4e3b\u9898\">&#9788;<\/button>\n    <\/div>\n  <\/div>\n<\/header>\n\n<main>\n<!-- \u4e2d\u6587\u6559\u7a0b\u533a\u57df -->\n<div class=\"lang-section active\" id=\"lang-zh\">\n<div class=\"hero\">\n  <h1>TOML \u6587\u4ef6 &#038; Python \u96f6\u57fa\u7840\u5b8c\u6574\u6559\u7a0b<\/h1>\n  <p>\u4ec0\u4e48\u662fTOML\u3001\u8bed\u6cd5\u89c4\u5219\u3001tomllib\/tomli\u5e93\u3001\u8bfb\u5199\u914d\u7f6e\u3001pyproject.toml\u5b9e\u6218\u3001\u5bf9\u6bd4JSON\/YAML<\/p>\n<\/div>\n\n<div class=\"toc\">\n  <h3>\u76ee\u5f55<\/h3>\n  <ol>\n    <li><a href=\"#zh-what\">\u4e00\u3001\u4ec0\u4e48\u662f TOML<\/a><\/li>\n    <li><a href=\"#zh-scene\">\u4e8c\u3001TOML \u4e3b\u6d41\u4f7f\u7528\u573a\u666f<\/a><\/li>\n    <li><a href=\"#zh-compare\">\u4e09\u3001TOML vs JSON vs YAML \u5bf9\u6bd4<\/a><\/li>\n    <li><a href=\"#zh-syntax\">\u56db\u3001TOML \u5b8c\u6574\u57fa\u7840\u8bed\u6cd5<\/a><\/li>\n    <li><a href=\"#zh-lib\">\u4e94\u3001Python \u89e3\u6790 TOML \u7684\u5e93<\/a><\/li>\n    <li><a href=\"#zh-read\">\u516d\u3001Python \u8bfb\u53d6 TOML \u6587\u4ef6<\/a><\/li>\n    <li><a href=\"#zh-write\">\u4e03\u3001Python \u5199\u5165\/\u4fee\u6539 TOML \u6587\u4ef6<\/a><\/li>\n    <li><a href=\"#zh-pyproject\">\u516b\u3001\u6838\u5fc3\u5b9e\u6218\uff1apyproject.toml \u8be6\u89e3<\/a><\/li>\n    <li><a href=\"#zh-error\">\u4e5d\u3001\u5e38\u89c1\u62a5\u9519\u4e0e\u6392\u5751<\/a><\/li>\n    <li><a href=\"#zh-summary\">\u5341\u3001\u901f\u8bb0\u603b\u7ed3<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<h2 id=\"zh-what\">\u4e00\u3001\u4ec0\u4e48\u662f TOML<\/h2>\n<p>TOML \u5168\u79f0 <strong>Tom&#8217;s Obvious, Minimal Language<\/strong>\uff0c\u662f\u4e00\u79cd\u4e13\u4e3a\u914d\u7f6e\u6587\u4ef6\u8bbe\u8ba1\u7684\u6807\u51c6\u5316\u3001\u5f3a\u7c7b\u578b\u6587\u672c\u683c\u5f0f\uff0c\u6807\u51c6\u540e\u7f00 <code>.toml<\/code>\u3002<\/p>\n<div class=\"info-box\">\n  <strong>\u6838\u5fc3\u5b9a\u4f4d\uff1a<\/strong>\u4e13\u95e8\u7ed9\u7a0b\u5e8f\u9879\u76ee\u7528\u914d\u7f6e\uff0cPython \u5b98\u65b9\u6807\u51c6\u9879\u76ee\u914d\u7f6e\u6587\u4ef6 <code>pyproject.toml<\/code> \u5c31\u662f TOML\u3002\n<\/div>\n<div class=\"card\">\n  <h4>TOML \u56db\u5927\u6838\u5fc3\u7279\u70b9<\/h4>\n  <p><span class=\"tag-g\">\u5c42\u7ea7\u6e05\u6670<\/span> \u4f7f\u7528 <code>[\u8868\u540d]<\/code> \u5206\u6bb5\uff0c\u5c42\u7ea7\u4e00\u76ee\u4e86\u7136<\/p>\n  <p><span class=\"tag-b\">\u5f3a\u7c7b\u578b<\/span> \u539f\u751f\u652f\u6301\u6570\u5b57\u3001\u5e03\u5c14\u3001\u65e5\u671f\u3001\u6570\u7ec4\uff0c\u65e0\u7c7b\u578b\u6b67\u4e49<\/p>\n  <p><span class=\"tag-y\">\u65e0\u591a\u4f59\u7b26\u53f7<\/span> \u4e0d\u9700\u8981\u9017\u53f7\u3001\u5927\u62ec\u53f7\uff0c\u6bd4JSON\u7b80\u6d01<\/p>\n  <p><span class=\"tag-p\">Python \u5b98\u65b9\u6807\u51c6<\/span> PEP 621 \u89c4\u5b9a\u9879\u76ee\u5143\u6570\u636e\u7edf\u4e00\u4f7f\u7528 pyproject.toml<\/p>\n<\/div>\n\n<h2 id=\"zh-scene\">\u4e8c\u3001TOML \u4e3b\u6d41\u4f7f\u7528\u573a\u666f<\/h2>\n<ul style=\"margin-left:1.2rem;margin-bottom:1rem;\">\n  <li>Python \u9879\u76ee\u6807\u51c6\u914d\u7f6e\uff1a<code>pyproject.toml<\/code>\uff08\u4f9d\u8d56\u3001\u6784\u5efa\u5de5\u5177\u3001Ruff\/Pytest\u914d\u7f6e\uff09<\/li>\n  <li>Rust \u9879\u76ee <code>Cargo.toml<\/code>\uff08\u6807\u914d\uff09<\/li>\n  <li>uv\u3001poetry\u3001pipenv\u3001pdm \u5305\u7ba1\u7406\u5668\u914d\u7f6e<\/li>\n  <li>Ruff\u3001Black\u3001isort\u3001mypy \u4ee3\u7801\u5de5\u5177\u914d\u7f6e<\/li>\n  <li>\u540e\u7aef\u7a0b\u5e8f\u5e94\u7528\u914d\u7f6e\u3001\u670d\u52a1\u53c2\u6570\u6587\u4ef6<\/li>\n<\/ul>\n\n<h2 id=\"zh-compare\">\u4e09\u3001TOML vs JSON vs YAML \u5bf9\u6bd4<\/h2>\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>\u683c\u5f0f<\/th><th>\u8bbe\u8ba1\u76ee\u6807<\/th><th>\u7c7b\u578b\u652f\u6301<\/th><th>\u5206\u6bb5\u80fd\u529b<\/th><th>Python\u539f\u751f\u652f\u6301<\/th><th>\u5178\u578b\u7528\u9014<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>JSON<\/td>\n      <td>\u6570\u636e\u4f20\u8f93<\/td>\n      <td>\u57fa\u7840\u7c7b\u578b\u6709\u9650\uff0c\u65e0\u65e5\u671f<\/td>\n      <td>\u591a\u5c42\u5927\u62ec\u53f7\u5d4c\u5957\uff0c\u96be\u9605\u8bfb<\/td>\n      <td>\u5185\u7f6ejson\u5e93<\/td>\n      <td>\u63a5\u53e3\u8bf7\u6c42\u54cd\u5e94<\/td>\n    <\/tr>\n    <tr>\n      <td>YAML<\/td>\n      <td>\u901a\u7528\u914d\u7f6e<\/td>\n      <td>\u4e30\u5bcc\uff0c\u4f46\u7f29\u8fdb\u654f\u611f\u6613\u51fa\u9519<\/td>\n      <td>\u7f29\u8fdb\u5206\u5c42\uff0cTab\u62a5\u9519<\/td>\n      <td>\u9700\u5b89\u88c5pyyaml<\/td>\n      <td>K8s\u3001CI\u811a\u672c<\/td>\n    <\/tr>\n    <tr>\n      <td>TOML<\/td>\n      <td>\u9879\u76ee\u914d\u7f6e\u4e13\u7528<\/td>\n      <td>\u539f\u751f\u65e5\u671f\u3001\u6574\u6570\u3001\u6d6e\u70b9\u6570\u3001\u5e03\u5c14<\/td>\n      <td>[table] \u5206\u6bb5\uff0c\u5b8c\u5168\u4e0d\u6015\u7f29\u8fdb<\/td>\n      <td>3.11+\u5185\u7f6etomllib<\/td>\n      <td>Python\/Rust\u9879\u76ee\u914d\u7f6e<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n<div class=\"compare-box\">\n  <div class=\"compare-col good\">\n    <h4>TOML \u793a\u4f8b\uff08\u6e05\u6670\u5206\u6bb5\uff09<\/h4>\n<pre class=\"example\">[server]\nhost = \"127.0.0.1\"\nport = 8000\ndebug = true\n\n[database]\nuser = \"root\"\n<\/pre>\n  <\/div>\n  <div class=\"compare-col bad\">\n    <h4>\u540c\u7b49JSON\uff08\u5d4c\u5957\u7e41\u7410\uff09<\/h4>\n<pre class=\"example\">{\n  \"server\": {\n    \"host\": \"127.0.0.1\",\n    \"port\": 8000,\n    \"debug\": true\n  },\n  \"database\": {\n    \"user\": \"root\"\n  }\n}\n<\/pre>\n  <\/div>\n<\/div>\n\n<h2 id=\"zh-syntax\">\u56db\u3001TOML \u5b8c\u6574\u57fa\u7840\u8bed\u6cd5<\/h2>\n<div class=\"info-box warn\">\n  <strong>\u57fa\u7840\u89c4\u5219\uff1a<\/strong>\u952e\u503c\u5bf9\u7528 <code>=<\/code> \u5206\u9694\uff1b\u5b57\u7b26\u4e32\u53cc\u5f15\u53f7\uff1b\u6ce8\u91ca <code>#<\/code>\uff1b\u5206\u6bb5\u7528 <code>[table]<\/code>\u3002\n<\/div>\n<h3>4.1 \u57fa\u7840\u952e\u503c\u5bf9\uff08\u5168\u5c40\u65e0\u5206\u6bb5\uff09<\/h3>\n<pre class=\"code-block\">name = \"PythonDemo\"\nversion = 0.1.0\nis_release = false\ncount = 100\ncreate_time = 2026-07-08T10:30:00\nempty_val = null\n<\/pre>\n\n<h3>4.2 \u8868 [table] \u5206\u6bb5\uff08\u6700\u6838\u5fc3\u7279\u6027\uff09<\/h3>\n<p><code>[\u8868\u540d]<\/code> \u4ee3\u8868\u4e00\u7ec4\u72ec\u7acb\u914d\u7f6e\uff0c\u4e0b\u9762\u6240\u6709\u952e\u503c\u90fd\u5c5e\u4e8e\u8fd9\u4e2a\u8868<\/p>\n<pre class=\"code-block\">[app]\nname = \"\u6d4b\u8bd5\u9879\u76ee\"\ndebug = true\n\n[db.mysql]  # \u5d4c\u5957\u8868 db\u4e0b\u7684mysql\nhost = \"127.0.0.1\"\nport = 3306\n<\/pre>\n\n<h3>4.3 \u6570\u7ec4\/\u5217\u8868<\/h3>\n<pre class=\"code-block# \u4e00\u7ef4\u6570\u7ec4\ntags = [\"python\", \"toml\", \"backend\"]\nnums = [1, 2, 3, 4]\n\n# \u591a\u884c\u6570\u7ec4\nallow_origin = [\n  \"http:\/\/localhost:3000\",\n  \"https:\/\/xxx.com\"\n]\n<\/pre>\n\n<h3>4.4 \u5185\u8054\u8868\uff08\u5355\u884c\u5d4c\u5957\u5bf9\u8c61\uff09<\/h3>\n<pre class=\"code-block\">info = { id = 1, username = \"admin\" }\n<\/pre>\n\n<h3>4.5 \u6ce8\u91ca<\/h3>\n<pre class=\"code-block\"># \u6574\u884c\u6ce8\u91ca\nport = 8000  # \u884c\u5c3e\u6ce8\u91ca\u4e5f\u652f\u6301\n<\/pre>\n\n<h2 id=\"zh-lib\">\u4e94\u3001Python \u89e3\u6790 TOML \u7684\u5e93<\/h2>\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>Python3.11+ \u5185\u7f6e tomllib\uff08\u63a8\u8350\uff09<\/h4>\n    <div class=\"cmd\"># \u65e0\u9700\u5b89\u88c5\uff0c\u6807\u51c6\u5e93\nimport tomllib<\/div>\n    <div class=\"desc\">\u53ea\u8bfb\uff0c\u4ec5\u652f\u6301\u52a0\u8f7d\u6587\u4ef6\uff0c\u4e0d\u652f\u6301\u5199\u5165<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>tomli\uff083.10\u53ca\u4ee5\u4e0b\u517c\u5bb9\uff09<\/h4>\n    <div class=\"cmd>pip install tomli<\/div>\n    <div class=\"desc\">API\u548ctomllib\u5b8c\u5168\u4e00\u81f4\uff0c\u4f4e\u7248\u672c\u517c\u5bb9<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>tomli-w \u5199\u5165\u5e93<\/h4>\n    <div class=\"cmd>pip install tomli-w<\/div>\n    <div class=\"desc\">\u552f\u4e00\u7a33\u5b9a\u5199\u5165TOML\u7684\u5b98\u65b9\u5de5\u5177<\/div>\n  <\/div>\n<\/div>\n<div class=\"info-box\">\n  <strong>\u7ec4\u5408\u65b9\u6848\uff1a<\/strong>\u8bfb\u53d6 tomllib \/ tomli\uff1b\u5199\u5165 tomli-w\n<\/div>\n\n<h2 id=\"zh-read\">\u516d\u3001Python \u8bfb\u53d6 TOML \u6587\u4ef6<\/h2>\n<h3>6.1 \u51c6\u5907 config.toml<\/h3>\n<pre class=\"code-block\">[app]\nname = \"\u540e\u7aef\u670d\u52a1\"\ndebug = true\n\n[db]\nhost = \"127.0.0.1\"\nport = 3306\npool_size = 10\n<\/pre>\n<h3>6.2 Python3.11+ \u8bfb\u53d6\u4ee3\u7801\uff08tomllib\uff09<\/h3>\n<pre class=\"code-block\">import tomllib\n\n# \u4e8c\u8fdb\u5236\u6a21\u5f0f rb \u6253\u5f00\uff08tomllib\u5f3a\u5236\u4e8c\u8fdb\u5236\u8bfb\u53d6\uff09\nwith open(\"config.toml\", \"rb\") as f:\n    cfg = tomllib.load(f)\n\n# \u8bfb\u53d6\u5168\u5c40\u3001\u5206\u6bb5\u6570\u636e\nprint(cfg[\"app\"][\"name\"])\nprint(cfg[\"db\"][\"host\"])\nprint(cfg[\"db\"][\"port\"])\n<\/pre>\n<h3>6.3 \u4f4e\u7248\u672c Python\uff08<=3.10\uff09\u517c\u5bb9\u5199\u6cd5<\/h3>\n<pre class=\"code-block\">try:\n    import tomllib\nexcept ModuleNotFoundError:\n    import tomli as tomllib\n\nwith open(\"config.toml\", \"rb\") as f:\n    cfg = tomllib.load(f)\n<\/pre>\n\n<h2 id=\"zh-write\">\u4e03\u3001Python \u5199\u5165\/\u4fee\u6539 TOML \u6587\u4ef6<\/h2>\n<p>\u5185\u7f6etomllib\u53ea\u652f\u6301\u8bfb\u53d6\uff0c\u5199\u5165\u9700\u8981 <code>tomli-w<\/code><\/p>\n<h3>7.1 \u5b89\u88c5\u5199\u5165\u5e93<\/h3>\n<pre class=\"terminal\">pip install tomli-w<\/pre>\n<h3>7.2 \u5168\u65b0\u5199\u5165 TOML<\/h3>\n<pre class=\"code-block\">import tomli_w\n\ndata = {\n    \"app\": {\"name\": \"\u65b0\u670d\u52a1\", \"debug\": False},\n    \"db\": {\"host\": \"127.0.0.1\", \"port\": 3306}\n}\n\n# wb \u4e8c\u8fdb\u5236\u5199\u5165\nwith open(\"new_config.toml\", \"wb\") as f:\n    tomli_w.dump(data, f)\n<\/pre>\n<h3>7.3 \u4fee\u6539\u5df2\u6709 TOML \u6587\u4ef6<\/h3>\n<pre class=\"code-block\">import tomllib\nimport tomli_w\n\n# 1.\u8bfb\u53d6\nwith open(\"config.toml\", \"rb\") as f:\n    cfg = tomllib.load(f)\n\n# 2.\u4fee\u6539\u5b57\u6bb5\ncfg[\"app\"][\"debug\"] = False\ncfg[\"db\"][\"port\"] = 3307\n\n# 3.\u5199\u56de\u539f\u6587\u4ef6\nwith open(\"config.toml\", \"wb\") as f:\n    tomli_w.dump(cfg, f)\n<\/pre>\n\n<h2 id=\"zh-pyproject\">\u516b\u3001\u6838\u5fc3\u5b9e\u6218\uff1apyproject.toml \u8be6\u89e3<\/h2>\n<p><code>pyproject.toml<\/code> \u662f\u73b0\u4ee3Python\u9879\u76ee\u6807\u51c6\u914d\u7f6e\u6587\u4ef6\uff0c\u6240\u6709\u5de5\u5177\u7edf\u4e00\u653e\u8fd9\u91cc\uff0c\u66ff\u4ee3\u591a\u4e2aini\/cfg\u3002<\/p>\n<pre class=\"code-block\">[build-system]\n# \u9879\u76ee\u6784\u5efa\u4f9d\u8d56\nrequires = [\"setuptools>=61.0\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[project]\n# \u9879\u76ee\u57fa\u7840\u5143\u6570\u636e\nname = \"python-demo\"\nversion = \"0.1.0\"\nauthors = [{ name = \"\u5f20\u4e09\", email = \"zhangsan@xxx.com\" }]\ndependencies = [\n    \"fastapi>=0.100\",\n    \"sqlalchemy>=2.0\"\n]\n\n[tool.ruff]\n# Ruff\u4ee3\u7801\u68c0\u67e5\u914d\u7f6e\nline-length = 88\nselect = [\"E\", \"W\", \"F\", \"I\"]\n\n[tool.pytest.ini_options]\n# pytest\u6d4b\u8bd5\u914d\u7f6e\ntestpaths = [\"tests\"]\n<\/pre>\n<div class=\"card\">\n  <h4>\u5e38\u7528\u5206\u6bb5\u8bf4\u660e<\/h4>\n  <p><span class=\"tag-b\">[build-system]<\/span> \u6253\u5305\u6784\u5efa\u5de5\u5177<\/p>\n  <p><span class=\"tag-g\">[project]<\/span> \u9879\u76ee\u540d\u79f0\u3001\u7248\u672c\u3001\u4f9d\u8d56\uff08PEP621\u6807\u51c6\uff09<\/p>\n  <p><span class=\"tag-y\">[tool.xxx]<\/span> \u5404\u7c7b\u7b2c\u4e09\u65b9\u5de5\u5177\u914d\u7f6e\uff08ruff\/pytest\/mypy\uff09<\/p>\n<\/div>\n\n<h2 id=\"zh-error\">\u4e5d\u3001\u5e38\u89c1\u62a5\u9519\u4e0e\u6392\u5751<\/h2>\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>\u62a5\u9519\u73b0\u8c61<\/th><th>\u6839\u56e0<\/th><th>\u89e3\u51b3\u65b9\u6848<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>tomllib.load() \u62a5\u7f16\u7801\u9519\u8bef<\/td>\n      <td>\u4f7f\u7528 r \u6587\u672c\u6a21\u5f0f\u6253\u5f00<\/td>\n      <td>\u5fc5\u987b open(path, \"rb\") \u4e8c\u8fdb\u5236<\/td>\n    <\/tr>\n    <tr>\n      <td>ModuleNotFoundError: tomllib<\/td>\n      <td>Python\u7248\u672c<3.11<\/td>\n      <td>\u5b89\u88c5tomli\uff0cimport tomli as tomllib<\/td>\n    <\/tr>\n    <tr>\n      <td>tomllib\u65e0dump\u65b9\u6cd5<\/td>\n      <td>\u5185\u7f6e\u5e93\u53ea\u53ef\u8bfb\u4e0d\u53ef\u5199<\/td>\n      <td>\u5b89\u88c5tomli-w\u505a\u5199\u5165<\/td>\n    <\/tr>\n    <tr>\n      TOMLParseError \u8bed\u6cd5\u89e3\u6790\u5931\u8d25<\/td>\n      <td>\u5b57\u7b26\u4e32\u5355\u5f15\u53f7\u3001\u6570\u7ec4\u9017\u53f7\u591a\u4f59<\/td>\n      <td>\u7edf\u4e00\u53cc\u5f15\u53f7\uff0c\u6570\u7ec4\u672b\u5c3e\u4e0d\u52a0\u9017\u53f7<\/td>\n    <\/tr>\n    <tr>\n      \u4e2d\u6587\u5199\u5165\u53d8\u6210\u8f6c\u4e49\u5b57\u7b26<\/td>\n      <td>tomli-w\u9ed8\u8ba4\u8f6c\u4e49<\/td>\n      <td>dump(data, f, multiline_strings=True)<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n\n<h2 id=\"zh-summary\">\u5341\u3001\u901f\u8bb0\u603b\u7ed3<\/h2>\n<div class=\"card\">\n  <h4>TOML + Python \u6838\u5fc3\u53e3\u8bc0<\/h4>\n  <p>1. \u540e\u7f00.toml\uff0c[table]\u5206\u6bb5\uff0c\u4e13\u4e3a\u9879\u76ee\u914d\u7f6e\u800c\u751f<\/p>\n  <p>2. Py3.11+\u5185\u7f6etomllib\uff0c\u53ea\u8bfb\u3001rb\u4e8c\u8fdb\u5236\u6253\u5f00<\/p>\n  <p>3. \u5199\u5165\u5fc5\u987b\u5b89\u88c5tomli-w\uff0cwb\u6a21\u5f0f\u5bfc\u51fa<\/p>\n  <p>4. \u73b0\u4ee3Python\u9879\u76ee\u6807\u914dpyproject.toml\u7edf\u4e00\u7ba1\u7406\u4f9d\u8d56\u4e0e\u5de5\u5177<\/p>\n  <p>5. \u5bf9\u6bd4YAML\uff1a\u65e0\u7f29\u8fdb\u5751\uff1b\u5bf9\u6bd4JSON\uff1a\u5206\u5c42\u6e05\u6670\u66f4\u6613\u7ef4\u62a4<\/p>\n<\/div>\n<div class=\"info-box\">\n  <strong>\u4f7f\u7528\u5efa\u8bae\uff1a<\/strong>\u65b0\u9879\u76ee\u7edf\u4e00\u4f7f\u7528 pyproject.toml \u7ba1\u7406\u6240\u6709\u914d\u7f6e\uff0c\u4e0d\u518d\u5206\u6563\u591a\u4e2aini\u3001yaml\u6587\u4ef6\u3002\n<\/div>\n<\/div>\n\n<!-- \u82f1\u6587\u533a\u57df -->\n<div class=\"lang-section\" id=\"lang-en\">\n<div class=\"hero\">\n  <h1>TOML File & Python Complete Guide<\/h1>\n  <p>What is TOML, syntax, tomllib\/tomli, read\/write, pyproject.toml, compare JSON\/YAML<\/p>\n<\/div>\n<div class=\"toc\">\n  <h3>Table of Contents<\/h3>\n  <ol>\n    <li><a href=\"#en-what\">1. What is TOML<\/a><\/li>\n    <li><a href=\"#en-scene\">2. Common Use Cases<\/a><\/li>\n    <li><a href=\"#en-compare\">3. TOML vs JSON vs YAML<\/a><\/li>\n    <li><a href=\"#en-syntax\">4. TOML Basic Syntax<\/a><\/li>\n    <li><a href=\"#en-lib\">5. Python TOML Libraries<\/a><\/li>\n    <li><a href=\"#en-read\">6. Read TOML with Python<\/a><\/li>\n    <li><a href=\"#en-write\">7. Write & Modify TOML<\/a><\/li>\n    <li><a href=\"#en-pyproject\">8. pyproject.toml Tutorial<\/a><\/li>\n    <li><a href=\"#en-error\">9. Common Errors & Fixes<\/a><\/li>\n    <li><a href=\"#en-summary\">10. Quick Summary<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<h2 id=\"en-what\">1. What is TOML<\/h2>\n<p>TOML = Tom's Obvious, Minimal Language, config file format with extension <code>.toml<\/code>.<\/p>\n<div class=\"info-box\">\n  <strong>Core Standard:<\/strong> PEP 621 defines <code>pyproject.toml<\/code> as official Python project config file.\n<\/div>\n<div class=\"card\">\n  <h4>TOML Features<\/h4>\n  <p><span class=\"tag-g\">[table] clear sections<\/span><\/p>\n  <p><span class=\"tag-b\">Native date, int, float, bool support<\/span><\/p>\n  <p><span class=\"tag-y\">No messy braces\/nested brackets like JSON<\/span><\/p>\n  <p><span class=\"tag-p\">Official Python standard<\/span><\/p>\n<\/div>\n\n<h2 id=\"en-scene\">2. Common Use Cases<\/h2>\n<ul style=\"margin-left:1.2rem;\">\n  <li>Python: pyproject.toml (dependencies, ruff, pytest)<\/li>\n  <li>Rust: Cargo.toml<\/li>\n  <li>uv \/ poetry \/ pdm package managers<\/li>\n  <li>Linter & formatter config (Ruff, Black)<\/li>\n<\/ul>\n\n<h2 id=\"en-compare\">3. TOML vs JSON vs YAML<\/h2>\n<p>JSON: data transmission, heavy nested braces.<\/p>\n<p>YAML: indent-sensitive, easy syntax error.<\/p>\n<p>TOML: dedicated for project config, section-based via [table], no indent bugs.<\/p>\n\n<h2 id=\"en-syntax\">4. Basic TOML Syntax<\/h2>\n<pre class=\"code-block\"># key-value\nname = \"demo\"\nport = 8000\n\n# table section\n[server]\nhost = \"127.0.0.1\"\n\n# nested table\n[db.mysql]\n\n# array\ntags = [\"python\", \"toml\"]\n<\/pre>\n\n<h2 id=\"en-lib\">5. Python Libraries<\/h2>\n<ul>\n  <li>Python 3.11+: built-in <code>tomllib<\/code> (read only, open with rb)<\/li>\n  <li>Python &lt;3.11: install <code>tomli<\/code>, same API<\/li>\n  <li>Write TOML: install <code>tomli-w<\/code><\/li>\n<\/ul>\n\n<h2 id=\"en-read\">6. Read TOML Example<\/h2>\n<pre class=\"code-block\">import tomllib\n\nwith open(\"config.toml\", \"rb\") as f:\n    data = tomllib.load(f)\n\nprint(data[\"server\"][\"port\"])\n<\/pre>\n\n<h2 id=\"en-write\">7. Write TOML Example<\/h2>\n<pre class=\"code-block\">import tomli_w\n\ndata = {\"server\": {\"port\": 8000}}\nwith open(\"out.toml\", \"wb\") as f:\n    tomli_w.dump(data, f)\n<\/pre>\n\n<h2 id=\"en-pyproject\">8. pyproject.toml Demo<\/h2>\n<pre class=\"code-block\">[project]\nname = \"demo\"\nversion = \"0.1.0\"\ndependencies = [\"fastapi\"]\n\n[tool.ruff]\nline-length = 88\n<\/pre>\n\n<h2 id=\"en-error\">9. Common Errors<\/h2>\n<ul>\n  <li>tomllib requires \"rb\" binary mode<\/li>\n  <li>No dump() in tomllib; use tomli-w<\/li>\n  <li>Old Python needs tomli package<\/li>\n<\/ul>\n\n<h2 id=\"en-summary\">10. Quick Cheat Sheet<\/h2>\n<p>.toml = section-based config file<\/p>\n<p>Read: tomllib \/ tomli (rb mode)<\/p>\n<p>Write: tomli-w (wb mode)<\/p>\n<p>Modern Python project uses pyproject.toml as single config entry<\/p>\n<\/div>\n<\/main>\n\n<footer>\n  <div class=\"links\">\n    <a href=\"https:\/\/toml.io\/\" target=\"_blank\" rel=\"noopener\">Official TOML Spec<\/a>\n    <a href=\"https:\/\/peps.python.org\/pep-0621\/\" target=\"_blank\" rel=\"noopener\">PEP621 pyproject.toml<\/a>\n    <a href=\"https:\/\/github.com\/hukkin\/tomli-w\" target=\"_blank\" rel=\"noopener\">tomli-w GitHub<\/a>\n  <\/div>\n  <p>TOML File & Python Complete Tutorial<\/p>\n<\/footer>\n\n<script>\nfunction setLang(lang){\n  document.querySelectorAll('.lang-section').forEach(el=>el.classList.remove('active'));\n  document.getElementById('lang-'+lang).classList.add('active');\n  document.querySelectorAll('.lang-switch button').forEach(btn=>btn.classList.remove('active'));\n  document.getElementById('btn-'+lang).classList.add('active');\n  document.document.lang = lang==='zh'?'zh-CN':'en';\n  const prefix = lang==='zh'?'zh':'en';\n  const newHash = window.location.hash.replace(\/^#(zh|en)-\/, prefix+\"-\");\n  if(newHash) window.location.hash = newHash;\n}\nfunction toggleTheme(){\n  const html = document.documentElement;\n  if(html.hasAttribute('data-theme')){\n    html.removeAttribute('data-theme');\n    localStorage.removeItem('theme');\n  }else{\n    html.setAttribute('data-theme','dark');\n    localStorage.setItem('dark');\n  }\n}\n(function(){\n  if(localStorage.getItem('theme')==='dark') document.documentElement.setAttribute('data-theme','dark');\n  const hash = window.location.hash;\n  if(hash){\n    const target = document.querySelector(hash);\n    if(target) setTimeout(()=>target.scrollIntoView({behavior:'smooth'}),100);\n  }\n})();\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>TOML \u6587\u4ef6 &#038; Python \u5b8c\u6574\u6559\u7a0b \u00b7 TOML Guide \ud83d\udcdc TOML &#038; P [&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-327","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\/327","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=327"}],"version-history":[{"count":1,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/327\/revisions"}],"predecessor-version":[{"id":328,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/327\/revisions\/328"}],"wp:attachment":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}