<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vinícius Muniz de Melo</title>
    <description>The latest articles on DEV Community by Vinícius Muniz de Melo (@vinimelo).</description>
    <link>https://dev.to/vinimelo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F221536%2F5c6a9313-8db6-4bea-81dc-da9eed5b33ce.jpeg</url>
      <title>DEV Community: Vinícius Muniz de Melo</title>
      <link>https://dev.to/vinimelo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vinimelo"/>
    <language>en</language>
    <item>
      <title>Callable Python</title>
      <dc:creator>Vinícius Muniz de Melo</dc:creator>
      <pubDate>Tue, 10 Jan 2023 13:45:24 +0000</pubDate>
      <link>https://dev.to/vinimelo/callable-python-h4m</link>
      <guid>https://dev.to/vinimelo/callable-python-h4m</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Python has a lot of magic methods that can be really confusing sometimes.&lt;br&gt;
We often do not realize the real need for a particular method, or we don't know how to apply it in the real world.&lt;br&gt;
In this post, I'll explain a real use of one of them, the infamous &lt;code&gt;__call__&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Abstract Class
&lt;/h2&gt;

&lt;p&gt;The Python language has abstract class support&lt;br&gt;
&lt;a href="https://docs.python.org/pt-br/3/library/collections.abc.html#collections.abc.Callable"&gt;Callabe&lt;/a&gt;, which helps us to create a class compatible with the Callable protocol, creating a class that inherits from Callable helps us in the correct implementation of the same.&lt;/p&gt;

&lt;p&gt;To use this abstract class, you only need to import it from the abc library: &lt;code&gt;from collections.abc import Callabe&lt;/code&gt; and inherit it in your own class. &lt;/p&gt;
&lt;h2&gt;
  
  
  usage
&lt;/h2&gt;

&lt;p&gt;Let's use an example, using a Mapper directly from an ORM (in this case, [SQLAlchemy()]), for a domain object, or class. That is, we will transform the ORM fields into a Python object without any coupling or external dependencies.&lt;/p&gt;

