2025-09-23 06:50:35 +00:00

593 lines
42 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en" class="h-full">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="turbo-cache-control" content="no-cache" data-turbo-track="reload" data-track-token="3.11.0.811925382131">
<!-- See retype.com -->
<meta name="generator" content="Retype 3.11.0">
<!-- Primary Meta Tags -->
<title>Coding Style Guide | Portable Python 3.x Interpreter in Modern C</title>
<meta name="title" content="Coding Style Guide | Portable Python 3.x Interpreter in Modern C">
<meta name="description" content="Use four spaces for indentation. Do not use TAB.">
<!-- Canonical -->
<link rel="canonical" href="https://pocketpy.dev/coding-style-guide/">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://pocketpy.dev/coding-style-guide/">
<meta property="og:title" content="Coding Style Guide | Portable Python 3.x Interpreter in Modern C">
<meta property="og:description" content="Use four spaces for indentation. Do not use TAB.">
<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://pocketpy.dev/coding-style-guide/">
<meta property="twitter:title" content="Coding Style Guide | Portable Python 3.x Interpreter in Modern C">
<meta property="twitter:description" content="Use four spaces for indentation. Do not use TAB.">
<script data-cfasync="false">(function(){var cl=document.documentElement.classList,ls=localStorage.getItem("retype_scheme"),hd=cl.contains("dark"),hl=cl.contains("light"),wm=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches;if(ls==="dark"||(!ls&&wm&&!hd&&!hl)){cl.remove("light");cl.add("dark")}else if(ls==="light"||(!ls&&!wm&&!hd&&!hl)){cl.remove("dark");cl.add("light")}})();</script>
<link href="../static/logo.png" rel="icon">
<link href="../resources/css/retype.css?v=3.11.0.811925382131" rel="stylesheet">
<script data-cfasync="false" src="../resources/js/config.js?v=3.11.0.811925382131" data-turbo-eval="false" defer></script>
<script data-cfasync="false" src="../resources/js/retype.js?v=3.11.0" data-turbo-eval="false" defer></script>
<script id="lunr-js" data-cfasync="false" src="../resources/js/lunr.js?v=3.11.0.811925382131" data-turbo-eval="false" defer></script>
<script id="prism-js" data-cfasync="false" src="../resources/js/prism.js?v=3.11.0.811925382131" defer></script>
</head>
<body>
<div id="retype-app" class="relative text-base antialiased text-base-text bg-base-bg font-body">
<div class="absolute bottom-0 left-0" style="top: 5rem; right: 50%"></div>
<header id="retype-header" class="sticky top-0 z-30 flex w-full h-16 bg-header-bg border-b border-header-border md:h-20">
<div class="container relative flex items-center justify-between pr-6 grow md:justify-start">
<!-- Mobile menu button skeleton -->
<button v-cloak class="skeleton retype-mobile-menu-button flex items-center justify-center shrink-0 overflow-hidden dark:text-white focus:outline-none rounded-full w-10 h-10 ml-3.5 md:hidden"><svg xmlns="http://www.w3.org/2000/svg" class="mb-px shrink-0" width="24" height="24" viewBox="0 0 24 24" role="presentation" style="margin-bottom: 0px;"><g fill="currentColor"><path d="M2 4h20v2H2zM2 11h20v2H2zM2 18h20v2H2z"></path></g></svg></button>
<div v-cloak id="retype-sidebar-left-toggle-button"></div>
<!-- Logo -->
<div class="flex items-center justify-between h-full py-2 md:w-75">
<div class="flex items-center px-2 md:px-6">
<a id="retype-branding-logo" href="../" class="flex items-center leading-snug text-2xl">
<span class="w-10 mr-2 grow-0 shrink-0 overflow-hidden">
<img class="max-h-10 dark:hidden md:inline-block" src="../static/logo.png">
<img class="max-h-10 hidden dark:inline-block" src="../static/logo.png">
</span>
<span class="dark:text-white font-bold line-clamp-1 md:line-clamp-2">pocketpy</span>
</a><span id="retype-branding-label" class="inline-flex mt-1 px-2 py-1 ml-4 text-xs font-medium leading-none items-center rounded-md bg-branding-label-bg text-branding-label-text ring-1 ring-branding-label-border ring-inset md:inline-block">v2.1.2</span>
</div>
<span class="hidden h-8 border-r md:inline-block border-base-border"></span>
</div>
<div class="flex justify-between md:grow">
<!-- Top Nav -->
<nav id="retype-header-nav" class="hidden md:flex">
<ul class="flex flex-col mb-4 md:pl-16 md:mb-0 md:flex-row md:items-center">
<li class="mr-6">
<a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M11.03 2.59a1.501 1.501 0 0 1 1.94 0l7.5 6.363a1.5 1.5 0 0 1 .53 1.144V19.5a1.5 1.5 0 0 1-1.5 1.5h-5.75a.75.75 0 0 1-.75-.75V14h-2v6.25a.75.75 0 0 1-.75.75H4.5A1.5 1.5 0 0 1 3 19.5v-9.403c0-.44.194-.859.53-1.144ZM12 3.734l-7.5 6.363V19.5h5v-6.25a.75.75 0 0 1 .75-.75h3.5a.75.75 0 0 1 .75.75v6.25h5v-9.403Z"/>
</g>
</svg>
<span>Home</span>
</a>
</li>
<li class="mr-6">
<a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://pocketpy.dev/static/web/" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M9.5 15.584V8.416a.5.5 0 0 1 .77-.42l5.576 3.583a.5.5 0 0 1 0 .842l-5.576 3.584a.5.5 0 0 1-.77-.42Z"/><path d="M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12Zm11-9.5A9.5 9.5 0 0 0 2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5Z"/>
</g>
</svg>
<span>Live Demo</span>
</a>
</li>
<li class="mr-6">
<a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://pocketpy.github.io/examples/" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M15.22 4.97a.75.75 0 0 1 1.06 0l6.5 6.5a.75.75 0 0 1 0 1.06l-6.5 6.5a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L21.19 12l-5.97-5.97a.75.75 0 0 1 0-1.06Zm-6.44 0a.75.75 0 0 1 0 1.06L2.81 12l5.97 5.97a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-6.5-6.5a.75.75 0 0 1 0-1.06l6.5-6.5a.75.75 0 0 1 1.06 0Z"/>
</g>
</svg>
<span>Live Examples</span>
</a>
</li>
<li class="mr-6">
<a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://github.com/blueloveth/pocketpy" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M12 1C5.923 1 1 5.923 1 12c0 4.867 3.149 8.979 7.521 10.436.55.096.756-.233.756-.522 0-.262-.013-1.128-.013-2.049-2.764.509-3.479-.674-3.699-1.292-.124-.317-.66-1.293-1.127-1.554-.385-.207-.936-.715-.014-.729.866-.014 1.485.797 1.691 1.128.99 1.663 2.571 1.196 3.204.907.096-.715.385-1.196.701-1.471-2.448-.275-5.005-1.224-5.005-5.432 0-1.196.426-2.186 1.128-2.956-.111-.275-.496-1.402.11-2.915 0 0 .921-.288 3.024 1.128a10.193 10.193 0 0 1 2.75-.371c.936 0 1.871.123 2.75.371 2.104-1.43 3.025-1.128 3.025-1.128.605 1.513.221 2.64.111 2.915.701.77 1.127 1.747 1.127 2.956 0 4.222-2.571 5.157-5.019 5.432.399.344.743 1.004.743 2.035 0 1.471-.014 2.654-.014 3.025 0 .289.206.632.756.522C19.851 20.979 23 16.854 23 12c0-6.077-4.922-11-11-11Z"/>
</g>
</svg>
<span>Github</span>
</a>
</li>
<li class="mr-6">
<a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://discord.gg/WWaq72GzXv" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"/><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"/>
</g>
</svg>
<span>Discord</span>
</a>
</li>
</ul>
</nav>
<!-- Header Right Skeleton -->
<div v-cloak class="flex justify-end grow skeleton">
<!-- Search input mock -->
<div class="relative hidden w-40 lg:block lg:max-w-sm lg:ml-auto">
<div class="absolute flex items-center justify-center h-full pl-3 dark:text-dark-300">
<svg xmlns="http://www.w3.org/2000/svg" class="icon-base" width="16" height="16" viewBox="0 0 24 24" aria-labelledby="icon" role="presentation" style="margin-bottom: 1px;"><g fill="currentColor" ><path d="M21.71 20.29l-3.68-3.68A8.963 8.963 0 0020 11c0-4.96-4.04-9-9-9s-9 4.04-9 9 4.04 9 9 9c2.12 0 4.07-.74 5.61-1.97l3.68 3.68c.2.19.45.29.71.29s.51-.1.71-.29c.39-.39.39-1.03 0-1.42zM4 11c0-3.86 3.14-7 7-7s7 3.14 7 7c0 1.92-.78 3.66-2.04 4.93-.01.01-.02.01-.02.01-.01.01-.01.01-.01.02A6.98 6.98 0 0111 18c-3.86 0-7-3.14-7-7z" ></path></g></svg>
</div>
<input class="w-full h-10 placeholder-search-placeholder transition-colors duration-200 ease-in bg-search-bg border border-transparent rounded md:text-sm hover:border-search-border-hover focus:outline-none focus:border-search-border-focus" style="padding: 0.625rem 0.75rem 0.625rem 2rem" type="text" placeholder="Search">
</div>
<!-- Mobile search button -->
<div class="flex items-center justify-center w-10 h-10 lg:hidden">
<svg xmlns="http://www.w3.org/2000/svg" class="shrink-0 icon-base" width="20" height="20" viewBox="0 0 24 24" aria-labelledby="icon" role="presentation" style="margin-bottom: 0px;"><g fill="currentColor" ><path d="M21.71 20.29l-3.68-3.68A8.963 8.963 0 0020 11c0-4.96-4.04-9-9-9s-9 4.04-9 9 4.04 9 9 9c2.12 0 4.07-.74 5.61-1.97l3.68 3.68c.2.19.45.29.71.29s.51-.1.71-.29c.39-.39.39-1.03 0-1.42zM4 11c0-3.86 3.14-7 7-7s7 3.14 7 7c0 1.92-.78 3.66-2.04 4.93-.01.01-.02.01-.02.01-.01.01-.01.01-.01.02A6.98 6.98 0 0111 18c-3.86 0-7-3.14-7-7z" ></path></g></svg>
</div>
<!-- Dark mode switch placeholder -->
<div class="w-10 h-10 lg:ml-2"></div>
<!-- History button -->
<div class="flex items-center justify-center w-10 h-10" style="margin-right: -0.625rem;">
<svg xmlns="http://www.w3.org/2000/svg" class="shrink-0 icon-base" width="22" height="22" viewBox="0 0 24 24" aria-labelledby="icon" role="presentation" style="margin-bottom: 0px;"><g fill="currentColor" ><g ><path d="M12.01 6.01c-.55 0-1 .45-1 1V12a1 1 0 00.4.8l3 2.22a.985.985 0 001.39-.2.996.996 0 00-.21-1.4l-2.6-1.92V7.01c.02-.55-.43-1-.98-1z"></path><path d="M12.01 1.91c-5.33 0-9.69 4.16-10.05 9.4l-.29-.26a.997.997 0 10-1.34 1.48l1.97 1.79c.19.17.43.26.67.26s.48-.09.67-.26l1.97-1.79a.997.997 0 10-1.34-1.48l-.31.28c.34-4.14 3.82-7.41 8.05-7.41 4.46 0 8.08 3.63 8.08 8.09s-3.63 8.08-8.08 8.08c-2.18 0-4.22-.85-5.75-2.4a.996.996 0 10-1.42 1.4 10.02 10.02 0 007.17 2.99c5.56 0 10.08-4.52 10.08-10.08.01-5.56-4.52-10.09-10.08-10.09z"></path></g></g></svg>
</div>
</div>
<div v-cloak class="flex justify-end grow">
<div id="retype-mobile-search-button"></div>
<doc-search-desktop></doc-search-desktop>
<doc-theme-switch class="lg:ml-2"></doc-theme-switch>
<doc-history></doc-history>
</div>
</div>
</div>
</header>
<div id="retype-container" class="container relative flex bg-white">
<!-- Sidebar Skeleton -->
<div v-cloak class="fixed flex flex-col shrink-0 duration-300 ease-in-out bg-sidebar-left-bg border-sidebar-left-border sidebar top-20 w-75 border-r h-screen md:sticky transition-transform skeleton">
<div class="flex items-center h-16 px-6">
<input class="w-full h-8 px-3 py-2 transition-colors duration-200 ease-linear bg-filter-bg border border-filter-border rounded shadow-none text-sm focus:outline-none focus:border-filter-border-focus" type="text" placeholder="Filter">
</div>
<div class="pl-6 mt-1 mb-4">
<div class="w-32 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-48 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-40 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-32 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-48 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-40 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
</div>
<div class="shrink-0 mt-auto bg-transparent dark:border-base-border">
<a class="flex items-center justify-center flex-nowrap h-16 text-gray-350 dark:text-dark-400 hover:text-gray-600 dark:hover:text-dark-300 transition-colors duration-150 ease-in docs-powered-by" target="_blank" href="https://retype.com/" rel="noopener">
<span class="text-xs whitespace-nowrap">Powered by</span>
<svg xmlns="http://www.w3.org/2000/svg" class="ml-2" fill="currentColor" width="96" height="20" overflow="visible"><path d="M0 0v20h13.59V0H0zm11.15 17.54H2.44V2.46h8.71v15.08zM15.8 20h2.44V4.67L15.8 2.22zM20.45 6.89V20h2.44V9.34z"/><g><path d="M40.16 8.44c0 1.49-.59 2.45-1.75 2.88l2.34 3.32h-2.53l-2.04-2.96h-1.43v2.96h-2.06V5.36h3.5c1.43 0 2.46.24 3.07.73s.9 1.27.9 2.35zm-2.48 1.1c.26-.23.38-.59.38-1.09 0-.5-.13-.84-.4-1.03s-.73-.28-1.39-.28h-1.54v2.75h1.5c.72 0 1.2-.12 1.45-.35zM51.56 5.36V7.2h-4.59v1.91h4.13v1.76h-4.13v1.92h4.74v1.83h-6.79V5.36h6.64zM60.09 7.15v7.48h-2.06V7.15h-2.61V5.36h7.28v1.79h-2.61zM70.81 14.64h-2.06v-3.66l-3.19-5.61h2.23l1.99 3.45 1.99-3.45H74l-3.19 5.61v3.66zM83.99 6.19c.65.55.97 1.4.97 2.55s-.33 1.98-1 2.51-1.68.8-3.04.8h-1.23v2.59h-2.06V5.36h3.26c1.42 0 2.45.28 3.1.83zm-1.51 3.65c.25-.28.37-.69.37-1.22s-.16-.92-.48-1.14c-.32-.23-.82-.34-1.5-.34H79.7v3.12h1.38c.68 0 1.15-.14 1.4-.42zM95.85 5.36V7.2h-4.59v1.91h4.13v1.76h-4.13v1.92H96v1.83h-6.79V5.36h6.64z"/></g></svg>
</a>
</div>
</div>
<!-- Sidebar component -->
<doc-sidebar v-cloak>
<template #sidebar-footer>
<div class="shrink-0 mt-auto border-t md:bg-transparent md:border-none dark:border-base-border">
<div class="py-3 px-6 md:hidden border-b dark:border-base-border">
<nav>
<ul class="flex flex-wrap justify-center items-center">
<li class="mr-6">
<a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M11.03 2.59a1.501 1.501 0 0 1 1.94 0l7.5 6.363a1.5 1.5 0 0 1 .53 1.144V19.5a1.5 1.5 0 0 1-1.5 1.5h-5.75a.75.75 0 0 1-.75-.75V14h-2v6.25a.75.75 0 0 1-.75.75H4.5A1.5 1.5 0 0 1 3 19.5v-9.403c0-.44.194-.859.53-1.144ZM12 3.734l-7.5 6.363V19.5h5v-6.25a.75.75 0 0 1 .75-.75h3.5a.75.75 0 0 1 .75.75v6.25h5v-9.403Z"/>
</g>
</svg>
<span>Home</span>
</a>
</li>
<li class="mr-6">
<a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://pocketpy.dev/static/web/" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M9.5 15.584V8.416a.5.5 0 0 1 .77-.42l5.576 3.583a.5.5 0 0 1 0 .842l-5.576 3.584a.5.5 0 0 1-.77-.42Z"/><path d="M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12Zm11-9.5A9.5 9.5 0 0 0 2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5Z"/>
</g>
</svg>
<span>Live Demo</span>
</a>
</li>
<li class="mr-6">
<a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://pocketpy.github.io/examples/" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M15.22 4.97a.75.75 0 0 1 1.06 0l6.5 6.5a.75.75 0 0 1 0 1.06l-6.5 6.5a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L21.19 12l-5.97-5.97a.75.75 0 0 1 0-1.06Zm-6.44 0a.75.75 0 0 1 0 1.06L2.81 12l5.97 5.97a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-6.5-6.5a.75.75 0 0 1 0-1.06l6.5-6.5a.75.75 0 0 1 1.06 0Z"/>
</g>
</svg>
<span>Live Examples</span>
</a>
</li>
<li class="mr-6">
<a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://github.com/blueloveth/pocketpy" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M12 1C5.923 1 1 5.923 1 12c0 4.867 3.149 8.979 7.521 10.436.55.096.756-.233.756-.522 0-.262-.013-1.128-.013-2.049-2.764.509-3.479-.674-3.699-1.292-.124-.317-.66-1.293-1.127-1.554-.385-.207-.936-.715-.014-.729.866-.014 1.485.797 1.691 1.128.99 1.663 2.571 1.196 3.204.907.096-.715.385-1.196.701-1.471-2.448-.275-5.005-1.224-5.005-5.432 0-1.196.426-2.186 1.128-2.956-.111-.275-.496-1.402.11-2.915 0 0 .921-.288 3.024 1.128a10.193 10.193 0 0 1 2.75-.371c.936 0 1.871.123 2.75.371 2.104-1.43 3.025-1.128 3.025-1.128.605 1.513.221 2.64.111 2.915.701.77 1.127 1.747 1.127 2.956 0 4.222-2.571 5.157-5.019 5.432.399.344.743 1.004.743 2.035 0 1.471-.014 2.654-.014 3.025 0 .289.206.632.756.522C19.851 20.979 23 16.854 23 12c0-6.077-4.922-11-11-11Z"/>
</g>
</svg>
<span>Github</span>
</a>
</li>
<li class="mr-6">
<a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://discord.gg/WWaq72GzXv" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"/><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"/>
</g>
</svg>
<span>Discord</span>
</a>
</li>
</ul>
</nav>
</div>
<a class="flex items-center justify-center flex-nowrap h-16 text-gray-350 dark:text-dark-400 hover:text-gray-600 dark:hover:text-dark-300 transition-colors duration-150 ease-in docs-powered-by" target="_blank" href="https://retype.com/" rel="noopener">
<span class="text-xs whitespace-nowrap">Powered by</span>
<svg xmlns="http://www.w3.org/2000/svg" class="ml-2" fill="currentColor" width="96" height="20" overflow="visible"><path d="M0 0v20h13.59V0H0zm11.15 17.54H2.44V2.46h8.71v15.08zM15.8 20h2.44V4.67L15.8 2.22zM20.45 6.89V20h2.44V9.34z"/><g><path d="M40.16 8.44c0 1.49-.59 2.45-1.75 2.88l2.34 3.32h-2.53l-2.04-2.96h-1.43v2.96h-2.06V5.36h3.5c1.43 0 2.46.24 3.07.73s.9 1.27.9 2.35zm-2.48 1.1c.26-.23.38-.59.38-1.09 0-.5-.13-.84-.4-1.03s-.73-.28-1.39-.28h-1.54v2.75h1.5c.72 0 1.2-.12 1.45-.35zM51.56 5.36V7.2h-4.59v1.91h4.13v1.76h-4.13v1.92h4.74v1.83h-6.79V5.36h6.64zM60.09 7.15v7.48h-2.06V7.15h-2.61V5.36h7.28v1.79h-2.61zM70.81 14.64h-2.06v-3.66l-3.19-5.61h2.23l1.99 3.45 1.99-3.45H74l-3.19 5.61v3.66zM83.99 6.19c.65.55.97 1.4.97 2.55s-.33 1.98-1 2.51-1.68.8-3.04.8h-1.23v2.59h-2.06V5.36h3.26c1.42 0 2.45.28 3.1.83zm-1.51 3.65c.25-.28.37-.69.37-1.22s-.16-.92-.48-1.14c-.32-.23-.82-.34-1.5-.34H79.7v3.12h1.38c.68 0 1.15-.14 1.4-.42zM95.85 5.36V7.2h-4.59v1.91h4.13v1.76h-4.13v1.92H96v1.83h-6.79V5.36h6.64z"/></g></svg>
</a>
</div>
</template>
</doc-sidebar>
<div class="grow min-w-0 bg-body-bg">
<!-- Render "toolbar" template here on api pages --><!-- Render page content -->
<div class="flex">
<div id="retype-main" class="min-w-0 p-4 grow md:px-16">
<main class="relative pb-12 lg:pt-2">
<div class="retype-markdown" id="retype-content">
<!-- Rendered if sidebar right is enabled -->
<div id="retype-sidebar-right-toggle"></div>
<!-- Page content -->
<doc-anchor-target id="coding-style-guide" class="break-words">
<h1>
<doc-anchor-trigger class="header-anchor-trigger" to="#coding-style-guide">#</doc-anchor-trigger>
<span>Coding Style Guide</span>
</h1>
</doc-anchor-target>
<doc-anchor-target id="indentation">
<h2>
<doc-anchor-trigger class="header-anchor-trigger" to="#indentation">#</doc-anchor-trigger>
<span>Indentation</span>
</h2>
</doc-anchor-target>
<p>Use four spaces for indentation. Do not use <code v-pre>TAB</code>.</p>
<doc-anchor-target id="strings">
<h2>
<doc-anchor-trigger class="header-anchor-trigger" to="#strings">#</doc-anchor-trigger>
<span>Strings</span>
</h2>
</doc-anchor-target>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-python"><code v-pre class="language-python"># Prefer single quotes for strings
s = 'this is a string'
# Use double quotes only if the string itself contains a single quote
s = &quot;this ' is single quote&quot;</code></pre>
</doc-codeblock></div>
<doc-anchor-target id="docstrings">
<h2>
<doc-anchor-trigger class="header-anchor-trigger" to="#docstrings">#</doc-anchor-trigger>
<span>Docstrings</span>
</h2>
</doc-anchor-target>
<p>Always use triple quotes for docstrings.</p>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-python"><code v-pre class="language-python">def f():
&quot;&quot;&quot;This is a multi-line docstring.
Here is some content. Docstrings partially support Markdown.
&quot;&quot;&quot;
def g():
&quot;&quot;&quot;This is a single-line docstring.&quot;&quot;&quot;</code></pre>
</doc-codeblock></div>
<p>Use natural language to describe the function&#x27;s purpose. Do not enumerate each parameter and return value.</p>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-python"><code v-pre class="language-python"># Correct
def add(a: int, b: int):
&quot;&quot;&quot;Add two integers `a` and `b`.&quot;&quot;&quot;
# Incorrect
def add(a: int, b: int):
&quot;&quot;&quot;
@param a, the first argument
@param b, the second argument
@return, the result of a + b
&quot;&quot;&quot;</code></pre>
</doc-codeblock></div>
<doc-anchor-target id="spaces">
<h2>
<doc-anchor-trigger class="header-anchor-trigger" to="#spaces">#</doc-anchor-trigger>
<span>Spaces</span>
</h2>
</doc-anchor-target>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-python"><code v-pre class="language-python"># Add a space after `,` or `:`
a, b = 1, 2
c = [1, 2, 3]
d = {'key': 'value'}
# Spaces may be added around operators
res = 1 + 2
if res &lt; 2: pass
# Spaces can also be selectively added to indicate operator precedence
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
# Add a space after `:` in type annotations
def f(a: int, b: float): ...
def g() -&gt; int: ...
# Add spaces around `=` when specifying default values in function parameters
def f(a: int = 1, b: int | None = None): ...
# However, omit spaces if the parameter has no type annotation
def f(a=1, b=2): pass
# Do not add spaces in keyword arguments when calling functions
print(1, 2, 3, end='', sep=',')
f(a=10, b=20)</code></pre>
</doc-codeblock></div>
<doc-anchor-target id="naming-conventions">
<h2>
<doc-anchor-trigger class="header-anchor-trigger" to="#naming-conventions">#</doc-anchor-trigger>
<span>Naming Conventions</span>
</h2>
</doc-anchor-target>
<ul>
<li>Classes: <code v-pre>CapitalizedWords</code></li>
<li>Functions and variables: <code v-pre>lower_case_with_underscores</code></li>
<li>Constants and enums: <code v-pre>UPPER_CASE_WITH_UNDERSCORES</code> or <code v-pre>CapitalizedWords</code></li>
<li>Anonymous ordered variables: <code v-pre>_0</code>, <code v-pre>_1</code>, <code v-pre>_2</code></li>
<li>Discarded variables: <code v-pre>_</code></li>
<li>Some standard library functions: <code v-pre>lowercase</code></li>
</ul>
<p>Here are some commonly used naming conventions:</p>
<ul>
<li><code v-pre>self</code>: The first parameter of an instance method</li>
<li><code v-pre>cls</code>: The first parameter of class methods and <code v-pre>__new__</code></li>
</ul>
<doc-anchor-target id="using-abbreviations">
<h3>
<doc-anchor-trigger class="header-anchor-trigger" to="#using-abbreviations">#</doc-anchor-trigger>
<span>Using Abbreviations</span>
</h3>
</doc-anchor-target>
<p>Use abbreviations only for temporary variables and internal implementations.</p>
<p>Abbreviations should be well-established, include key syllables of the original word, and be immediately recognizable.</p>
<ul>
<li><code v-pre>context</code> -&gt; <code v-pre>ctx</code> (✔)</li>
<li><code v-pre>temporary</code> -&gt; <code v-pre>tmp</code> (✔)</li>
<li><code v-pre>distribution</code> -&gt; <code v-pre>dist</code> (✔)</li>
<li><code v-pre>visited</code> -&gt; <code v-pre>vis</code> (<span class="docs-emoji">&#x274C;</span>)</li>
</ul>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-python"><code v-pre class="language-python"># Incorrect: Using abbreviations in public function parameters
def some_pub_fn(ctx, req_id, data):
pass
# Correct
def some_public_function(context, request_id, data):
pass</code></pre>
</doc-codeblock></div>
<doc-anchor-target id="using-precise-terminology">
<h3>
<doc-anchor-trigger class="header-anchor-trigger" to="#using-precise-terminology">#</doc-anchor-trigger>
<span>Using Precise Terminology</span>
</h3>
</doc-anchor-target>
<p>Naming should convey precise meanings, especially when multiple synonyms exist.</p>
<p>For example, <code v-pre>count</code>, <code v-pre>size</code>, and <code v-pre>length</code> all relate to quantity, but they have different nuances:</p>
<ul>
<li><code v-pre>count</code>: Represents a counted value</li>
<li><code v-pre>length</code>: Represents the number of elements in a container</li>
<li><code v-pre>size</code>: Represents the byte size of an object</li>
</ul>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-python"><code v-pre class="language-python">s = 'aaabc⭐'
count = s.count('a')
length = len(s)
size = len(s.encode())
print(f&quot;{s!r} has a length of {length}, a size of {size} bytes, and contains {count} occurrences of 'a'&quot;)
# 'aaabc⭐' has a length of 6, a size of 8 bytes, and contains 3 occurrences of 'a'</code></pre>
</doc-codeblock></div>
<doc-anchor-target id="using-professional-terminology">
<h3>
<doc-anchor-trigger class="header-anchor-trigger" to="#using-professional-terminology">#</doc-anchor-trigger>
<span>Using Professional Terminology</span>
</h3>
</doc-anchor-target>
<ul>
<li>For item quantities in a game: <code v-pre>quantity</code> is better than <code v-pre>item_count</code></li>
<li>For grid counts: <code v-pre>area</code> (meaning surface area) is better than <code v-pre>grid_count</code></li>
</ul>
<doc-anchor-target id="avoiding-built-in-names">
<h3>
<doc-anchor-trigger class="header-anchor-trigger" to="#avoiding-built-in-names">#</doc-anchor-trigger>
<span>Avoiding Built-in Names</span>
</h3>
</doc-anchor-target>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-python"><code v-pre class="language-python"># Incorrect: Overwriting `builtins.map`
map = [[1, 2, 3], [4, 5, 6]]
# Incorrect: Overwriting `builtins.type`
type = some_thing.type</code></pre>
</doc-codeblock></div>
<doc-anchor-target id="internal-functions-and-classes">
<h3>
<doc-anchor-trigger class="header-anchor-trigger" to="#internal-functions-and-classes">#</doc-anchor-trigger>
<span>Internal Functions and Classes</span>
</h3>
</doc-anchor-target>
<p>Use a single underscore <code v-pre>_</code> as a prefix for internal functions. Never use a double underscore <code v-pre>__</code> (except for magic methods).</p>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-python"><code v-pre class="language-python">def _internal_func():
&quot;&quot;&quot;This is an internal function.&quot;&quot;&quot;
class _InternalClass:
def _internal_f(self): pass</code></pre>
</doc-codeblock></div>
<doc-anchor-target id="importing-modules">
<h2>
<doc-anchor-trigger class="header-anchor-trigger" to="#importing-modules">#</doc-anchor-trigger>
<span>Importing Modules</span>
</h2>
</doc-anchor-target>
<ol>
<li>Import standard library modules first.</li>
<li>Then import third-party dependencies.</li>
<li>Finally, import project-specific modules.</li>
</ol>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-python"><code v-pre class="language-python">from typing import Any
from collections import deque
from array2d import array2d
from ..utils import logger</code></pre>
</doc-codeblock></div>
<doc-anchor-target id="coding-practices">
<h2>
<doc-anchor-trigger class="header-anchor-trigger" to="#coding-practices">#</doc-anchor-trigger>
<span>Coding Practices</span>
</h2>
</doc-anchor-target>
<p>Use <code v-pre>is not</code> when checking for <code v-pre>None</code>. Do not explicitly compare with <code v-pre>True</code> or <code v-pre>False</code>.</p>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-python"><code v-pre class="language-python"># Correct
if x is not None: pass
# Incorrect
if x != None: pass
# Correct
x = True
if x: pass
if not x: pass
# Incorrect
if x == True: pass
if x is True: pass
if x != False: pass</code></pre>
</doc-codeblock></div>
<p>The <code v-pre>if</code> statement implicitly calls <code v-pre>bool()</code>, so it can be used to check if a container is empty.</p>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-python"><code v-pre class="language-python">not_empty_list = [1]
not_empty_string = '1'
truth = True
if not_empty_list:
print('true value')
if not_empty_string:
print('true value')
if truth:
print('true value')
# Explicitly checking for emptiness is also valid
if len(not_empty_list) &gt; 0: pass</code></pre>
</doc-codeblock></div>
<doc-anchor-target id="references">
<h2>
<doc-anchor-trigger class="header-anchor-trigger" to="#references">#</doc-anchor-trigger>
<span>References</span>
</h2>
</doc-anchor-target>
<p><a href="https://peps.python.org/pep-0008/">PEP 8 Style Guide for Python Code</a></p>
<!-- Required only on API pages -->
<doc-toolbar-member-filter-no-results></doc-toolbar-member-filter-no-results>
</div>
<footer id="retype-content-footer" class="clear-both">
<nav id="retype-nextprev" class="print:hidden flex mt-14">
<div class="w-1/2">
<a class="px-5 py-4 h-full flex items-center break-normal font-medium text-body-link border border-base-border hover:border-base-border-hover rounded-l-lg transition-colors duration-150 relative hover:z-5" href="../gsoc2024/ideas/">
<svg xmlns="http://www.w3.org/2000/svg" class="mr-3" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" overflow="visible"><path d="M19 11H7.41l5.29-5.29a.996.996 0 10-1.41-1.41l-7 7a1 1 0 000 1.42l7 7a1.024 1.024 0 001.42-.01.996.996 0 000-1.41L7.41 13H19c.55 0 1-.45 1-1s-.45-1-1-1z" /><path fill="none" d="M0 0h24v24H0z" /></svg>
<span>
<span class="block text-xs font-normal text-base-text-muted">Previous</span>
<span class="block mt-1">Project Ideas</span>
</span>
</a>
</div>
<div class="w-1/2">
<a class="px-5 py-4 -mx-px h-full flex items-center justify-end break-normal font-medium text-body-link border border-base-border hover:border-base-border-hover rounded-r-lg transition-colors duration-150 relative hover:z-5" href="../performance/">
<span>
<span class="block text-xs font-normal text-right text-base-text-muted">Next</span>
<span class="block mt-1">Performance</span>
</span>
<svg xmlns="http://www.w3.org/2000/svg" class="ml-3" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" overflow="visible"><path d="M19.92 12.38a1 1 0 00-.22-1.09l-7-7a.996.996 0 10-1.41 1.41l5.3 5.3H5c-.55 0-1 .45-1 1s.45 1 1 1h11.59l-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l7-7c.09-.09.16-.21.21-.33z" /><path fill="none" d="M0 0h24v24H0z" /></svg>
</a>
</div>
</nav>
</footer>
</main>
<div id="retype-page-footer" class="print:border-none border-t border-base-border pt-6 mb-8">
<footer class="flex flex-wrap items-center justify-between print:justify-center">
<div id="retype-footer-links" class="print:hidden">
<ul class="flex flex-wrap items-center text-sm">
</ul>
</div>
<div id="retype-copyright" class="print:justify-center py-2 text-footer-text font-footer-link-weight text-sm leading-relaxed"><p>© Copyright 2025 - <a href="https://github.com/blueloveTH">blueloveTH</a> - All rights reserved.</p></div>
</footer>
</div>
</div>
<!-- Rendered if sidebar right is enabled -->
<!-- Sidebar right skeleton-->
<div v-cloak class="fixed top-0 bottom-0 right-0 translate-x-full bg-sidebar-right-bg border-sidebar-right-border lg:sticky lg:border-l lg:shrink-0 lg:pt-6 lg:transform-none sm:w-1/2 lg:w-64 lg:z-0 md:w-104 sidebar-right skeleton">
<div class="pl-5">
<div class="w-32 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-48 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-40 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
</div>
</div>
<!-- User should be able to hide sidebar right -->
<doc-sidebar-right v-cloak></doc-sidebar-right>
</div>
</div>
</div>
<doc-search-mobile></doc-search-mobile>
<doc-back-to-top></doc-back-to-top>
</div>
<div id="retype-overlay-target"></div>
<script data-cfasync="false">window.__DOCS__ = { "title": "Coding Style Guide", level: 1, icon: "file", hasPrism: true, hasMermaid: false, hasMath: false, tocDepth: 23 }</script>
</body>
</html>