[{"data":1,"prerenderedAt":592},["ShallowReactive",2],{"navigation":3,"api-navigation":184,"\u002Flearn\u002Fhow-to\u002Fsafe-loading":206,"docyard:crossref-index":591},[4,8,155,174,180],{"title":5,"path":6,"stem":7},"Getting Started","\u002Fgetting-started","1.getting-started",{"title":9,"path":10,"stem":11,"children":12},"Learn","\u002Flearn","2.learn",[13,15,66,99,133],{"title":9,"path":10,"stem":14},"2.learn\u002Findex",{"title":16,"path":17,"stem":18,"children":19},"Tutorials","\u002Flearn\u002Ftutorials","2.learn\u002F1.tutorials\u002Findex",[20,21,26,30,34,38,42,46,50,54,58,62],{"title":16,"path":17,"stem":18},{"title":22,"path":23,"stem":24,"icon":25},"Why Laco?","\u002Flearn\u002Ftutorials\u002Fwhy-laco","2.learn\u002F1.tutorials\u002F01.why-laco","i-lucide-notebook",{"title":27,"path":28,"stem":29,"icon":25},"First Steps with Laco","\u002Flearn\u002Ftutorials\u002Ffirst-steps","2.learn\u002F1.tutorials\u002F02.first-steps",{"title":31,"path":32,"stem":33,"icon":25},"Lazy Call and Partial","\u002Flearn\u002Ftutorials\u002Flazy-call-and-partial","2.learn\u002F1.tutorials\u002F03.lazy-call-and-partial",{"title":35,"path":36,"stem":37,"icon":25},"Hyperparameters and Interpolation","\u002Flearn\u002Ftutorials\u002Fhyperparameters-and-interpolation","2.learn\u002F1.tutorials\u002F04.hyperparameters-and-interpolation",{"title":39,"path":40,"stem":41,"icon":25},"Loading, Saving, and the CLI","\u002Flearn\u002Ftutorials\u002Floading-saving-cli","2.learn\u002F1.tutorials\u002F05.loading-saving-cli",{"title":43,"path":44,"stem":45,"icon":25},"Nested Configs and Containers","\u002Flearn\u002Ftutorials\u002Fnested-configs-and-containers","2.learn\u002F1.tutorials\u002F06.nested-configs-and-containers",{"title":47,"path":48,"stem":49,"icon":25},"Typed Groups and Schemas","\u002Flearn\u002Ftutorials\u002Ftyped-groups-and-schemas","2.learn\u002F1.tutorials\u002F07.typed-groups-and-schemas",{"title":51,"path":52,"stem":53,"icon":25},"Pipeline Configs","\u002Flearn\u002Ftutorials\u002Fpipeline-configs","2.learn\u002F1.tutorials\u002F08.pipeline-configs",{"title":55,"path":56,"stem":57,"icon":25},"Tasks and the App Loop","\u002Flearn\u002Ftutorials\u002Ftasks-and-app-loop","2.learn\u002F1.tutorials\u002F09.tasks-and-app-loop",{"title":59,"path":60,"stem":61,"icon":25},"Tracing","\u002Flearn\u002Ftutorials\u002Ftracing","2.learn\u002F1.tutorials\u002F10.tracing",{"title":63,"path":64,"stem":65,"icon":25},"Production Patterns","\u002Flearn\u002Ftutorials\u002Fproduction-patterns","2.learn\u002F1.tutorials\u002F11.production-patterns",{"title":67,"path":68,"stem":69,"children":70},"Concepts","\u002Flearn\u002Fconcepts","2.learn\u002F2.concepts\u002Findex",[71,72,76,80,84,88,92,95],{"title":67,"path":68,"stem":69},{"title":73,"path":74,"stem":75},"Config as Python","\u002Flearn\u002Fconcepts\u002Fconfig-as-python","2.learn\u002F2.concepts\u002F1.config-as-python",{"title":77,"path":78,"stem":79},"Lazy Construction","\u002Flearn\u002Fconcepts\u002Flazy-construction","2.learn\u002F2.concepts\u002F2.lazy-construction",{"title":81,"path":82,"stem":83},"Lie-Typing","\u002Flearn\u002Fconcepts\u002Flie-typing","2.learn\u002F2.concepts\u002F3.lie-typing",{"title":85,"path":86,"stem":87},"Interpolation","\u002Flearn\u002Fconcepts\u002Finterpolation","2.learn\u002F2.concepts\u002F4.interpolation",{"title":89,"path":90,"stem":91},"Typed Groups","\u002Flearn\u002Fconcepts\u002Ftyped-groups","2.learn\u002F2.concepts\u002F5.typed-groups",{"title":59,"path":93,"stem":94},"\u002Flearn\u002Fconcepts\u002Ftracing","2.learn\u002F2.concepts\u002F6.tracing",{"title":96,"path":97,"stem":98},"App Loop","\u002Flearn\u002Fconcepts\u002Fapp-loop","2.learn\u002F2.concepts\u002F7.app-loop",{"title":100,"path":101,"stem":102,"children":103},"How-To Guides","\u002Flearn\u002Fhow-to","2.learn\u002F3.how-to\u002Findex",[104,105,109,113,117,121,125,129],{"title":100,"path":101,"stem":102},{"title":106,"path":107,"stem":108},"Override Configs","\u002Flearn\u002Fhow-to\u002Foverride-configs","2.learn\u002F3.how-to\u002F1.override-configs",{"title":110,"path":111,"stem":112},"Safe Loading","\u002Flearn\u002Fhow-to\u002Fsafe-loading","2.learn\u002F3.how-to\u002F2.safe-loading",{"title":114,"path":115,"stem":116},"Custom Resolvers","\u002Flearn\u002Fhow-to\u002Fcustom-resolvers","2.learn\u002F3.how-to\u002F3.custom-resolvers",{"title":118,"path":119,"stem":120},"Lint and Strict Mode","\u002Flearn\u002Fhow-to\u002Flint-and-strict","2.learn\u002F3.how-to\u002F4.lint-and-strict",{"title":122,"path":123,"stem":124},"Publishing a reproducible app with laco app","\u002Flearn\u002Fhow-to\u002Flaco-app","2.learn\u002F3.how-to\u002F5.laco-app",{"title":126,"path":127,"stem":128},"Reproduce an Experiment","\u002Flearn\u002Fhow-to\u002Freproduce-experiment","2.learn\u002F3.how-to\u002F6.reproduce-experiment",{"title":130,"path":131,"stem":132},"Migrate from argparse","\u002Flearn\u002Fhow-to\u002Fmigrate-from-argparse","2.learn\u002F3.how-to\u002F7.migrate-from-argparse",{"title":134,"path":135,"stem":136,"children":137},"Examples Curriculum","\u002Flearn\u002Fexamples","2.learn\u002F4.examples\u002Findex",[138,139,143,147,151],{"title":134,"path":135,"stem":136},{"title":140,"path":141,"stem":142},"Foundation Examples","\u002Flearn\u002Fexamples\u002Ffoundations","2.learn\u002F4.examples\u002F1.foundations",{"title":144,"path":145,"stem":146},"Building Blocks","\u002Flearn\u002Fexamples\u002Fbuilding-blocks","2.learn\u002F4.examples\u002F2.building-blocks",{"title":148,"path":149,"stem":150},"Typed-Group Variants","\u002Flearn\u002Fexamples\u002Ftyped-variants","2.learn\u002F4.examples\u002F3.typed-variants",{"title":152,"path":153,"stem":154},"End-to-End Pipelines","\u002Flearn\u002Fexamples\u002Fpipelines","2.learn\u002F4.examples\u002F4.pipelines",{"title":156,"path":157,"stem":158,"children":159},"Resources","\u002Fresources","3.resources",[160,162,166,170],{"title":156,"path":157,"stem":161},"3.resources\u002Findex",{"title":163,"path":164,"stem":165},"Integrations","\u002Fresources\u002Fintegrations","3.resources\u002F1.integrations",{"title":167,"path":168,"stem":169},"Migration guide: Laco 0.x → 1.0","\u002Fresources\u002Fmigration-0.x-to-1.0","3.resources\u002F2.migration-0.x-to-1.0",{"title":171,"path":172,"stem":173},"Laco vs hydra-zen","\u002Fresources\u002Flaco-vs-hydra-zen","3.resources\u002F3.laco-vs-hydra-zen",{"title":175,"path":176,"stem":177,"children":178},"API Reference","\u002Fapi","4.api\u002Findex",[179],{"title":175,"path":176,"stem":177},{"title":181,"path":182,"stem":183},"Lazy Configuration for Python","\u002F","index",[185,188,191,194,197,200,203],{"title":186,"path":187},"cli","\u002Fapi\u002Fcli",{"title":189,"path":190},"compat","\u002Fapi\u002Fcompat",{"title":192,"path":193},"handler","\u002Fapi\u002Fhandler",{"title":195,"path":196},"keys","\u002Fapi\u002Fkeys",{"title":198,"path":199},"language","\u002Fapi\u002Flanguage",{"title":201,"path":202},"ops","\u002Fapi\u002Fops",{"title":204,"path":205},"utils","\u002Fapi\u002Futils",{"id":207,"title":110,"body":208,"description":265,"extension":587,"meta":588,"navigation":286,"path":111,"seo":589,"stem":112,"__hash__":590},"content\u002F2.learn\u002F3.how-to\u002F2.safe-loading.md",{"type":209,"value":210,"toc":577},"minimark",[211,215,234,239,255,259,349,356,388,398,402,422,448,452,549,553,563,567,573],[212,213,110],"h1",{"id":214},"safe-loading",[216,217,218],"blockquote",{},[219,220,221,225,226,230,231],"p",{},[222,223,224],"strong",{},"See also:"," ",[227,228,229],"a",{"href":176},"API: laco.load \u002F LoadMode",", ",[227,232,233],{"href":74},"Concepts: Config as Python",[235,236,238],"h2",{"id":237},"when-to-use-safe-loading","When to Use Safe Loading",[219,240,241,242,246,247,250,251,254],{},"Config files are Python code. If you load configs from an untrusted source\n(external contributor, downloaded dataset config, CI artefact), a malicious\nconfig could import ",[243,244,245],"code",{},"os"," and call ",[243,248,249],{},"os.system",". ",[243,252,253],{},"LoadMode.SAFE"," prevents this.",[235,256,258],{"id":257},"basic-usage","Basic Usage",[260,261,266],"pre",{"className":262,"code":263,"language":264,"meta":265,"style":265},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","import laco\n\ncfg = laco.load(\"external_config.py\", mode=laco.LoadMode.SAFE)\n","python","",[243,267,268,281,288],{"__ignoreMap":265},[269,270,273,277],"span",{"class":271,"line":272},"line",1,[269,274,276],{"class":275},"sVHd0","import",[269,278,280],{"class":279},"su5hD"," laco\n",[269,282,284],{"class":271,"line":283},2,[269,285,287],{"emptyLinePlaceholder":286},true,"\n",[269,289,291,294,298,301,305,309,312,316,320,322,325,329,331,334,336,340,342,346],{"class":271,"line":290},3,[269,292,293],{"class":279},"cfg ",[269,295,297],{"class":296},"smGrS","=",[269,299,300],{"class":279}," laco",[269,302,304],{"class":303},"sP7_E",".",[269,306,308],{"class":307},"slqww","load",[269,310,311],{"class":303},"(",[269,313,315],{"class":314},"sjJ54","\"",[269,317,319],{"class":318},"s_sjI","external_config.py",[269,321,315],{"class":314},[269,323,324],{"class":303},",",[269,326,328],{"class":327},"s99_P"," mode",[269,330,297],{"class":296},[269,332,333],{"class":307},"laco",[269,335,304],{"class":303},[269,337,339],{"class":338},"skxfh","LoadMode",[269,341,304],{"class":303},[269,343,345],{"class":344},"swQdS","SAFE",[269,347,348],{"class":303},")\n",[235,350,352,353,355],{"id":351},"what-loadmodesafe-removes","What ",[243,354,253],{}," Removes",[357,358,359,385],"ul",{},[360,361,362,363,230,366,230,369,230,372,230,375,230,378,381,382],"li",{},"Dangerous builtins: ",[243,364,365],{},"open",[243,367,368],{},"eval",[243,370,371],{},"exec",[243,373,374],{},"compile",[243,376,377],{},"globals",[243,379,380],{},"locals",",\n",[243,383,384],{},"breakpoint",[360,386,387],{},"All module imports not in the allowlist",[219,389,390,391,394,395,304],{},"Attempting to use a forbidden builtin raises ",[243,392,393],{},"NameError","; importing a\ndisallowed module raises ",[243,396,397],{},"ImportError",[235,399,401],{"id":400},"default-allowlist","Default Allowlist",[260,403,405],{"className":262,"code":404,"language":264,"meta":265,"style":265},"laco.DEFAULT_SAFE_ALLOWED_MODULES\n# (\"laco\", \"omegaconf\", \"torch\", \"torch.nn\")\n",[243,406,407,416],{"__ignoreMap":265},[269,408,409,411,413],{"class":271,"line":272},[269,410,333],{"class":279},[269,412,304],{"class":303},[269,414,415],{"class":344},"DEFAULT_SAFE_ALLOWED_MODULES\n",[269,417,418],{"class":271,"line":283},[269,419,421],{"class":420},"sutJx","# (\"laco\", \"omegaconf\", \"torch\", \"torch.nn\")\n",[219,423,424,425,428,429,432,433,436,437,440,441,444,445,304],{},"A module name ",[243,426,427],{},"N"," is allowed if ",[243,430,431],{},"N == entry"," or ",[243,434,435],{},"N.startswith(entry + \".\")","\nfor any ",[243,438,439],{},"entry"," in the allowlist. So ",[243,442,443],{},"\"torch\""," in the allowlist permits\n",[243,446,447],{},"import torch.nn.functional",[235,449,451],{"id":450},"widening-the-allowlist","Widening the Allowlist",[260,453,455],{"className":262,"code":454,"language":264,"meta":265,"style":265},"cfg = laco.load(\n    \"external_config.py\",\n    mode=laco.LoadMode.SAFE,\n    allowed_modules=(*laco.DEFAULT_SAFE_ALLOWED_MODULES, \"numpy\", \"my_project\"),\n)\n",[243,456,457,472,483,502,544],{"__ignoreMap":265},[269,458,459,461,463,465,467,469],{"class":271,"line":272},[269,460,293],{"class":279},[269,462,297],{"class":296},[269,464,300],{"class":279},[269,466,304],{"class":303},[269,468,308],{"class":307},[269,470,471],{"class":303},"(\n",[269,473,474,477,479,481],{"class":271,"line":283},[269,475,476],{"class":314},"    \"",[269,478,319],{"class":318},[269,480,315],{"class":314},[269,482,381],{"class":303},[269,484,485,488,490,492,494,496,498,500],{"class":271,"line":290},[269,486,487],{"class":327},"    mode",[269,489,297],{"class":296},[269,491,333],{"class":307},[269,493,304],{"class":303},[269,495,339],{"class":338},[269,497,304],{"class":303},[269,499,345],{"class":344},[269,501,381],{"class":303},[269,503,505,508,510,512,515,517,519,522,524,527,530,532,534,536,539,541],{"class":271,"line":504},4,[269,506,507],{"class":327},"    allowed_modules",[269,509,297],{"class":296},[269,511,311],{"class":303},[269,513,514],{"class":296},"*",[269,516,333],{"class":307},[269,518,304],{"class":303},[269,520,521],{"class":344},"DEFAULT_SAFE_ALLOWED_MODULES",[269,523,324],{"class":303},[269,525,526],{"class":314}," \"",[269,528,529],{"class":318},"numpy",[269,531,315],{"class":314},[269,533,324],{"class":303},[269,535,526],{"class":314},[269,537,538],{"class":318},"my_project",[269,540,315],{"class":314},[269,542,543],{"class":303},"),\n",[269,545,547],{"class":271,"line":546},5,[269,548,348],{"class":303},[235,550,552],{"id":551},"yaml-files","YAML Files",[219,554,555,556,558,559,562],{},"YAML configs loaded with ",[243,557,253],{}," apply the same allowlist to\n",[243,560,561],{},"!!python\u002Fname:module.Class"," tags. Class references that resolve outside the\nallowlist are rejected.",[235,564,566],{"id":565},"default-mode","Default Mode",[219,568,569,572],{},[243,570,571],{},"LoadMode.NORMAL"," (the default) applies no allowlist and preserves all\nbuiltins. Use it for configs you author and control.",[574,575,576],"style",{},"html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .slqww, html code.shiki .slqww{--shiki-light:#6182B8;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .swQdS, html code.shiki .swQdS{--shiki-light:#E53935;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}",{"title":265,"searchDepth":290,"depth":290,"links":578},[579,580,581,583,584,585,586],{"id":237,"depth":283,"text":238},{"id":257,"depth":283,"text":258},{"id":351,"depth":283,"text":582},"What LoadMode.SAFE Removes",{"id":400,"depth":283,"text":401},{"id":450,"depth":283,"text":451},{"id":551,"depth":283,"text":552},{"id":565,"depth":283,"text":566},"md",{},{"title":110,"description":265},"cxCC43T5lkwc2Jrk7mjyfe-ONg_WGBkkAFNWrIR4SIQ",{},1785687302755]