&lt;p&gt;Callable Class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;.dog_domain&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;collections.abc&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DogMapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;staticmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_domain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dog&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_domain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ORM Class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;.dog_mapper&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DogMapper&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;primary_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;legs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;DogMapper&lt;/span&gt;&lt;span class="p"&gt;()(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Domain Class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;legs&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;

    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;clasmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legs&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Explanation
&lt;/h2&gt;

&lt;p&gt;In this case, we use the &lt;strong&gt;mapper&lt;/strong&gt; property to initialize the mapper, and the conversion to the domain object automatically. This facilitates enough if we had to get some class by id, then import the Mapper and then perform the conversion in the end.&lt;/p&gt;

&lt;p&gt;Done this way, &lt;strong&gt;callable&lt;/strong&gt; is only used on demand, and when necessary. Thus, we do not carry out the conversion without a real need.&lt;/p&gt;

&lt;p&gt;That way, we can use the mapper directly from the model, right after, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;mapper&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this post I tried to demonstrate a real use of a Callable class, I hope that has helped! &lt;br&gt;
If you have any questions or suggestions, don't hesitate to comment. 😉&lt;/p&gt;

&lt;p&gt;See ya!&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.oreilly.com/library/view/fluent-python-2nd/9781492056348/"&gt;Fluent Python&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.oreilly.com/library/view/clean-architecture-a/9780134494272/?_gl=1*oabtnq*_ga*NDY5NTUwNzQ3LjE2NzMzNTgwOTg.*_ga_092EL089CH*MTY3MzM1ODEwMC4xLjEuMTY3MzM1ODExNC40Ni4wLjA."&gt;Clean Architecture&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software-ebook/dp/B00794TAUG/ref=sr_1_1?crid=38ZVRV16CDUMU&amp;amp;dchild=1&amp;amp;keywords=domain+driven+design&amp;amp;qid=1588281345&amp;amp;s=books&amp;amp;sprefix=domain+driven%2Cstripbooks-intl-ship%2C358&amp;amp;sr=1-1"&gt;Domain Driven Design&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Hobbies Nao Projetos</title>
      <dc:creator>Vinícius Muniz de Melo</dc:creator>
      <pubDate>Mon, 11 May 2020 13:40:33 +0000</pubDate>
      <link>https://dev.to/vinimelo/hobbies-nao-projetos-4g7b</link>
      <guid>https://dev.to/vinimelo/hobbies-nao-projetos-4g7b</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mA8jK4Hg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://vinimelo.dev/images/hobbies-vs-projects/crosswords.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mA8jK4Hg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://vinimelo.dev/images/hobbies-vs-projects/crosswords.jpg" alt="crosswords"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Na vida de uma pessoa da área de tecnologia, sempre pensamos um passo à frente&lt;br&gt;
em nossas carreiras, no próximo projeto, na próxima grande mudança de emprego,&lt;br&gt;
naquela palestra que te dará visibilidade ou mesmo naquela contribuição em&lt;br&gt;
projetos Open Source que fará toda a diferença em algum momento no futuro.&lt;/p&gt;

&lt;p&gt;Hoje quero dizer que isso, na verdade, não importa tanto!&lt;/p&gt;

&lt;h2&gt;
  
  
  Projetos Pessoais
&lt;/h2&gt;

&lt;p&gt;Crescimento pessoal, evolução e grandes objetivos são as frases que todo coach&lt;br&gt;
diz e, nós mesmos, já até internalizamos esse tipo de atitude sempre que iniciamos&lt;br&gt;
algo ou para planejar nossas vidas e ações. Mas isso não é o que realmente importa.&lt;/p&gt;

&lt;p&gt;Em um mundo cada vez mais preocupado com o &lt;strong&gt;ter&lt;/strong&gt;, e não com o &lt;strong&gt;ser&lt;/strong&gt;, estamos perdendo&lt;br&gt;
oportunidades ótimas de nos desenvolvermos fora das telas do computador; hoje em dia o&lt;br&gt;
diferente não é ter milhares de sites criados, um portfólio imenso ou contribuído em &lt;br&gt;
inúmeros projetos Open Source, o diferente é fazer escalada nos sábados, andar de bicicleta&lt;br&gt;
pro trabalho, fazer Ioga todas as quartas ou jogar tênis de mesa toda terça e quinta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vocabulário
&lt;/h2&gt;

&lt;p&gt;Nosso vocabulário mundano tem diminuído muito com a extrema especialização que estamos vivendo,&lt;br&gt;
cada vez mais as pessoas se juntam com outras pessoas similares, que falam e fazem sempre as&lt;br&gt;
mesmas coisas e que, juntos, parecem mais uma colônia de formigas do que seres humanos únicos,&lt;br&gt;
criativos e cativantes.&lt;/p&gt;

&lt;p&gt;Àquela conversa no meio do cafézinho está cada vez mais rasa, não conseguimos deixar de tocar&lt;br&gt;
no assunto trabalho, nós não somos os nossos trabalhos. Há muito mais vida fora do trabalho&lt;br&gt;
do que dentro dele, nós trabalhamos para viver ou vivemos para trabalhar? Não existe mais nada&lt;br&gt;
de interessante fora nossa bolha? E fora do nosso trabalho? &lt;/p&gt;

&lt;p&gt;Sem falar nas nossas crenças, calorosas e opinativas. Sabemos de tudo mas, ao mesmo tempo, não &lt;br&gt;
sabemos de nada. Não vivemos mais sem o Google ou o Wikipédia, nossas falas estão marcadas&lt;br&gt;
por aquilo que ouvimos falar e não por aquilo que realmente vivenciamos ou sentimos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OJi3mfXQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://vinimelo.dev/images/hobbies-vs-projects/rock-climbing-in-the-black-hills-1361456-1920x1440.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OJi3mfXQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://vinimelo.dev/images/hobbies-vs-projects/rock-climbing-in-the-black-hills-1361456-1920x1440.jpg" alt="Climbing a rock"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hobbies
&lt;/h2&gt;

&lt;p&gt;E, talvez, a salvação desse destino sejam os Hobbies...&lt;/p&gt;

&lt;p&gt;Criar novas formas de se divertir, experimentar uma caminhada na praia, ler um livro ao pôr do sol,&lt;br&gt;
sair do computador. &lt;/p&gt;

&lt;p&gt;Tentar entender o que o outro sente, realmente se importar com outras pessoas e não somente com o que&lt;br&gt;
ela faz, com o que ela têm ou com quem ela anda.&lt;/p&gt;

&lt;p&gt;Somos mais do que isso e podemos ser melhores do que estamos sendo.&lt;/p&gt;

&lt;p&gt;A evolução na vida não se dá só por aquilo que entregamos, mas como entregamos, com empatia,&lt;br&gt;
com respeito e entendendo a real necessidade do outro lado.&lt;/p&gt;

&lt;p&gt;Que criemos novos Hobbies, novas formas de ver o mundo, novos horizontes, novas perspectivas&lt;br&gt;
e não novos projetos!&lt;/p&gt;

&lt;h3&gt;
  
  
  Fim
&lt;/h3&gt;

&lt;p&gt;Quer ver mais posts como esse?&lt;br&gt;
Veja no &lt;a href="https://vinimelo.dev"&gt;meu blog&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
    </item>
    <item>
      <title>Callable Python</title>
      <dc:creator>Vinícius Muniz de Melo</dc:creator>
      <pubDate>Sat, 09 May 2020 19:42:55 +0000</pubDate>
      <link>https://dev.to/vinimelo/callable-python-10ng</link>
      <guid>https://dev.to/vinimelo/callable-python-10ng</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Python tem diversos métodos mágicos que, às vezes, podem ser realmente confusos.&lt;br&gt;
Muitas vezes não percebemos a real necessidade de um determinado método, ou não&lt;br&gt;
sabemos como aplicá-lo no mundo real.&lt;/p&gt;

&lt;p&gt;Nesse post, explicarei uma utilização real de um deles, o famoso &lt;code&gt;__call__&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Classe Abstrata
&lt;/h2&gt;

&lt;p&gt;A linguagem Python tem suporte à classe abstrata&lt;br&gt;
&lt;a href="https://docs.python.org/pt-br/3/library/collections.abc.html#collections.abc.Callable"&gt;Callabe&lt;/a&gt;,&lt;br&gt;
que nos auxilia na criação de uma classe compatível com o protocolo Callable,&lt;br&gt;
criando uma classe que herde de Callable nos auxilia na correta implementação da&lt;br&gt;
mesma.&lt;/p&gt;

&lt;p&gt;Para utilizar esse classe abstrata basta importá-la da biblioteca abc: &lt;code&gt;from&lt;br&gt;
collections.abc import Callabe&lt;/code&gt; e herdá-la na sua própria classe.&lt;/p&gt;
&lt;h2&gt;
  
  
  Utilização
&lt;/h2&gt;

&lt;p&gt;Nesse post, irei exemplificar com a utilização de um Mapper direto de um ORM (no&lt;br&gt;
caso, &lt;a href=""&gt;SQLAlchemy&lt;/a&gt;), para um objeto, ou classe, de domínio.&lt;br&gt;
Ou seja, iremos transformar os campos do ORM, para um objeto Python sem nenhum&lt;br&gt;
acoplamento ou dependências externas.&lt;/p&gt;

&lt;p&gt;Classe Callable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;.dog_domain&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;collections.abc&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DogMapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;staticmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_domain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dog&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_domain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Classe ORM de exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;.dog_mapper&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DogMapper&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;primary_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;legs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;DogMapper&lt;/span&gt;&lt;span class="p"&gt;()(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Classe de domínio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;legs&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;

    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;clasmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legs&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Explicação
&lt;/h2&gt;

&lt;p&gt;Nesse caso, utilizamos a property &lt;strong&gt;mapper&lt;/strong&gt; para realizar a inicialização do&lt;br&gt;
mapper, e a conversão para o objeto de domínio automaticamente. O que facilita&lt;br&gt;
bastante caso tivéssemos que obter alguma classe por id, depois importar o&lt;br&gt;
Mapper e depois realizar a conversão.&lt;/p&gt;

&lt;p&gt;Feito dessa forma, o &lt;strong&gt;callable&lt;/strong&gt; é utilizado somente sob demanda, e quando&lt;br&gt;
necessário. Assim não realizamos a conversão sem que haja real necessidade.&lt;/p&gt;

&lt;p&gt;Assim, podemos utilizar o mapper diretamente do model, logo na sequência, &lt;br&gt;
como por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;mapper&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Nesse post tentei demonstrar uma utilização real de uma classe Callable, espero&lt;br&gt;
que tenha ajudado! &lt;br&gt;
Caso tenha alguma dúvida, ou sugestão, não hesite em comentar. 😉&lt;/p&gt;

&lt;p&gt;Nos vemos por aí!&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Python-Fluente-Em-Portuguese-Brasil/dp/857522462X"&gt;Python Fluente&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Arquitetura-Artesao-Estrutura-Software-Portugues/dp/8550804606/ref=sr_1_1?dchild=1&amp;amp;keywords=arquitetura+limpa&amp;amp;qid=1588281300&amp;amp;s=books&amp;amp;sr=1-1"&gt;Clean Architecture&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software-ebook/dp/B00794TAUG/ref=sr_1_1?crid=38ZVRV16CDUMU&amp;amp;dchild=1&amp;amp;keywords=domain+driven+design&amp;amp;qid=1588281345&amp;amp;s=books&amp;amp;sprefix=domain+driven%2Cstripbooks-intl-ship%2C358&amp;amp;sr=1-1"&gt;Domain Driven Design&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mais posts como esse, olhe no &lt;a href="https://vinimelo.dev"&gt;meu blog&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
    </item>
  </channel>
</rss>
