<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمدحسین</title>
        <link>https://virgool.io/feed/@Mhs</link>
        <description>برنامه نویس؟</description>
        <language>fa</language>
        <pubDate>2026-06-17 05:54:47</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1252/avatar/Vrhl2G.jpeg?height=120&amp;width=120</url>
            <title>محمدحسین</title>
            <link>https://virgool.io/@Mhs</link>
        </image>

                    <item>
                <title>احتمالا شما پایتون بلد نیستید - قسمت اول</title>
                <link>https://virgool.io/@Mhs/%D8%A7%D8%AD%D8%AA%D9%85%D8%A7%D9%84%D8%A7-%D8%B4%D9%85%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%A8%D9%84%D8%AF-%D9%86%DB%8C%D8%B3%D8%AA%DB%8C%D8%AF-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-vdtinqpllywd</link>
                <description>پیش گفتارخیلی وقته که تو ذهنم هست همچین چیزی بنویسم. مهم ترین علتش هم اینه که خیلی از اطرفیانم رو میبینم که خودشون رو Python Developer میدونن اما وقتی یک سری سوال ازشون میپرسم، جوابش رو نمیدونند. این سوال‌ها گاهی راجب ورژن های جدید پایتون و چیزهایی هست که میتونه کد مارو تمیز تر و خواناتر بکنه، گاهی راجب ساختمان داده های پایتون و تفاوت هاشونه و گاهی هم راجب بعضی ویژگی های پایتونه که خیلی جاها به کمکمون میاد. پس تصمیم گرفتم این سری مقالات رو شروع کنم که هم خودم موقع نوشتنشون بفهمم که کجا هارو خوب درک نکردم (چیزی رو که نتونی توضیح بدی، نفهمیدی) و هم اینکه خوشحال میشم اگر بتونم بخشی از سواد کم خودم رو به بقیه منتقل کنم.مقدمهبرای این قسمت میخوام به Type Hints که توی پایتون 3.5 اومد اشاره کنم. طبق تجربه‌ی خود من توی پروژه هایی که خیلی بزرگ میشن و چندین نفر دارن روی اون پروژه به طور همزمان کار میکنن،‌ این ویژگی خیلی کارآمده. با مشخص کردن نوع متغیر، نوع ورودی و خروجی های تابع قدرت های جدیدی به دست میاریم!کد خوانا تری داریم و اصطلاحا Self-documenting code داریم.خیلی از ادیتورها میتونن با استفاده از این Type Hint ها، پیشنهادهای دقیق‌تری به شما بدن.میشه در جاهایی مثل CI/CD Pipeline ها، بر روی کد ها Static Analysis انجام بدیم.میشه از خیلی از RuntimeError ها پیشگیری کنیم.تعریف Type Hintsعلت اینکه اسم این پروپوزال Type Hints هست اینه که این ویژگی هیچ اجباری به همراه نداره! بزارید با یک مثال بهتر توضیح بدم:کد بالا همونطور که از اسمش مشخصه، قراره دو تا عدد رو جمع کنه. طبق تعریف تایپ، مقدار های ورودی و خروجی باید از نوع integer باشند. اما اگر به جای یکی از مقادیر ورودی، مقداری از نوع float وارد کنید میبینید که عملیات جمع بدون هیچ مشکلی انجام میشه و خروجی هم float میشه که کاملا برخلاف تعریف ماست.اگر بخوام واضح تر بگم، این ویژگی به خودی خود قرار نیست کاری انجام بده! و طبق عبارت زیر که از خود پروپوزال برداشته شده، قرار هم نیست که پایتون Static Type بشه.It should also be emphasized that Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, even by convention.پس هدف این پروپوزال چیه؟ سینتکس استاندارد برای type annotationsراحت شدن Static Analysis (آنالیز بدون اجرای کد)راحت شدن ریفکتورقابلیت بررسی تایپ ها در زمان اجرابرای بهره‌مند شدن از این ویژگی‌ها نیاز به استفاده از ابزاری مثل mypy دارید. استفاده ازش میتونه برای کسایی که تا الان فقط با زبان های Dynamic Type کار کردن، شکنجه باشه. اما تاثیر مثبتش رو توی پروژه های بزرگ میتونید ببینید.خوب! برای ادامه یک مثال میزنم و با استفاده از mypy تستش میکنیم.همونطور که از روی کد مشخصه، یک کلاس مستطیل داریم که طول و عرض رو به عنوان ورودی میگیره. این دو مقدار باید int باشند. یک تابع هم به نام print_rectangle داریم که کارش، تبدیل کلاس rectangle به string و چاپ کردن اون هست. ورودی این تابع یک شی از نوع کلاس Rectangle هست. در نهایت یک instance از کلاسمون ساختیم و اون رو به تابع print_rectangle دادیم اما همونطوری که میبینید، مقادیر طول و عرض رو به صورت string دادیم که با تایپی که مشخص کردیم همخونی نداره.قطعه کد رو با استفاده از پایتون اجرا میکنیم. خروجی که مشاهده میکنیم این هست:Width: 5
