[{"data":1,"prerenderedAt":611},["ShallowReactive",2],{"navigation":3,"api-navigation":184,"\u002Flearn\u002Fhow-to\u002Flint-and-strict":206,"docyard:crossref-index":610},[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":118,"body":208,"description":251,"extension":605,"meta":606,"navigation":607,"path":119,"seo":608,"stem":120,"__hash__":609},"content\u002F2.learn\u002F3.how-to\u002F4.lint-and-strict.md",{"type":209,"value":210,"toc":597},"minimark",[211,215,234,242,245,277,296,303,308,313,340,345,361,366,458,462,472,510,516,536,542,557,593],[212,213,118],"h1",{"id":214},"lint-and-strict-mode",[216,217,218],"blockquote",{},[219,220,221,225,226,230,231],"p",{},[222,223,224],"strong",{},"See also:"," ",[227,228,229],"a",{"href":82},"Concepts: Lie-Typing",", ",[227,232,233],{"href":176},"API: compat",[235,236,238],"h2",{"id":237},"laco_strict_nodes",[239,240,241],"code",{},"LACO_STRICT_NODES",[219,243,244],{},"Set the environment variable to raise immediately if code treats a Laco node\nas if it were the real object:",[246,247,252],"pre",{"className":248,"code":249,"language":250,"meta":251,"style":251},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","LACO_STRICT_NODES=1 python train.py\n","bash","",[239,253,254],{"__ignoreMap":251},[255,256,259,262,266,270,274],"span",{"class":257,"line":258},"line",1,[255,260,241],{"class":261},"su5hD",[255,263,265],{"class":264},"smGrS","=",[255,267,269],{"class":268},"s_sjI","1",[255,271,273],{"class":272},"sbgvK"," python",[255,275,276],{"class":268}," train.py\n",[219,278,279,280,283,284,287,288,291,292,295],{},"Without this flag, accessing an attribute not present on a ",[239,281,282],{},"DictConfig","\nreturns the OmegaConf default (",[239,285,286],{},"???"," or raises ",[239,289,290],{},"MissingMandatoryValue",").\nWith it, attribute access on a node outside recognized config keys raises\n",[239,293,294],{},"AttributeError"," immediately with a helpful message.",[219,297,298,299,302],{},"Use ",[239,300,301],{},"LACO_STRICT_NODES=1"," in development; disable in production (it adds\noverhead on every attribute access).",[235,304,306],{"id":305},"laco-lint",[239,307,305],{},[219,309,310,312],{},[239,311,305],{}," is a static analysis tool that detects lie-typing violations:",[246,314,316],{"className":248,"code":315,"language":250,"meta":251,"style":251},"laco-lint sources\u002F           # lint all Python files under sources\u002F\nlaco-lint configs\u002Ftrain.py   # lint a single file\n",[239,317,318,329],{"__ignoreMap":251},[255,319,320,322,325],{"class":257,"line":258},[255,321,305],{"class":272},[255,323,324],{"class":268}," sources\u002F",[255,326,328],{"class":327},"sutJx","           # lint all Python files under sources\u002F\n",[255,330,332,334,337],{"class":257,"line":331},2,[255,333,305],{"class":272},[255,335,336],{"class":268}," configs\u002Ftrain.py",[255,338,339],{"class":327},"   # lint a single file\n",[341,342,344],"h3",{"id":343},"laco001","LACO001",[219,346,347,349,350,353,354,356,357,360],{},[239,348,344],{}," fires when a value annotated as a Laco node type (e.g.\n",[239,351,352],{},"LazyObject[T]",", a ",[239,355,282],{}," returned by ",[239,358,359],{},"L.call",") is used in a context\nthat requires the real object (attribute access, method call).",[219,362,363],{},[222,364,365],{},"Suppress intentionally:",[246,367,371],{"className":368,"code":369,"language":370,"meta":251,"style":251},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","node = L.call(nn.Linear)(784, 10)\n# Intentional: reading config metadata, not the nn.Linear interface\nsize = node._metadata[\"out_features\"]  # noqa: LACO001\n","python",[239,372,373,419,424],{"__ignoreMap":251},[255,374,375,378,380,383,387,391,394,397,399,403,406,410,413,416],{"class":257,"line":258},[255,376,377],{"class":261},"node ",[255,379,265],{"class":264},[255,381,382],{"class":261}," L",[255,384,386],{"class":385},"sP7_E",".",[255,388,390],{"class":389},"slqww","call",[255,392,393],{"class":385},"(",[255,395,396],{"class":389},"nn",[255,398,386],{"class":385},[255,400,402],{"class":401},"skxfh","Linear",[255,404,405],{"class":385},")(",[255,407,409],{"class":408},"srdBf","784",[255,411,412],{"class":385},",",[255,414,415],{"class":408}," 10",[255,417,418],{"class":385},")\n",[255,420,421],{"class":257,"line":331},[255,422,423],{"class":327},"# Intentional: reading config metadata, not the nn.Linear interface\n",[255,425,427,430,432,435,437,440,443,447,450,452,455],{"class":257,"line":426},3,[255,428,429],{"class":261},"size ",[255,431,265],{"class":264},[255,433,434],{"class":261}," node",[255,436,386],{"class":385},[255,438,439],{"class":401},"_metadata",[255,441,442],{"class":385},"[",[255,444,446],{"class":445},"sjJ54","\"",[255,448,449],{"class":268},"out_features",[255,451,446],{"class":445},[255,453,454],{"class":385},"]",[255,456,457],{"class":327},"  # noqa: LACO001\n",[235,459,461],{"id":460},"ci-integration","CI Integration",[219,463,464,465,467,468,471],{},"Add ",[239,466,305],{}," to your lint step alongside ",[239,469,470],{},"ruff",":",[246,473,477],{"className":474,"code":475,"language":476,"meta":251,"style":251},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark","# .github\u002Fworkflows\u002Flint.yml\n- run: |\n    ruff check sources\u002F\n    laco-lint sources\u002F\n","yaml",[239,478,479,484,499,504],{"__ignoreMap":251},[255,480,481],{"class":257,"line":258},[255,482,483],{"class":327},"# .github\u002Fworkflows\u002Flint.yml\n",[255,485,486,489,493,495],{"class":257,"line":331},[255,487,488],{"class":385},"-",[255,490,492],{"class":491},"sQzsp"," run",[255,494,471],{"class":385},[255,496,498],{"class":497},"sVHd0"," |\n",[255,500,501],{"class":257,"line":426},[255,502,503],{"class":268},"    ruff check sources\u002F\n",[255,505,507],{"class":257,"line":506},4,[255,508,509],{"class":268},"    laco-lint sources\u002F\n",[219,511,512,513,471],{},"Or in a ",[239,514,515],{},"Makefile",[246,517,521],{"className":518,"code":519,"language":520,"meta":251,"style":251},"language-makefile shiki shiki-themes material-theme-lighter github-light github-dark","lint:\n    ruff check sources\u002F\n    laco-lint sources\u002F\n","makefile",[239,522,523,528,532],{"__ignoreMap":251},[255,524,525],{"class":257,"line":258},[255,526,527],{},"lint:\n",[255,529,530],{"class":257,"line":331},[255,531,503],{},[255,533,534],{"class":257,"line":426},[255,535,509],{},[235,537,539],{"id":538},"laco_trace",[239,540,541],{},"LACO_TRACE",[219,543,544,545,548,549,552,553,556],{},"Set ",[239,546,547],{},"LACO_TRACE=1"," to log every ",[239,550,551],{},"laco.instantiate"," call with its full config\ntree (at ",[239,554,555],{},"INFO"," level). Useful for debugging instantiation order:",[246,558,560],{"className":248,"code":559,"language":250,"meta":251,"style":251},"LACO_TRACE=1 python train.py 2>&1 | grep \"Instantiating\"\n",[239,561,562],{"__ignoreMap":251},[255,563,564,566,568,570,572,575,578,581,584,587,590],{"class":257,"line":258},[255,565,541],{"class":261},[255,567,265],{"class":264},[255,569,269],{"class":268},[255,571,273],{"class":272},[255,573,574],{"class":268}," train.py",[255,576,577],{"class":264}," 2>&1",[255,579,580],{"class":264}," |",[255,582,583],{"class":272}," grep",[255,585,586],{"class":445}," \"",[255,588,589],{"class":268},"Instantiating",[255,591,592],{"class":445},"\"\n",[594,595,596],"style",{},"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 .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}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}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 .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}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}",{"title":251,"searchDepth":426,"depth":426,"links":598},[599,600,603,604],{"id":237,"depth":331,"text":241},{"id":305,"depth":331,"text":305,"children":601},[602],{"id":343,"depth":426,"text":344},{"id":460,"depth":331,"text":461},{"id":538,"depth":331,"text":541},"md",{},true,{"title":118,"description":251},"3VbegqksFnMa-M4_iOCafRF6e0YKSBp2CmWT9sxediI",{},1785687302897]