[{"data":1,"prerenderedAt":1209},["ShallowReactive",2],{"/py":3,"/py-surround":1199},{"id":4,"title":5,"body":6,"description":1173,"extension":1174,"meta":1175,"navigation":1192,"path":1196,"seo":1197,"stem":58,"__hash__":1198},"content/py.md","Python Extension",{"type":7,"value":8,"toc":1127},"minimark",[9,22,32,36,69,112,115,315,330,336,339,349,352,363,366,373,383,397,411,420,427,497,506,648,701,755,807,892,944],[10,11,15],"h1",{"id":12,"className":13},"python",[14],"section-heading",[16,17,21],"a",{"className":18,"href":20},[19],"section-anchor","#python","Python",[23,24,27],"h2",{"id":25,"className":26},"using",[14],[16,28,31],{"className":29,"href":30},[19],"#using","Using",[33,34,35],"p",{},"As with all NetLogo extensions, you must declare that you’re using this extension in your NetLogo code with:",[37,38,39],"pre",{},[40,41,42,49,50,53,54,59,53,61,66,68],"code",{},[43,44,48],"span",{"className":45},[46,47],"token","keyword","extensions"," [",[51,52],"br",{},"  ",[43,55,58],{"className":56},[46,57],"variable","py",[51,60],{},[43,62,65],{"className":63},[46,64],"comment","; ... your other extensions",[51,67],{},"]",[33,70,71,72,83,84,87,88,91,92,95,96,98,99,102,103,106,107,111],{},"The general workflow of this extension is to run ",[40,73,74,78,79],{},[43,75,77],{"className":76},[46,57],"py:setup"," ",[43,80,82],{"className":81},[46,57],"py:python"," to initialize the Python session that NetLogo will talk to, and then use ",[40,85,86],{},"py:run",", ",[40,89,90],{},"py:runresult",", and ",[40,93,94],{},"py:set"," to interact with that Python session.\nBy default, ",[40,97,82],{}," will report the latest version of Python that the extension finds on your system.\nYou can also use ",[40,100,101],{},"py:python3"," or ",[40,104,105],{},"py:python2"," to use Python 3 or 2 specifically.\nSee the ",[16,108,110],{"href":109},"#configuring","Configuring"," section below to specify exactly which Python installations to use.",[33,113,114],{},"Here’s an example to get you started:",[37,116,117],{},[40,118,119,78,123,78,126,129,131,78,134,78,139,78,142,147,149,78,153,158,160,78,163,78,166,170,172,176,178,78,181,78,184,188,190,78,193,78,196,78,199,203,205,49,208,78,212,78,215,78,218,78,222,78,226,78,230,78,234,78,238,78,242,68,246,248,78,251,78,254,258,259,264,265,78,269,273,275,78,278,78,281,78,284,288,290,78,293,297,299,78,302,78,305,309,311],{},[43,120,122],{"className":121},[46,57],"observer>",[43,124,77],{"className":125},[46,57],[43,127,82],{"className":128},[46,57],[51,130],{},[43,132,122],{"className":133},[46,57],[43,135,138],{"className":136},[46,137],"command","show",[43,140,90],{"className":141},[46,57],[43,143,146],{"className":144},[46,145],"string","\"1 + 1\"",[51,148],{},[43,150,152],{"className":151},[46,57],"observer:",[43,154,157],{"className":155},[46,156],"number","2",[51,159],{},[43,161,122],{"className":162},[46,57],[43,164,86],{"className":165},[46,57],[43,167,169],{"className":168},[46,145],"\"print('hi')\"",[51,171],{},[43,173,175],{"className":174},[46,57],"hi",[51,177],{},[43,179,122],{"className":180},[46,57],[43,182,86],{"className":183},[46,57],[43,185,187],{"className":186},[46,145],"\"import math\"",[51,189],{},[43,191,122],{"className":192},[46,57],[43,194,138],{"className":195},[46,137],[43,197,90],{"className":198},[46,57],[43,200,202],{"className":201},[46,145],"\"[math.factorial(i) for i in range(10)]\"",[51,204],{},[43,206,152],{"className":207},[46,57],[43,209,211],{"className":210},[46,156],"1",[43,213,211],{"className":214},[46,156],[43,216,157],{"className":217},[46,156],[43,219,221],{"className":220},[46,156],"6",[43,223,225],{"className":224},[46,156],"24",[43,227,229],{"className":228},[46,156],"120",[43,231,233],{"className":232},[46,156],"720",[43,235,237],{"className":236},[46,156],"5040",[43,239,241],{"className":240},[46,156],"40320",[43,243,245],{"className":244},[46,156],"362880",[51,247],{},[43,249,122],{"className":250},[46,57],[43,252,94],{"className":253},[46,57],[43,255,257],{"className":256},[46,145],"\"patch_xs\""," [ ",[43,260,263],{"className":261},[46,262],"reporter","pxcor"," ] ",[43,266,268],{"className":267},[46,262],"of",[43,270,272],{"className":271},[46,262],"patches",[51,274],{},[43,276,122],{"className":277},[46,57],[43,279,138],{"className":280},[46,137],[43,282,90],{"className":283},[46,57],[43,285,287],{"className":286},[46,145],"\"max(patch_xs)\"",[51,289],{},[43,291,152],{"className":292},[46,57],[43,294,296],{"className":295},[46,156],"16",[51,298],{},[43,300,122],{"className":301},[46,57],[43,303,86],{"className":304},[46,57],[43,306,308],{"className":307},[46,145],"\"print(min(patch_xs))\"",[51,310],{},[43,312,314],{"className":313},[46,156],"-16",[33,316,317,318,321,322,325,326,329],{},"See the documentation for each of the particular primitives for details on, for instance, how to multi-line statements and how object type conversions work.\nSee the demo models included in the ",[40,319,320],{},"demo"," folder for some examples of using libraries such as ",[40,323,324],{},"numpy"," and ",[40,327,328],{},"tensorflow",".",[33,331,332,333,335],{},"See the documentation on ",[40,334,94],{}," to learn how to have the extension serialize entire agents and agentsets into Python dictionaries.",[33,337,338],{},"There is also a separate interactive Python console that can be found under Python > Interactive Python Console.\nThis console is connected to the same Python session as all the Python NetLogo primitives, so you can define a variable in your model and access it in the interactive Python console window.",[340,341,344],"h3",{"id":342,"className":343},"error-handling",[14],[16,345,348],{"className":346,"href":347},[19],"#error-handling","Error handling",[33,350,351],{},"Python errors will be reported in NetLogo as “Extension exceptions”. For instance, this code:",[37,353,354],{},[40,355,356,78,359],{},[43,357,86],{"className":358},[46,57],[43,360,362],{"className":361},[46,145],"\"raise Exception('hi')\"",[33,364,365],{},"will result in the NetLogo error “Extension exception: hi”.\nTo see the Python stack trace of the exception, click “Show internal details”.\nIf you then scroll down, you will find the Python stack trace in the middle of the Java stack trace.",[23,367,370],{"id":368,"className":369},"configuring",[14],[16,371,110],{"className":372,"href":109},[19],[33,374,375,376,87,378,91,380,382],{},"By default, the ",[40,377,105],{},[40,379,101],{},[40,381,82],{}," commands will attempt to find a Python executable of the appropriate version.\nIf you’d like to change which Python executable they use, or they can’t find a Python executable, you should configure which Python executables to use.\nYou can do this by either:",[384,385,386,390],"ul",{},[387,388,389],"li",{},"Using the configuration menu under the Python toolbar menu that appears when you use a model that uses the Python extension.",[387,391,392,393,396],{},"Editing the ",[40,394,395],{},"python.properties"," file that appears in the Python extension installation folder as follows:",[37,398,399],{},[40,400,401,405,407],{},[43,402,404],{"className":403},[46,57],"python3=/path/to/python3",[51,406],{},[43,408,410],{"className":409},[46,57],"python2=/path/to/python2",[23,412,415],{"id":413,"className":414},"primitives",[14],[16,416,419],{"className":417,"href":418},[19],"#primitives","Primitives",[33,421,422,423,329],{},"Looking for the primitive reference for the Python extension? You can find ",[16,424,426],{"href":425},"/py/dictionary","the full reference here",[428,429,433,434,440,441,446,447,440,452,446,455,440,461,446,464,440,470,446,473,440,479,446,482,440,488,446,491],"div",{"id":430,"className":431},"all",[432],"prose","\n  ",[16,435,438],{"className":436,"href":437},[40],"#setup",[40,439,77],{},"\n   ",[43,442,445],{"className":443},[444],"font-bold"," · "," \n  ",[16,448,450],{"className":449,"href":20},[40],[40,451,82],{},[43,453,445],{"className":454},[444],[16,456,459],{"className":457,"href":458},[40],"#python2",[40,460,105],{},[43,462,445],{"className":463},[444],[16,465,468],{"className":466,"href":467},[40],"#python3",[40,469,101],{},[43,471,445],{"className":472},[444],[16,474,477],{"className":475,"href":476},[40],"#run",[40,478,86],{},[43,480,445],{"className":481},[444],[16,483,486],{"className":484,"href":485},[40],"#runresult",[40,487,90],{},[43,489,445],{"className":490},[444],[16,492,495],{"className":493,"href":494},[40],"#set",[40,496,94],{},[340,498,501],{"id":499,"className":500},"all-primitives",[14],[16,502,505],{"className":503,"href":504},[19],"#all-primitives","All Primitives",[428,507,433,511,433,517,535,543,546,549,587,592,620,623,634,637],{"className":508,"id":510},[509],"dict_entry","setup",[340,512,514,515,433],{"id":513},"pysetup","\n    ",[16,516,77],{"href":437},[518,519,522],"h4",{"id":520,"className":521},"pysetup-python-executable",[14],[16,523,514,526,433],{"className":524,"href":525},[19],"#----pysetup-python-executable--",[43,527,530,531],{"className":528},[529],"prim_example","py:setup ",[532,533,534],"i",{},"python-executable",[33,536,537,538,542],{},"Create the Python session that this extension will use to execute code. The session will be started with the given Python executable. This command ",[539,540,541],"em",{},"must"," be run before running any other Python extension primitive. Running this command again will shutdown the current Python environment and start a new one.",[33,544,545],{},"The executable may be specified as a relative path, absolute path, or just the executable name if it is on your PATH.\nFurthermore, this extension offers a few helper primitives for getting particular versions of Python in system\nindependent ways.",[33,547,548],{},"In general, unless working with a virtual environment or a specific system setup, you should do:",[37,550,551],{},[40,552,553,78,556,53,559,563,565,78,568,78,571,575,577,78,580,78,583],{},[43,554,77],{"className":555},[46,57],[43,557,82],{"className":558},[46,57],[43,560,562],{"className":561},[46,64],"; if your code works with either Python 2 or 3",[51,564],{},[43,566,77],{"className":567},[46,57],[43,569,101],{"className":570},[46,57],[43,572,574],{"className":573},[46,64],"; for Python 3",[51,576],{},[43,578,77],{"className":579},[46,57],[43,581,105],{"className":582},[46,57],[43,584,586],{"className":585},[46,64],"; for Python 2",[33,588,589,591],{},[40,590,77],{}," may be invoked by directly referring to different Pythons as well. For instance:",[37,593,594],{},[40,595,596,78,599,78,603,607,609,78,612,53,616],{},[43,597,77],{"className":598},[46,57],[43,600,602],{"className":601},[46,145],"\"python3\"",[43,604,606],{"className":605},[46,64],"; if `python3` is on your PATH",[51,608],{},[43,610,77],{"className":611},[46,57],[43,613,615],{"className":614},[46,145],"\"python\"",[43,617,619],{"className":618},[46,64],"; if `python` is on your PATH",[33,621,622],{},"If you use virtualenv or Conda, simply specify the path of the Python executable in the environment you wish to use:",[37,624,625],{},[40,626,627,78,630],{},[43,628,77],{"className":629},[46,57],[43,631,633],{"className":632},[46,145],"\"/path/to/myenv/bin/python\"",[33,635,636],{},"The path may be relative or absolute. So, if you have a virtual environment in the same folder as your model, you can do:",[37,638,639],{},[40,640,641,78,644],{},[43,642,77],{"className":643},[46,57],[43,645,647],{"className":646},[46,145],"\"myenv/bin/python\"",[428,649,433,651,433,656,667,676,679],{"className":650,"id":12},[509],[340,652,514,654,433],{"id":653},"pypython",[16,655,82],{"href":20},[518,657,660],{"id":658,"className":659},"pypython-1",[14],[16,661,514,664,433],{"className":662,"href":663},[19],"#----pypython---1",[43,665,82],{"className":666},[529],[33,668,669,670,672,673,675],{},"Reports either the path to the latest version of Python configured in the ",[40,671,395],{}," file or, if that is blank, looks for a Python executable on your system’s PATH.\nFor Windows, there is an installation option for including Python on your PATH.\nFor MacOS and Linux, it will likely already be on your PATH.\nThe output of this reporter is meant to be used with ",[40,674,77],{},", but you may also use it to see which Python installation this extension will use by default.",[33,677,678],{},"For example, on MacOS with Homebrew installed Python 3:",[37,680,681],{},[40,682,683,78,686,78,689,692,694,78,697],{},[43,684,122],{"className":685},[46,57],[43,687,138],{"className":688},[46,137],[43,690,82],{"className":691},[46,57],[51,693],{},[43,695,152],{"className":696},[46,57],[43,698,700],{"className":699},[46,145],"\"/usr/local/bin/python3\"",[428,702,433,705,433,710,721,730,733],{"className":703,"id":704},[509],"python2",[340,706,514,708,433],{"id":707},"pypython2",[16,709,105],{"href":458},[518,711,714],{"id":712,"className":713},"pypython2-1",[14],[16,715,514,718,433],{"className":716,"href":717},[19],"#----pypython2---1",[43,719,105],{"className":720},[529],[33,722,723,724,726,727,729],{},"Reports either the path to Python 2 configured in the ",[40,725,395],{}," file or, if that is blank, looks for a Python 2 executable on your system’s PATH.\nFor Windows, there is an installation option for including Python on your PATH.\nFor MacOS and Linux, it will likely already be on your PATH.\nThe output of this reporter is meant to be used with ",[40,728,77],{},", but you may also use it to see which Python 2 installation this extension will use by default.",[33,731,732],{},"For example, on MacOS with Homebrew installed Python 2:",[37,734,735],{},[40,736,737,78,740,78,743,746,748,78,751],{},[43,738,122],{"className":739},[46,57],[43,741,138],{"className":742},[46,137],[43,744,105],{"className":745},[46,57],[51,747],{},[43,749,152],{"className":750},[46,57],[43,752,754],{"className":753},[46,145],"\"/usr/local/bin/python2\"",[428,756,433,759,433,764,775,784,786],{"className":757,"id":758},[509],"python3",[340,760,514,762,433],{"id":761},"pypython3",[16,763,101],{"href":467},[518,765,768],{"id":766,"className":767},"pypython3-1",[14],[16,769,514,772,433],{"className":770,"href":771},[19],"#----pypython3---1",[43,773,101],{"className":774},[529],[33,776,777,778,780,781,783],{},"Reports either the path to Python 3 configured in the ",[40,779,395],{}," file or, if that is blank, looks for a Python 3 executable on your system’s PATH.\nFor Windows, there is an installation option for including Python on your PATH.\nFor MacOS and Linux, it will likely already be on your PATH.\nThe output of this reporter is meant to be used with ",[40,782,77],{},", but you may also use it to see which Python 3 installation this extension will use by default.",[33,785,678],{},[37,787,788],{},[40,789,790,78,793,78,796,799,801,78,804],{},[43,791,122],{"className":792},[46,57],[43,794,138],{"className":795},[46,137],[43,797,101],{"className":798},[46,57],[51,800],{},[43,802,152],{"className":803},[46,57],[43,805,700],{"className":806},[46,145],[428,808,433,811,433,816,831,834,887],{"className":809,"id":810},[509],"run",[340,812,514,814,433],{"id":813},"pyrun",[16,815,86],{"href":476},[518,817,820],{"id":818,"className":819},"pyrun-python-statement",[14],[16,821,514,824,433],{"className":822,"href":823},[19],"#----pyrun-python-statement--",[43,825,827,828],{"className":826},[529],"py:run ",[532,829,830],{},"python-statement",[33,832,833],{},"Runs the given Python statements in the current Python session. To make multi-line Python code easier to run, this command will take multiple strings, each of which will be interpreted as a separate line of Python code. For instance:",[37,835,836],{},[40,837,838,839,842,53,844,848,53,850,854,53,856,860,53,862,866,53,868,872,53,874,878,53,880,884,886],{},"(",[43,840,86],{"className":841},[46,57],[51,843],{},[43,845,847],{"className":846},[46,145],"\"import matplotlib\"",[51,849],{},[43,851,853],{"className":852},[46,145],"\"matplotlib.use('TkAgg')\"",[51,855],{},[43,857,859],{"className":858},[46,145],"\"import numpy as np\"",[51,861],{},[43,863,865],{"className":864},[46,145],"\"import matplotlib.pyplot as plt\"",[51,867],{},[43,869,871],{"className":870},[46,145],"\"for i in range(10):\"",[51,873],{},[43,875,877],{"className":876},[46,145],"\"    plt.plot([ x ** i for x in np.arange(-1, 1, 0.1) ])\"",[51,879],{},[43,881,883],{"className":882},[46,145],"\"plt.show()\"",[51,885],{},")",[33,888,889,891],{},[40,890,86],{}," will wait for the statements to finish running before continuing. Thus, if you have long running Python code, NetLogo will pause while it runs.",[428,893,433,896,433,901,916,930],{"className":894,"id":895},[509],"runresult",[340,897,514,899,433],{"id":898},"pyrunresult",[16,900,90],{"href":485},[518,902,905],{"id":903,"className":904},"pyrunresult-python-expression",[14],[16,906,514,909,433],{"className":907,"href":908},[19],"#----pyrunresult-python-expression--",[43,910,912,913],{"className":911},[529],"py:runresult ",[532,914,915],{},"python-expression",[33,917,918,919,921,922,925,926,929],{},"Evaluates the given Python expression and reports the result.\n",[40,920,90],{}," attempts to convert from Python data types to NetLogo data types.\nNumbers, strings, and booleans convert as you would expect.\nAny list-like object in Python (that is, anything with a length that you can iterate through) will be converted to a NetLogo list.\nFor instance, Python lists and NumPy arrays will convert to NetLogo lists.\nPython dicts (and dict-like objects) will convert to a NetLogo list of key-value pairs (where each pair is represented as a list).\n",[40,923,924],{},"None"," will be converted to ",[40,927,928],{},"nobody",".\nOther objects will simply be converted to a string representation.",[33,931,932,933,939,940,943],{},"Note that due a ",[16,934,938],{"href":935,"rel":936},"https://github.com/qiemem/PythonExtension/issues/6",[937],"nofollow","current issue",", dict keys will always be reported as strings.\nIf you need to report non-string keys, report the ",[40,941,942],{},".items()"," of the dict instead of the dict itself.",[428,945,433,948,433,953,971,974,977,1013,1016,1124],{"className":946,"id":947},[509],"set",[340,949,514,951,433],{"id":950},"pyset",[16,952,94],{"href":494},[518,954,957],{"id":955,"className":956},"pyset-variable-name-value",[14],[16,958,514,961,433],{"className":959,"href":960},[19],"#----pyset-variable-name-value--",[43,962,964,965,78,968],{"className":963},[529],"py:set ",[532,966,967],{},"variable-name",[532,969,970],{},"value",[33,972,973],{},"Sets a variable in the Python session with the given name to the given NetLogo value. NetLogo objects will be converted to Python objects as expected.",[33,975,976],{},"All vanilla NetLogo objects are supported, but objects from other extensions, even other bundled extensions, are not supported.",[37,978,979],{},[40,980,981,78,984,49,988,78,991,78,994,68,998,1000,78,1003,78,1006,78,1009],{},[43,982,94],{"className":983},[46,57],[43,985,987],{"className":986},[46,145],"\"x\"",[43,989,211],{"className":990},[46,156],[43,992,157],{"className":993},[46,156],[43,995,997],{"className":996},[46,156],"3",[51,999],{},[43,1001,138],{"className":1002},[46,137],[43,1004,90],{"className":1005},[46,57],[43,1007,987],{"className":1008},[46,145],[43,1010,1012],{"className":1011},[46,64],";; Shows [1 2 3]",[33,1014,1015],{},"Agents are converted into dictionaries with elements for each agent variable. Agentsets are converted into lists of agent dictionaries.",[37,1017,1018],{},[40,1019,1020,49,1024,78,1028,68,1032,49,1038,1042,1043,1045,78,1049,258,1052,78,1055,78,1059,78,1063,78,1066,78,1070,1042,1074,1076,78,1080,78,1083,258,1086,78,1089,78,1092,1042,1096,1098,78,1101,78,1105,78,1108,1111,1113,78,1116,78,1120],{},[43,1021,1023],{"className":1022},[46,47],"breed",[43,1025,1027],{"className":1026},[46,57],"goats",[43,1029,1031],{"className":1030},[46,57],"goat",[43,1033,1035,1037],{"className":1034},[46,47],[51,1036],{},"goats-own",[43,1039,1041],{"className":1040},[46,57],"energy"," ]",[51,1044],{},[43,1046,1048],{"className":1047},[46,57],"create-goats",[43,1050,211],{"className":1051},[46,156],[43,1053,947],{"className":1054},[46,137],[43,1056,1058],{"className":1057},[46,262],"heading",[43,1060,1062],{"className":1061},[46,156],"0",[43,1064,947],{"className":1065},[46,137],[43,1067,1069],{"className":1068},[46,262],"color",[43,1071,1073],{"className":1072},[46,156],"75",[51,1075],{},[43,1077,1079],{"className":1078},[46,137],"ask",[43,1081,1031],{"className":1082},[46,57],[43,1084,1062],{"className":1085},[46,156],[43,1087,947],{"className":1088},[46,137],[43,1090,1041],{"className":1091},[46,57],[43,1093,1095],{"className":1094},[46,156],"42",[51,1097],{},[43,1099,94],{"className":1100},[46,57],[43,1102,1104],{"className":1103},[46,145],"\"goat\"",[43,1106,1031],{"className":1107},[46,57],[43,1109,1062],{"className":1110},[46,156],[51,1112],{},[43,1114,90],{"className":1115},[46,57],[43,1117,1119],{"className":1118},[46,145],"\"str(goat)\"",[43,1121,1123],{"className":1122},[46,64],";; Should output: \"{'WHO': 0, 'COLOR': 75, 'HEADING': 0, 'XCOR': 0, 'YCOR': 0, 'SHAPE': 'default', 'LABEL': '', 'LABEL-COLOR': 9.9, 'BREED': 'GOATS', 'HIDDEN?': False, 'SIZE': 1, 'PEN-SIZE': 1, 'PEN-MODE': 'up', 'ENERGY': 42}\"",[33,1125,1126],{},"Agents with variables containing references to agentsets will have those variables converted into the string representation of that agentset.",{"title":1128,"searchDepth":1129,"depth":1130,"links":1131},"",5,3,[1132,1136,1137],{"id":25,"depth":1133,"text":31,"children":1134},2,[1135],{"id":342,"depth":1130,"text":348},{"id":368,"depth":1133,"text":110},{"id":413,"depth":1133,"text":419,"children":1138},[1139,1140,1146,1150,1154,1158,1163,1168],{"id":499,"depth":1130,"text":505},{"id":513,"depth":1130,"text":1141,"children":1142},"\n    py:setup\n  ",[1143],{"id":520,"depth":1144,"text":1145},4,"\n    py:setup python-executable\n  ",{"id":653,"depth":1130,"text":1147,"children":1148},"\n    py:python\n  ",[1149],{"id":658,"depth":1144,"text":1147},{"id":707,"depth":1130,"text":1151,"children":1152},"\n    py:python2\n  ",[1153],{"id":712,"depth":1144,"text":1151},{"id":761,"depth":1130,"text":1155,"children":1156},"\n    py:python3\n  ",[1157],{"id":766,"depth":1144,"text":1155},{"id":813,"depth":1130,"text":1159,"children":1160},"\n    py:run\n  ",[1161],{"id":818,"depth":1144,"text":1162},"\n    py:run python-statement\n  ",{"id":898,"depth":1130,"text":1164,"children":1165},"\n    py:runresult\n  ",[1166],{"id":903,"depth":1144,"text":1167},"\n    py:runresult python-expression\n  ",{"id":950,"depth":1130,"text":1169,"children":1170},"\n    py:set\n  ",[1171],{"id":955,"depth":1144,"text":1172},"\n    py:set variable-name value\n  ","Documentation for the Python extension.","md",{"source":1176,"metadataOutputPath":1177,"projectConfig":1178,"language":1185,"inheritFrom":1193,"output":1192,"version":1179,"icon":1194,"extensionName":1195,"assetsRoot":1180},"../../external/extensions/py/py.md","content/py.metadata.yaml",{"version":1179,"projectRoot":329,"scanRoot":1180,"outputRoot":1181,"defaults":1182,"engine":1188,"partials":1189,"dedupeIdenticalDiskWrites":1192},"7.0.4","/home/runner/work/Helio/Helio/external/extensions/py","content",{"inheritFrom":1183,"language":1185,"output":1186,"extension":1174,"title":1187,"version":1179},[1184],0,"en",false,"NetLogo User Manual","mustache",{"directoryPaths":1190,"extensions":1191},[329],[1188,1174],true,[1184],"logos:python",{"shortName":58,"fullName":21},"/py",{"title":5,"description":1173},"G-CkeeyEMXC6NKX4l2dyE30baeLCkNMEiJY9CEQ7ETU",[1200,1205],{"title":1201,"path":1202,"stem":1203,"description":1204},"Programming Guide","/programming","programming","Comprehensive guide to the NetLogo programming language, covering syntax, commands, reporters, and programming concepts.",{"title":1206,"path":425,"stem":1207,"description":1208},"Python Extension Dictionary: dictionary","py/dictionary","Documentation for the dictionary primitive.",1777657790087]