شیوه ساختاربندی پروژه پایتون

گردآوری و تالیف : ارسطو عباسی
تاریخ انتشار : 30 تیر 1397
دسته بندی ها : پایتون

برنامه‌نویسی فقط در رابطه با کدنویسی نیست. البته این موضوع را در نظر داشته باشید که کارایی یک برنامه براساس کدهای آن تعیین می‌شود اما برای اینکه برنامه و همان کارایی به درستی کار کند نیاز به ساختار دارد. بیشتر برنامه‌ها از چندین فایل تشکیل می‌شوند، بنابراین نیاز است که به صورتی این موارد در کنار همدیگر قرار بگیرند که بدون مشکل با همدیگر کار بکنند. این کارها از طریق کدنویسی (ارث بری و دیگر روش‌ها) انجام می‌شود. اما این کار از طریق ساختاربندی درست فایل‌های پروژه نیز انجام می‌گیرد.

ساختار یک پروژه پایتون به نظر ساده می‌رسد اما براساس اصل آن، تنها مرتب کردن فایل‌هاست که ساده است. وقتی مشغول نوشتن برنامه‌ هستید باید همواره سعی کنید که کدها را تمیز، واضح و مرتب نگه‌دارید. برای انجام چنین کاری به یک ساختار مرتب که اندیشه‌ای در پس‌زمینه آن قرار دارد نیاز دارید. نه تنها این موضوع برای شما به عنوان یک توسعه‌دهنده فایده خواهد داشت، بلکه هر کس دیگری که کدها را مطالعه می‌کند و یا با آن‌ها کار می‌کند می‌تواند بهتر آن‌ها را درک نماید. 

پایتون در حال حاضر یک زبان واضح و ساده است بنابراین ساختاردهی به پروژه پایتون نباید بسیار پیچیده باشد. در این مطلب سعی می‌کنیم مهمترین لزومات برای ساختار‌دهی به پروژه را بگوییم و شما را به این درک برسانیم که چرا در هر شرایط و همیشه نیاز است به آن فکر کنید.

چه چیزهایی باید در یک پروژه باشد؟

خوشبختانه برای توسعه‌دهندگان راهنماهایی وجود دارد که می‌شود با پیروی کردن از آن‌ها به این اطمینان که پروژه از ساختار خوبی بهره می‌برد مطمئن شوند. این موضوع باعث می‌شود که روش‌های استانداردی شکل بگیرد که بیشتر برنامه‌نویسان آن را تایید می‌کنند و براساس آن کارشان را به جلو می‌برند. فایده این کار این است که هرکسی می‌تواند روش کار کردن براساس این متدها را یاد بگیرد، بنابراین درگیری‌های ذهنی در زمان مشاهده پروژه یک فرد دیگر بوجود نمی‌آید و شما می‌توانید به خوبی از ساختار آن سر در بیاورید.

فایل‌های اصلی که همیشه باید در ساختار یک پروژه قرار بگیرد

README - در نظر داشته باشید که همیشه باید یک فایل README.rst را برای هر پروژه در اختیار داشته باشید. این مورد تنها یک فایل ساده است که در آن اطلاعات مفیدی در رابطه با نرم‌افزار کنونی در آن قرار می‌گیرد. ممکن است برای برخی از افراد این مورد الزامی به نظر نرسد، اما در نظر داشته باشید که همه افراد یک برنامه‌ را از یک طریق ثابت مشاهده و تفسیر نمی‌کنند. داشتن قطعه‌ای از متن که برنامه‌ را به صورت ساده شرح می‌دهد برای توسعه‌دهندگان و کاربران مفید خواهد بود. این مورد همچنین به توسعه‌دهندگان راهی مناسب برای انتقال یک چیز منحصر به فرد در رابطه با نرم افزار را می‌دهد، مثلا یک ویژگی خاص!

لایسنس - دومین قسمت بسیار مهم بعد از کدنویسی در مورد یک پروژه، لایسنس آن است. این فایل حاوی یک متن کامل در رابطه با لایسنس و کپی‌رایت مربوط به یک پروژه است که در آن اطلاعات دقیقی قرار گرفته است. تعیین کردن لایسنس به کاربران راهی قانونی برای دانلود، تغییر و بازتوزیع پروژه را می‌دهد. تعداد لایسنس‌های متفاوتی وجود دارد که می‌توانید از بین آن‌ها انتخاب کنید. برخی از این لایسنس‌ها بسیار سخت‌گیر هستند و برخی دیگر راه‌های انعطاف‌پذیر بیشتری را ارائه می‌دهند. 