Length: 3خوب،‌ همونطور که میبینید،‌ کد ما بدون هیچ مشکلی اجرا شد! چرا؟ چون هیچ قسمتی از کد نیازی به int بودن این مقادیر نداشت، مقادیر string ما بدون هیچ مشکلی داخل کلاس قرار گرفتند و چاپ شدند. حالا این کد رو با استفاده از mypy اجرا میکنیم. خروجی که مشاهده میکنیم این هست:01-type_hints.py:14: error: Argument 1 to &amp;quotRectangle&amp;quot has incompatible type &amp;quotstr&quot; expected &amp;quotint&amp;quot
01-type_hints.py:14: error: Argument 2 to &amp;quotRectangle&amp;quot has incompatible type &amp;quotstr&quot; expected &amp;quotint&amp;quot
Found 2 errors in 1 file &#40;checked 1 source file&#41;همونطور که دیدید، چون int بودن این مقادیر توی این مثال برای پایتون مهم نبود،‌ موقع اجرا به مشکلی نخوردیم. حالا مثال رو به شکل زیر تغییر میدم:حالا یه تابع محیط داریم که براش مهمه که مقدار طول و عرض قابل ضرب شدن باشه (هر دو عدد باشند). اگر این کد رو با پایتون اجرا کنیم، TypeError میگیریم. این مشکل رو میتونستیم از اول با یکبار اجرا کردن کد با mypy متوجه بشیم و اصلاحات لازم رو انجام بدیم.این یک نمونه ساده از Type Hint ها بود. در کد های دیگه ممکنه گاهی برای نوع تایپ گنگ بشیم. برای نمونه، همین مثالی که زدم، تابع print_rectangle خروجی نداشت، برای همین خروجی تابع رو None مشخص کردیم (اصطلاحا تابع void هست).یک سری از تایپ ها برای تعریف نیاز به import شدن دارند. قطعه کد زیر از داخل پروپوزال برداشته شده و مثال خوبی برای این تایپ هاست.کلاسی ساخته شده به نام SymbolTable که از Dict ارث بری شده. اما یک Dict خاص که کلید های اون از نوع string و مقادیر اون لیستی از نوع Node هستند. میبینید که این تایپ ها از کتابخونه‌ی typing داخل کد import شدند. تابعی مثل lookup که وظیفه پیدا کردن یک کلید خاص داخل این دیکشنری رو داره، الزاما همیشه اون کلید رو پیدا نمیکنه. پس خروجی این تابع نمیتونه از نوع Node باشه پس در عوض خروجی تابع رو از نوع Optional[Node] قرار میدیم که به این معناست که خروجی این تابع ممکن هست None یا یک Node باشه.TL;DRمشخص کردن تایپ به معنای Static Type شدن نیست و پایتون Dynamic Type خواهد ماند.قدرت واقعی این قابلیت در کد های بزرگ و برای جلوگیری از بسیاری از RuntimeError هاست.برای static analysis میتونید از mypy استفاده کنید.برای مشخص کردن تایپ از نوع List یا Dict لازم است از کتابخانه داخلی پایتون به نام typing استفاده کنید.</description>
                <category>محمدحسین</category>
                <author>محمدحسین</author>
                <pubDate>Tue, 25 Feb 2020 00:42:35 +0330</pubDate>
            </item>
                    <item>
                <title>اسکریپت نویسی برای تنبلی</title>
                <link>https://virgool.io/@Mhs/%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AA%D9%86%D8%A8%D9%84%DB%8C-lznjcrmykcct</link>
                <description>https://realpython.com/python-speech-recognition/:منبع عکسمثل هر شب در حال گشتن تو وب بودم، داشتم توی Medium یه مقاله میخوندم که به یه لغت خوردم که خواستم ترجمه اش کنم. بعد دیدم تلفظ صحیحش هم ببینم حالا که تا اینجا اومدم! دیدم که هیچ چیزی ندارم که برام لغت رو بخونه و گوگل ترنسلیت هم خیلی دوره! با یه سرچ زدن دیدم که یه tts هست به نام espeak و نصبش کردم و دیدم که صدای رباتیش رو اصلا دوست ندارم و خیلی اذیت کننده اس!به سرچ ادامه دادم تا اینکه دیدم یکی حدود چهار سال پیش از API گوگل ترنسلیت گذاشته که خوشحال و خندان اومدم تست کردم و دیدم کار نمیکنه (T_T)تصمیم خودم رو گرفته بودم و نمیتونستم با خود یه دنده ام کنار بیام، سریع رفتم توی سایت api های گوگل و سرویس tts رو پیدا کردم! یه قسمت داشت که میشد هر متنی رو بهش میدی بخونه و میشد کانفیگ هم روش انجام بدی. از Inspect Element قسمت Network ریکوئست رو برداشتم و آوردم توی پایتون. کار سختی نبود،یه ورودی بگیربزارش توی payloadبا کامند لاین اجراش کن (چون تحریمیم میخواستم از proxychains استفاده کنم، نصف شبی حوصله ی کار با requests رو نداشتم P: )خروجی رو دیکد کن (base64 میداد فایل خروجی رو)بایت کد هارو توی فایل ذخیره کندر اخر هم فایل رو پخش کنقطعا راه های خیلی راحت تری هم میتونست وجود داشته باشه و همچنین میشه اصلا گفت چرا از این راه استفاده کنم؟ عین بچه ادم میرم تو گوگل ترنسلیت و لغت مورد نظرم رو کپی و پیست میکنم و خیلی راحت تر ازش استفاده میکنم. یا اصلا از پلاگین های مختلفی که هست استفاده میکنم. اما یه چیز مهم تر هست که باید درنظر گرفت، با حس درونیم که داره بهم میگه میتونی این کار رو انجام بدی یا نه باید چیکار کنم؟ چطوری میشه خودت رو قانع کنی که بلدی و از چالش ها بگذری؟ :) در هر صورت این کاری بود که باید انجام میدادم به هر قیمتی که شده :)کدش رو میتونید تو قسمت زیر ببینید. کد نسبتا کثیفیه ولی خو قرار هم نیست جز یه رفع نیاز ساده کار دیگه ای بکنه. اگر لینک رو تو gist باز کنید توی اولین کامنت توضیح دادم که چطوری باید داخل GoldenDict ازش استفاده بکنید. https://gist.github.com/Mhs-220/1b6cb50772ee7f54235125515d98fb77 امیدوارم همیشه سعی کنید چالش هایی که به ذهنتون میاد رو حل کنید :)</description>
                <category>محمدحسین</category>
                <author>محمدحسین</author>
                <pubDate>Wed, 03 Apr 2019 22:55:36 +0430</pubDate>
            </item>
            </channel>
</rss>