{"id":3016,"date":"2025-09-21T05:09:44","date_gmt":"2025-09-21T03:09:44","guid":{"rendered":"https:\/\/davidka.net\/ru\/?p=3016"},"modified":"2025-09-22T02:05:12","modified_gmt":"2025-09-22T00:05:12","slug":"capturing-stdout-without-external-libraries","status":"publish","type":"post","link":"https:\/\/it.davidka.net\/it\/capturing-stdout-without-external-libraries\/","title":{"rendered":"\ud83e\uddf2 Come \u201ccatturare\u201d print() in Python: intercettare stdout senza librerie esterne"},"content":{"rendered":"\n<p class=\"has-neve-link-color-color has-text-color has-link-color has-medium-font-size wp-elements-c59a47f907951a546c6fa272c9ac5c94 wp-block-paragraph\">In Python \u00e8 possibile intercettare ci\u00f2 che viene stampato a schermo tramite <code class=\"\" data-line=\"\">print()<\/code>.<br>Questo \u00e8 utile per <strong>test<\/strong>, <strong>debug<\/strong>, <strong>logging<\/strong> o per sopprimere output \u201crumorosi\u201d.<br>Ti mostrer\u00f2 come farlo in modo elegante \u2014 usando solo la <strong>libreria standard<\/strong> e poche righe di codice.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div id=\"rtoc-mokuji-wrapper\" class=\"rtoc-mokuji-content frame2 preset1 animation-fade rtoc_open default\" data-id=\"3016\" data-theme=\"Neve - Davidka\">\n\t\t\t<div id=\"rtoc-mokuji-title\" class=\"rtoc_btn_none rtoc_left\">\n\t\t\t\n\t\t\t<span>In Questo Articolo<\/span>\n\t\t\t<\/div><ol class=\"rtoc-mokuji decimal_ol level-1\"><li class=\"rtoc-item\"><a href=\"#rtoc-1\">\ud83e\udde9 Comprendere i Context Manager in Python<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-2\">Cos\u2019\u00e8 un Context Manager?<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-3\">Perch\u00e9 i Context Manager sono utili<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-4\">Uso di <code class=\"\" data-line=\"\">@contextmanager<\/code> da <code class=\"\" data-line=\"\">contextlib<\/code><\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-5\">\u26a1 Riepilogo: Context Manager per stdout\/stderr<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-6\">\ud83d\udce6 Intercettare stdout<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-7\">\ud83d\udd27 Intercettare stderr o entrambi i flussi<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-8\">Intercettare stderr<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-9\">Intercettare stdout + stderr<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-10\">\ud83d\udd00 Modalit\u00e0 Tee: intercettare e mostrare<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-11\">\ud83d\udce6 File completo: <code class=\"\" data-line=\"\">stdout_capture.py<\/code><\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-12\">\u2705 Esempi di utilizzo<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-13\">\u26a0\ufe0f Consigli pratici e avvertenze<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-14\">1\ufe0f\u20e3 Output molto grande<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-15\">2\ufe0f\u20e3 Output dai subprocess<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-16\">3\ufe0f\u20e3 Sicurezza nei thread<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-17\">4\ufe0f\u20e3 Quando usare Tee<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-18\">5\ufe0f\u20e3 Ripristinare i flussi<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-19\">6\ufe0f\u20e3 Evitare annidamenti profondi<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-20\">7\ufe0f\u20e3 Best Practices nei test<\/a><\/li><\/ul><\/li><\/ol><\/div><h2 id=\"rtoc-1\"  class=\"wp-block-heading\">\ud83e\udde9 Comprendere i Context Manager in Python<\/h2>\n\n\n\n<h3 id=\"rtoc-2\"  class=\"wp-block-heading\">Cos\u2019\u00e8 un Context Manager?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Un <strong>Context Manager<\/strong> gestisce le risorse in modo sicuro e ordinato.<br>Definisce il comportamento durante <strong>l\u2019inizializzazione<\/strong> e la <strong>pulizia<\/strong> di un blocco di codice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Esempio: lavorare con i file<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">with open(&quot;file.txt&quot;, &quot;w&quot;) as f:\n    f.write(&quot;Ciao, mondo!&quot;)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 Pulizia automatica: il file verr\u00e0 chiuso anche se si verifica un\u2019eccezione.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 id=\"rtoc-3\"  class=\"wp-block-heading\">Perch\u00e9 i Context Manager sono utili<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pulizia automatica<\/strong> \u2013 le risorse vengono rilasciate automaticamente<\/li>\n\n\n\n<li><strong>Sicurezza in caso di errori<\/strong> \u2013 la pulizia avviene anche in caso di eccezioni<\/li>\n\n\n\n<li><strong>Leggibilit\u00e0 del codice<\/strong> \u2013 logica setup\/teardown in un unico punto<\/li>\n\n\n\n<li><strong>Riutilizzabilit\u00e0<\/strong> \u2013 adatto a file, locks, connessioni di rete o stdout<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 id=\"rtoc-4\"  class=\"wp-block-heading\">Uso di <code class=\"\" data-line=\"\">@contextmanager<\/code> da <code class=\"\" data-line=\"\">contextlib<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il decoratore <code class=\"\" data-line=\"\">@contextmanager<\/code> permette di creare context manager usando <strong>generatori<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from contextlib import contextmanager\n\n@contextmanager\ndef my_context():\n    print(&quot;Entriamo nel contesto&quot;)\n    resource = &quot;una risorsa&quot;\n    try:\n        yield resource\n    finally:\n        print(&quot;Usciamo dal contesto&quot;)\n\nwith my_context() as res:\n    print(&quot;Dentro il contesto:&quot;, res)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">Entriamo nel contesto\nDentro il contesto: una risorsa\nUsciamo dal contesto\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udca1 <strong>Spiegazione:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Codice prima di <code class=\"\" data-line=\"\">yield<\/code> \u2192 eseguito all\u2019ingresso<\/li>\n\n\n\n<li>Valore di <code class=\"\" data-line=\"\">yield<\/code> \u2192 disponibile come <code class=\"\" data-line=\"\">as res<\/code><\/li>\n\n\n\n<li>Codice dopo <code class=\"\" data-line=\"\">yield<\/code> \u2192 eseguito all\u2019uscita, anche in caso di eccezione<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Perfetto per <strong>modifiche temporanee dello stato globale<\/strong>, ad esempio per intercettare <code class=\"\" data-line=\"\">stdout<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-5\"  class=\"wp-block-heading\">\u26a1 Riepilogo: Context Manager per stdout\/stderr<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Scenario<\/th><th>Context Manager consigliato<\/th><\/tr><\/thead><tbody><tr><td>Intercettare solo <code class=\"\" data-line=\"\">print<\/code><\/td><td><code class=\"\" data-line=\"\">capture_stdout<\/code><\/td><\/tr><tr><td>Intercettare solo errori\/exception<\/td><td><code class=\"\" data-line=\"\">capture_stderr<\/code><\/td><\/tr><tr><td>Intercettare stdout e stderr insieme<\/td><td><code class=\"\" data-line=\"\">capture_output<\/code><\/td><\/tr><tr><td>Intercettare e mostrare simultaneamente<\/td><td><code class=\"\" data-line=\"\">capture_stdout_tee<\/code> \/ <code class=\"\" data-line=\"\">capture_output_tee<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-6\"  class=\"wp-block-heading\">\ud83d\udce6 Intercettare stdout<\/h2>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from contextlib import contextmanager\nimport sys, io\n\n@contextmanager\ndef capture_stdout():\n    old_stdout = sys.stdout\n    sys.stdout = buffer = io.StringIO()\n    try:\n        yield buffer\n    finally:\n        sys.stdout = old_stdout\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esempio:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">with capture_stdout() as out:\n    print(&quot;Questa stampa \u00e8 stata intercettata&quot;)\n\nprint(&quot;Intercettato:&quot;, out.getvalue())\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-7\"  class=\"wp-block-heading\">\ud83d\udd27 Intercettare stderr o entrambi i flussi<\/h2>\n\n\n\n<h3 id=\"rtoc-8\"  class=\"wp-block-heading\">Intercettare stderr<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">@contextmanager\ndef capture_stderr():\n    old_stderr = sys.stderr\n    sys.stderr = buffer = io.StringIO()\n    try:\n        yield buffer\n    finally:\n        sys.stderr = old_stderr\n<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-9\"  class=\"wp-block-heading\">Intercettare stdout + stderr<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">@contextmanager\ndef capture_output():\n    old_stdout = sys.stdout\n    old_stderr = sys.stderr\n    sys.stdout = sys.stderr = buffer = io.StringIO()\n    try:\n        yield buffer\n    finally:\n        sys.stdout = old_stdout\n        sys.stderr = old_stderr\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-10\"  class=\"wp-block-heading\">\ud83d\udd00 Modalit\u00e0 Tee: intercettare e mostrare<\/h2>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">class Tee(io.StringIO):\n    def __init__(self, original):\n        super().__init__()\n        self.original = original\n\n    def write(self, text):\n        self.original.write(text)\n        super().write(text)\n\n    def flush(self):\n        self.original.flush()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Context manager:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">@contextmanager\ndef capture_stdout_tee():\n    old_stdout = sys.stdout\n    sys.stdout = tee = Tee(old_stdout)\n    try:\n        yield tee\n    finally:\n        sys.stdout = old_stdout\n\n@contextmanager\ndef capture_output_tee():\n    old_stdout = sys.stdout\n    old_stderr = sys.stderr\n    sys.stdout = sys.stderr = tee = Tee(old_stdout)\n    try:\n        yield tee\n    finally:\n        sys.stdout = old_stdout\n        sys.stderr = old_stderr\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esempio:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">with capture_stdout_tee() as out:\n    print(&quot;Visibile e intercettato&quot;)\n\nprint(&quot;Contenuto Tee:&quot;, out.getvalue())\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-11\"  class=\"wp-block-heading\">\ud83d\udce6 File completo: <code class=\"\" data-line=\"\">stdout_capture.py<\/code><\/h2>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">&quot;&quot;&quot;\nUtility per intercettare stdout e stderr con context manager.\nSupporta:\n- intercettare stdout\n- intercettare stderr\n- intercettazione combinata\n- modalit\u00e0 Tee\n&quot;&quot;&quot;\n\nimport sys, io\nfrom contextlib import contextmanager\n\n@contextmanager\ndef capture_stdout():\n    old_stdout = sys.stdout\n    sys.stdout = buffer = io.StringIO()\n    try: yield buffer\n    finally: sys.stdout = old_stdout\n\n@contextmanager\ndef capture_stderr():\n    old_stderr = sys.stderr\n    sys.stderr = buffer = io.StringIO()\n    try: yield buffer\n    finally: sys.stderr = old_stderr\n\n@contextmanager\ndef capture_output():\n    old_stdout = sys.stdout\n    old_stderr = sys.stderr\n    sys.stdout = sys.stderr = buffer = io.StringIO()\n    try: yield buffer\n    finally:\n        sys.stdout = old_stdout\n        sys.stderr = old_stderr\n\nclass Tee(io.StringIO):\n    def __init__(self, original):\n        super().__init__()\n        self.original = original\n    def write(self, text):\n        self.original.write(text)\n        super().write(text)\n    def flush(self):\n        self.original.flush()\n\n@contextmanager\ndef capture_stdout_tee():\n    old_stdout = sys.stdout\n    sys.stdout = tee = Tee(old_stdout)\n    try: yield tee\n    finally: sys.stdout = old_stdout\n\n@contextmanager\ndef capture_output_tee():\n    old_stdout = sys.stdout\n    old_stderr = sys.stderr\n    sys.stdout = sys.stderr = tee = Tee(old_stdout)\n    try: yield tee\n    finally:\n        sys.stdout = old_stdout\n        sys.stderr = old_stderr\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-12\"  class=\"wp-block-heading\">\u2705 Esempi di utilizzo<\/h2>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from stdout_capture import capture_stdout, capture_output, capture_stdout_tee\n\ndef test_func():\n    print(&quot;Ciao dalla funzione&quot;)\n\n# Intercettare stdout\nwith capture_stdout() as out:\n    test_func()\nprint(&quot;stdout intercettato:&quot;, out.getvalue())\n\n# Intercettare stdout + stderr\ntry:\n    with capture_output() as out:\n        print(&quot;Qualcosa&quot;)\n        raise Exception(&quot;Oops!&quot;)\nexcept Exception:\n    pass\nprint(&quot;Output intercettato:&quot;, out.getvalue())\n\n# Intercettare e mostrare simultaneamente\nwith capture_stdout_tee() as out:\n    print(&quot;Visibile E intercettato&quot;)\nprint(&quot;Contenuto Tee:&quot;, out.getvalue())\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-13\"  class=\"wp-block-heading\">\u26a0\ufe0f Consigli pratici e avvertenze<\/h2>\n\n\n\n<h3 id=\"rtoc-14\"  class=\"wp-block-heading\">1\ufe0f\u20e3 Output molto grande<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">io.StringIO<\/code> pu\u00f2 consumare molta memoria con grandi quantit\u00e0 di dati<\/li>\n\n\n\n<li>Usa un file temporaneo:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">import sys, tempfile\n\nwith tempfile.TemporaryFile(mode=&#039;w+&#039;) as tmp:\n    old_stdout = sys.stdout\n    sys.stdout = tmp\n    try:\n        print(&quot;Molti dati...&quot;)\n        tmp.seek(0)\n        captured = tmp.read()\n    finally:\n        sys.stdout = old_stdout\n<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-15\"  class=\"wp-block-heading\">2\ufe0f\u20e3 Output dai subprocess<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">capture_stdout()<\/code> <strong>non intercetta<\/strong> l\u2019output di processi esterni<\/li>\n\n\n\n<li>Usa <code class=\"\" data-line=\"\">subprocess.PIPE<\/code>:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">import subprocess\nresult = subprocess.run(&#091;&quot;ls&quot;, &quot;-la&quot;], capture_output=True, text=True)\nprint(result.stdout)\n<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-16\"  class=\"wp-block-heading\">3\ufe0f\u20e3 Sicurezza nei thread<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">sys.stdout<\/code> e <code class=\"\" data-line=\"\">sys.stderr<\/code> sono globali \u2192 evitare di intercettare simultaneamente in pi\u00f9 thread<\/li>\n<\/ul>\n\n\n\n<h3 id=\"rtoc-17\"  class=\"wp-block-heading\">4\ufe0f\u20e3 Quando usare Tee<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Debug di funzioni con logging<\/li>\n\n\n\n<li>Strumenti CLI interattivi<\/li>\n\n\n\n<li>Test di integrazione con output su terminale<\/li>\n<\/ul>\n\n\n\n<h3 id=\"rtoc-18\"  class=\"wp-block-heading\">5\ufe0f\u20e3 Ripristinare i flussi<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ripristina sempre <code class=\"\" data-line=\"\">sys.stdout<\/code>\/<code class=\"\" data-line=\"\">sys.stderr<\/code> nel <code class=\"\" data-line=\"\">finally<\/code><\/li>\n<\/ul>\n\n\n\n<h3 id=\"rtoc-19\"  class=\"wp-block-heading\">6\ufe0f\u20e3 Evitare annidamenti profondi<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Molti intercettamenti possono mischiare l\u2019output. Usa un contesto per scenario.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"rtoc-20\"  class=\"wp-block-heading\">7\ufe0f\u20e3 Best Practices nei test<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Unit test \u2192 <code class=\"\" data-line=\"\">capture_stdout()<\/code> o <code class=\"\" data-line=\"\">capture_output()<\/code><\/li>\n\n\n\n<li>Debug manuale \u2192 modalit\u00e0 Tee<\/li>\n\n\n\n<li>Controlla <strong>il contenuto del buffer<\/strong>, non effetti collaterali<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Se vuoi, posso anche preparare una <strong>versione interattiva HTML\/JS<\/strong>, dove si pu\u00f2 eseguire il codice direttamente nel browser e vedere l\u2019output intercettato.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vuoi che lo faccia?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Python \u00e8 possibile intercettare ci\u00f2 che viene stampato a schermo tramite print().<br \/>\nQuesto \u00e8 utile per test, debug, logging o per sopprimere output \u201crumorosi\u201d.<br \/>\nTi mostrer\u00f2 come farlo in modo elegante \u2014 usando solo la libreria standard e poche righe di codice.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[610,1],"tags":[],"class_list":["post-3016","post","type-post","status-publish","format-standard","hentry","category-python-basics","category-uncategorized"],"acf":[],"_links":{"self":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/3016","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/comments?post=3016"}],"version-history":[{"count":0,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/3016\/revisions"}],"wp:attachment":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/media?parent=3016"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/categories?post=3016"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/tags?post=3016"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}