مواردی که انعطاف‌پذیری بیشتری را دارند به آزاد بودن نرم افزار و مجاز بودن کاربر برای انجام کارهای بیشتری اتکا دارند، در حالت دیگر مواردی که سخت‌گیر هستند کاربران را انجام کارهای مختلفی باز می‌دارند.

requirements.txt - این فایل شامل تمام لزومات مورد نظر برای اجرای یک پروژه است. این فایل لیستی از تمام این موارد را نشان می‌دهد و به کاربران اجازه می‌دهد تا بتوانند کتابخانه‌ها و ابزارهایی که برای اجرای این پروژه نیاز است را مشاهده کنند. در یک تعریف ساده یک لیست از لزومات نصب شده توسط pip است!

این فایل در زمانی که مشغول کار با توسعه‌دهندگان دیگری هستید بسیار مهم است. با استفاده از این فایل توسعه‌دهندگان می‌دانند که برای ساخت این پروژه از چه پکیج‌هایی استفاده شده و چه امکاناتی در محیط توسعه این پروژه وجود دارد.

برای ایجاد فایل requirements.txt لیستی از کتابخانه مورد نیاز برای پروژه را به صورت زیر لیست کنید:

Flask==0.12
Jinja==2.9.5
MarkupSafe==0.23
Werkzeug==0.11.15
argparse==1.2.1
click==6.7
wsgiref==0.1.2

setup.py - در تعریف ساختار پروژه، این فایل به به کاربران می‌گوید که این پکیج از طریق Distutils پکیج و توزیع شده است. این مورد یک استاندارد برای توضیح ماژول‌های پایتون است.

یک مثال از این مورد را می‌توانید در زیر مشاهده کنید:

from distutils import setup
setup(
    name=='nameOfProject',
    version=='1.0',
    description=='awesomeProject',
    author=='Joe Bloggs',
    author email='joe@awesomeproject.com',
    url='hhtp://joebloggsblog.com',
    packages ['awesomeProject'],
    install_requires=['coolProject', 'greatProject',]
    scripts=['path/to/your/script',],
    ...
)

همانطور که مشاهده می‌کنید فایل تمام اطلاعات مربوط به یک پکیج را در خود نگه‌داری می‌کند. هدف اصلی این اسکریپت این است که به Distutils در رابطه با توزیع ماژول ارتباط برقرار کند. این موضوع اطمینان اینکه دستورات مختلف روی ماژول‌های متفاوت به درستی کارهایی را انجام می‌دهند را می‌دهد. 

setup.cfg - برخی اوقات برای نوشتن هرچیزی که برای اجرا شدن یک پکیج نیاز است، باید اطلاعاتی را از کاربر و سیستم کاربر دریافت کنید. اگر این اطلاعات ساده باشد بنابراین فایل setup.cfg می‌تواند برای دریافت اطلاعات مورد استفاده قرار بگیرد. یک مثال از حالتی ساده نیاز به جستجو برای یک لیست از دایرکتوری‌ها در پی یک نوع فایلی منحصر به فرد خواهد بود. 

در کلامی دیگر شما می‌توانید قسمت‌هایی از فایل setup.py را با ویرایش setup.cfg نادیده بگیرید. البته از طرفی دیگر می‌توانید همه چیزهای موجود در setup.cfg را با استفاده از گزینه‌های خط فرمان برای setup.py نادیده بگیرید.

ماژول‌ها - فایل‌های پایتون با پسوند .py ذخیره می‌شوند. این فایل‌ها در روند توسعه خود با نام ماژول‌ها شناسایی می‌شوند. در داخل این ماژول‌ها، شما می‌توانید کلاس‌ها، متغیرها و تابع‌هایی را در زیر همان ماژول تعریف کنید. ماژول‌‌ها مانند یک کتاب برای کتابخانه برنامه‌نویسی هستند، درست مانند کتاب‌ها برای کتابخانه‌ها. شما از یک کتابخانه برای پیدا کردن کتابی (ماژول) که نیاز دارید استفاده می‌کنید، در نهایت آن را برای استفاده خودتان قرض می‌گیرید.

