{"id":3032,"date":"2021-11-23T16:05:23","date_gmt":"2021-11-23T16:05:23","guid":{"rendered":"https:\/\/www.pythontutorial.net\/?page_id=3032"},"modified":"2025-03-30T10:16:44","modified_gmt":"2025-03-30T10:16:44","slug":"python-private-functions","status":"publish","type":"page","link":"https:\/\/www.pythontutorial.net\/python-basics\/python-private-functions\/","title":{"rendered":"Python Private Functions"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn how to define Python private functions in a module using the <code>__all__<\/code> variable.<\/p>\n\n\n\n<p>Suppose you have a <a href=\"https:\/\/www.pythontutorial.net\/python-basics\/python-module\/\">module<\/a> called <code>mail.py<\/code> with two <a href=\"https:\/\/www.pythontutorial.net\/python-basics\/python-functions\/\">functions<\/a> <code>send()<\/code> and <code>attach_file()<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">send<\/span><span class=\"hljs-params\">(email, message)<\/span>:<\/span>\n    print(<span class=\"hljs-string\">f'Sending \"<span class=\"hljs-subst\">{message}<\/span>\" to <span class=\"hljs-subst\">{email}<\/span>'<\/span>)\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">attach_file<\/span><span class=\"hljs-params\">(filename)<\/span>:<\/span>\n    print(<span class=\"hljs-string\">f'Attach <span class=\"hljs-subst\">{filename}<\/span> to the message'<\/span>)\n   <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>And you want to expose only the <code>send()<\/code> function to other modules, not the <code>attach_file()<\/code> function. In other words, you want the <code>attach_file()<\/code> function to be private and cannot be accessible from the outside of the mail module.<\/p>\n\n\n\n<p>Note that for simplicity, we only print out some texts in the functions.<\/p>\n\n\n\n<p>If other modules use the <code>import *<\/code> statement like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> mail <span class=\"hljs-keyword\">import<\/span> *<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>you can prefix a function name with an underscore (<code>_<\/code>) to make it private. For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">send<\/span><span class=\"hljs-params\">(email, message)<\/span>:<\/span>\n    print(<span class=\"hljs-string\">f'Sending \"<span class=\"hljs-subst\">{message}<\/span>\" to <span class=\"hljs-subst\">{email}<\/span>'<\/span>)\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">_attach_file<\/span><span class=\"hljs-params\">(filename)<\/span>:<\/span>\n    print(<span class=\"hljs-string\">f'Attach <span class=\"hljs-subst\">{filename}<\/span> to the message'<\/span>)\n   <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>From the <code>mail.py<\/code> file, you can use the <code>import * from mail<\/code> module and can see only the <code>send()<\/code> function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> mail <span class=\"hljs-keyword\">import<\/span> *\n\n\nsend(<span class=\"hljs-string\">'test@example.com'<\/span>,<span class=\"hljs-string\">'Hello'<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In other words, you won&#8217;t be able to access the <code>_attach_file()<\/code> function from the <code>main<\/code> module. If you attempt to call the <code>_attach_file()<\/code> function, you&#8217;ll get an error.<\/p>\n\n\n\n<p>Another way to make the <code>attach_file()<\/code> function private is to use the <code>__all__<\/code> variable. In this way, you don&#8217;t need to prefix the function name with an underscore (_) to make it private.<\/p>\n\n\n\n<p>The <code>__all__<\/code> specifies a list of functions (also variables, and other objects) that are available to the other modules. In other words, you can make a function private by not listing it in the <code>__all__<\/code> variable.<\/p>\n\n\n\n<p>The following uses the <code>__all__<\/code> variable in the <code>mail<\/code> module to make the <code>send()<\/code> function public and <code>attach_file()<\/code> function private:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-comment\"># mail.py<\/span>\n\n__all__ = &#91;<span class=\"hljs-string\">'send'<\/span>]\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">send<\/span><span class=\"hljs-params\">(email, message)<\/span>:<\/span>\n    print(<span class=\"hljs-string\">f'Sending \"<span class=\"hljs-subst\">{message}<\/span>\" to <span class=\"hljs-subst\">{email}<\/span>'<\/span>)\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">attach_file<\/span><span class=\"hljs-params\">(filename)<\/span>:<\/span>\n    print(<span class=\"hljs-string\">f'Attach <span class=\"hljs-subst\">{filename}<\/span> to the message'<\/span>)\n   <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>From the <code>main.py<\/code> module, you also cannot access the <code>attach_file()<\/code> function like before:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-comment\"># main.py<\/span>\n\n<span class=\"hljs-keyword\">from<\/span> mail <span class=\"hljs-keyword\">import<\/span> *\n\n\nsend(<span class=\"hljs-string\">'test@example.com'<\/span>,<span class=\"hljs-string\">'Hello'<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>As mentioned in the <a href=\"https:\/\/www.pythontutorial.net\/python-basics\/python-module\/\">module tutorial<\/a>, the <code>import *<\/code> is not a good practice and often leads to bugs. However, you still can utilize it by using a <a href=\"https:\/\/www.pythontutorial.net\/python-basics\/python-packages\/\">package<\/a>.<\/p>\n\n\n\n<p>First, create a package called <code>mail<\/code> with the <code>__init__.py<\/code> file and create the <code>email.py<\/code> module in the <code>mail<\/code> package:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">\u251c\u2500\u2500 mail\n|  \u251c\u2500\u2500 email.py\n|  \u2514\u2500\u2500 __init__.py\n\u2514\u2500\u2500 main.py<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, place the following code in the <code>email.py<\/code> file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-comment\"># email.py<\/span>\n\n__all__ = &#91;<span class=\"hljs-string\">'send'<\/span>]\n\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">send<\/span><span class=\"hljs-params\">(email, message)<\/span>:<\/span>\n    print(<span class=\"hljs-string\">f'Sending \"<span class=\"hljs-subst\">{message}<\/span>\" to <span class=\"hljs-subst\">{email}<\/span>'<\/span>)\n\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">attach_file<\/span><span class=\"hljs-params\">(filename)<\/span>:<\/span>\n    print(<span class=\"hljs-string\">f'Attach <span class=\"hljs-subst\">{filename}<\/span> to the message'<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Third, use the <code>import *<\/code> and add the <code>send()<\/code> function to the <code>__all__<\/code> variable in the <code>__init__.py<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> .email <span class=\"hljs-keyword\">import<\/span> * \n\n__all__ = email.__all__<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>By doing this, the <code>mail<\/code> package exposes only the <code>send()<\/code> function specified in the <code>email.__all__<\/code> variable. It hides the <code>attach_file()<\/code> from the outside.<\/p>\n\n\n\n<p>From the <code>main.py<\/code> file, you can import the <code>mail<\/code> package and use the <code>send()<\/code> function like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-comment\"># main.py<\/span>\n\n<span class=\"hljs-keyword\">import<\/span> mail\n\n\nmail.send(<span class=\"hljs-string\">'test@example.com'<\/span>,<span class=\"hljs-string\">'Hello'<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Alternative, you can import the <code>send()<\/code> function from the mail package:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-comment\"># main.py<\/span>\n\n<span class=\"hljs-keyword\">from<\/span> mail <span class=\"hljs-keyword\">import<\/span> send\n\n\nsend(<span class=\"hljs-string\">'test@example.com'<\/span>,<span class=\"hljs-string\">'Hello'<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id='summary'>Summary <a href=\"#summary\" class=\"anchor\" id=\"summary\" title=\"Anchor for Summary\">#<\/a><\/h2>\n\n\n\n<p>To make a function private in Python:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>First, create a package with the <code>__init__.py<\/code> file<\/li>\n\n\n\n<li>Second, do not specify the function in the <code>__all__<\/code> variable.<\/li>\n\n\n\n<li>Third, import all symbols from the module in the <code>__init__.py<\/code> file of the package and expose only the public functions by using the <code>__all__<\/code> variable.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id='quiz'>Quiz <a href=\"#quiz\" class=\"anchor\" id=\"quiz\" title=\"Anchor for Quiz\">#<\/a><\/h2>\n\n\n\n<iframe loading=\"lazy\"\n  name=\"quiz\"\n  src=\"\/quiz\/?quiz=private-function\"\n  height=\"700\"\n  width=\"600\"\n  class=\"iframe\"\n><\/iframe>\n\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"3032\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/python-basics\/python-private-functions\/\"\n\t\t\t\tdata-post-title=\"Python Private Functions\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"3032\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/python-basics\/python-private-functions\/\"\n\t\t\t\tdata-post-title=\"Python Private Functions\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\t\t\t<input type=\"button\" name=\"wth-submit\" class=\"wth-btn wth-btn-submit\" id=\"wth-submit\" \/>\n\t\t\t<input type=\"button\" class=\"wth-btn wth-btn-cancel\" value=\"Cancel\" \/>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>in this tutorial, you&#8217;ll learn how to define Python private functions in a module using the underscore (_) prefix and __all__ variables.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":37,"menu_order":61,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3032","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/3032","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/comments?post=3032"}],"version-history":[{"count":1,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/3032\/revisions"}],"predecessor-version":[{"id":7219,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/3032\/revisions\/7219"}],"up":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/37"}],"wp:attachment":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/media?parent=3032"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}