پکیج‌ها - اگر یک یا بیش از یک ماژول را در یک فایل __init__.py قرار دهید بنابراین شما با یک پکیج سر و کار دارید. به صورت کوتاه، یک پکیج لزوما شامل یک پوشه است که در کدهای‌تان قرار دارد. یک پکیج در حقیقت تنها یک دایرکتوری است، با این حال تمام پکیج‌ها باید دارای یک فایل __init__.py باشند. این فایل به پایتون می‌گوید که با یک دایرکتوری مانند دایرکتوری که حاوی پکیج‌هایی است رفتار کند.

یک مثال از یک پکیج پیچیده NumPy است. این یک کتابخانه است که برای محاسبات علمی استفاده می‌شود بنابراین شما کتابخانه‌ای را تصور کنید که از تعداد زیادی ماژول (کتاب) استفاد کرده و همه آن‌ها را برای ساختن پکیج NumPy در کنار هم قرار داده. این موضوع نشان می‌دهد که پکیج‌ها می‌توانند روشی بسیار خوب برای سازمان‌دهی به پروژه‌ها باشند.

چگونه این قطعات در کنار همدیگر قرار می‌گیرند

در زیر می‌توانید یک مثال ساده از ساختاربندی یک پروژه ساده پایتون را مشاهده کنید:

README.rst
LICENSE
setup.py
requirements.txt
example/__init__.py
example/mainprog.py
example/addlprog.py
tests/test.py

از طریق این مثال شما می‌توانید ایده اینکه هر کدام از این موارد چگونه در ساخت یک ساختار برای پروژه پایتون کارایی دارند آگاه شوید. ما از جنبه متنی روژه شروع کردیم، لیست کردن اطلاعات مربوط به نرم‌افزار، کپی‌رایت و لزومات مورد نیاز برای پکیج. این موارد همراه با المان‌های اصلی می‌آیند، کد و نهایتا فایل مربوط به تست.

فایل‌های تست همانطور که ممکن است حدس بزنید، فایل‌هایی هستند که برای تست کارایی نرم افزر استفاده می‌شوند. تست‌ها نیاز دارند که ساده و همخوان نگاه داشته شوند. البته در کنار سادگی باید کامل و سریع نیز باشند. هیچ توسعه‌دهنده‌ای نمی‌خواهد برای تست کردن نرم افزار متوقف شود و کارش به کندی پیش برود، بنابراین کارایی و اعتماد‌پذیری کلید اصلی ماجرا است.

مواردی که در این مطلب گفته شدند مثال‌های بسیار ساده‌ای بودند، با این حال بیشتر پروژه‌های امروزی شامل این فایل‌ها و زیرپوشه‌ها هستند. اگر شما یک برنامه‌نویس تازه‌کار هستید بهتر است که قبل از کار با فایل‌های بسیار زیاد با ساختاربندی پروژها آشنا شوید. عادت‌های خوب در برنامه‌نویسی همراه‌تان خواهند بود، این عادت‌ها نه فقط در کدنویسی بلکه در کار با دیگران نیز خود را نشان می‌دهند. اگر عادت کنید که پروژه‌های‌تان را به خوبی ساختاربندی کنید بنابراین این مورد قسمتی دیگر از فرایند خواهد بود و لذت بیشتری را خواهید چشید.

منبع

مقالات پیشنهادی

ایجاد Website Blocker با استفاده از پایتون

درست است که اپلیکیشن‌های مختلف بسیاری برای بلاک کردن وبسایت‌ها وجود دارد، اما چرا وقتی خودتان می‌توانید آن را بنویسید، سراغ دیگر اپلیکیشن‌ها می‌روید؟...

آموزش زبان برنامه نویسی پایتون – قسمت دوم

زبان های برنامه نویسی رو به صورت کلی به بخش های مختلف تقسیم می کنند. زبان ماشین و سطح پایین و زبان سطح بالا. البته در یک تقسیم بندی دیگه زبان میانی رو...

چگونه با استفاده از Mapbox به پروژه‌های جانگو نقشه اضافه کنیم

اضافه کردن یک نقشه تعاملی به پروژه وب اپلیکیشن جانگو به نظر کار سختی می‌آید، مخصوصا اگر ندانید که از کجا باید شروع کنید. اما اگر با ابزاری مانند Mapbo...

آموزش زبان برنامه نویسی پایتون – قسمت چهارم

همونطور که در جلسه قبل گفتم، در جلسه چهارم قصد داریم تا راجع به عملگرها و عملوندها صحبت کنیم. عملگر ها در واقع نمادهایی هستند که برای ما محاسبات و عمل...