ساخت ماژول در پایتون — آموزش ایجاد ماژول به زبان ساده

۳۰۵۴ بازدید
آخرین به‌روزرسانی: ۲۱ دی ۱۴۰۱
زمان مطالعه: ۱۰ دقیقه
دانلود PDF مقاله
ساخت ماژول در پایتون — آموزش ایجاد ماژول به زبان ساده

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

997696

ماژول چیست ؟

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

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

ماژول در پایتون

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

انواع ماژول در پایتون کدامند ؟

زبان برنامه‌نویسی پایتون یکی از زبان‌های برنامه‌نویسی شئ‌گرا محسوب می‌شود که از رویکرد برنامه‌نویسی ماژولار پشتیبانی می‌کند؛ به عبارتی، می‌توان از کدهایی که به صورت مکرر در پروژه‌های مختلف برنامه‌نویسی به کار می‌روند، در قالب توابع مستقل یا متد کلاس استفاده کرد.

برای ساخت ماژول در پایتون، می‌توان از فایلی با پسوند py. استفاده کرد؛ به عبارتی، هر فایلی با پسوند py. در پایتون، ماژول تلقی می‌شود. ماژول‌های پایتون را می‌توان به دو دسته تقسیم‌بندی کرد:

  • «ماژول‌های توکار» (Built-in Modules): ماژول‌های توکار، ماژول‌های از پیش تعریف شده‌ای هستند که می‌توان از طریق «کتابخانه استاندارد پایتون» (Python Standard Library) به آن‌ها دسترسی داشت. با دستورpip می‌توان ماژول‌های توکار را برروی سیستم نصب و در پروژه‌های مختلف برنامه‌نویسی از آن‌ها استفاده کرد. دستورpipمدیریت «بسته‌های» (Packages) پایتون را برعهده دارد و امکان نصب ماژول‌ها و بسته‌های موجود در کتابخانه پایتون را فراهم می‌کند.
  • «ماژول‌های تعریف شده توسط کاربر» (User-Defined Modules): برنامه‌نویسان می‌توانند توابع و کلاس‌های خود را در قالب ماژول با پسوند py. ذخیره و به دفعات از آن‌ها در پروژه‌های برنامه‌نویسی مختلف استفاده کنند.

در ادامه مطلب حاضر، به نحوه فراخوانی ماژول‌ها در پایتون به همراه مثال پرداخته می‌شود.

نحوه فراخوانی ماژول در پایتون چگونه است ؟

پایتون هزاران ماژول استاندارد دارد که می‌توان برخی از این ماژول‌های آماده را در پوشه Lib در محل نصب پایتون مشاهده کرد. نحوه فراخوانی ماژول‌های توکار، مشابه با شیوه فراخوانی ماژول‌های تعریف شده توسط کاربر هستند. به منظور فراخوانی ماژول‌ها در برنامه خود، از دستورات زیر استفاده می‌شود:

  • فراخوانی ماژول در پایتون با استفاده از دستور Import
  • فراخوانی ماژول در پایتون با استفاده از تغییر نام ماژول
  • فراخوانی ماژول در پایتون با استفاده از دستور From...Import
  • فراخوانی ماژول در پایتون با استفاده از دستور *

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

فراخواندن ماژول در پایتون با استفاده از دستور Import

به منظور فراخوانی ماژول‌های استاندارد در پایتون، از کلمه کلیدیimport استفاده می‌شود. بعد از نوشتن کلمه کلیدیimport باید نام فایل ماژول مربوطه را وارد کرد. نکته مهم این است که نباید بعد از کلمه کلیدیimport نام تابع درون ماژول نوشته شود. به عبارتی، کلمه کلیدیimport صرفاً برای فراخوانی نام ماژول استفاده می‌شود. در مثال زیر، ماژولmath ، به عنوان ماژول توکار در پایتون، فراخوانی شده است. پس از فراخوانی این ماژول، می‌توان از تابعpi در این ماژول استفاده کرد.

1# import statement example
2# to import standard module math
3
4import math
5print("The value of pi is", math.pi)

با اجرای دستور فوق، خروجی به صورت زیر خواهد بود.

The value of pi is 3.141592653589793

فراخوانی ماژول در پایتون با استفاده از دستور As برای تغییر نام

با استفاده از کلمه کلیدیas می‌توان به ماژول فراخوانی شده، نام مستعار داد. زمانی از نام مستعار برای ماژول‌ها استفاده می‌شود که نام ماژول طولانی باشد و نوشتن نام کامل ماژول در سراسر برنامه، زمان‌بر باشد. در مثال زیر، نام مستعارm برای نام ماژولmath درنظر گرفته شده است.

1# import module by renaming it
2
3import math as m
4print("The value of pi is", m.pi)

خاطرنشان می‌شود که با دادن اسم مستعارm به ماژول فراخوانی شده، دیگر نمی‌توان از نام اصلی ماژولmath در برنامه استفاده کرد. به عبارتی، باید برای استفاده از ماژول، اسم مستعار جدید ماژول را به کار برد؛ در غیر این صورت، برنامه با خطای کامپایلر مواجه می‌شود.

Traceback (most recent call last):
  File "<string>", line 4, in <module>
NameError: name 'math' is not defined
> 

صدا زدن ماژول در پایتون با استفاده از دستور From...Import

با استفاده از دستور From...Import می‌توان به جای فراخواندن کل ماژول، اسامی خاصی را از ماژول فراخواند. به عنوان مثال، ماژولmathدارای توابع ریاضیاتی مختلفی است که یکی از این توابع، تابعpiنام دارد. با استفاده از روش فراخوانی From...Import می‌توان  فقط تابعpi این ماژول را فراخوانی کرد. علاوه بر این، با استفاده از این روش فراخوانی ماژول، دیگر نیازی نیست برای استفاده از تابع ماژول، نام ماژول را نیز به صورتmath.pi به کار ببریم؛ تنها کافی است که نام تابعpiرا مستقیماً در برنامه استفاده کنیم.

1# import only pi from math module
2
3from math import pi
4print("The value of pi is", pi)

همچنین، می‌توان با استفاده از دستور From...Import نام چندین تابع و متغیر از یک ماژول را با استفاده از کاما فراخوانی کرد. در مثال زیر، با استفاده از دستور From...Import تابعpiو متغیرe از ماژولmath به صورت همزمان فراخوانی شده‌اند.

1>>> from math import pi, e

در خروجی نیز می‌توان مستقیماً به مقدار هر یک از توابع و متغیرها به صورت زیر دسترسی داشت.

>>> pi
3.141592653589793
>>> e
2.718281828459045

فراخوانی ماژول در پایتون با استفاده از دستور ستاره

با استفاده از دستور* می‌توان تمامی اجزای ماژول را فراخوانی کرد. در مثال زیر، تمامی اسامی مربوط به اجزای ماژولmath فراخوانی شده‌اند.

1# import all names from the standard module math
2
3from math import *
4print("The value of pi is", pi)

فراخوانی ماژول با استفاده از ستاره روش کارامدی در برنامه‌نویسی نیست زیرا این روش منجر به کاهش خوانایی برنامه خواهد شد. توصیه می‌شود از سایر شیوه‌های فراخوانی در کدنویسی استفاده شود.

معرفی فیلم های آموزش پایتون

فیلم های آموزش پایتون فرادرس

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

نحوه ساخت ماژول در پایتون چگونه است ؟

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

ساخت ماژول در پایتون برای توابع

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

1# Define a function
2def world():
3    print("Hello, World!")

دستور بالا تابعی با عنوانworld() تعریف کرده که عبارتHello, World! را در خروجی چاپ می‌کند. چنانچه این قطعه کد با دستورpython hello.py در خط فرمان اجرا شود، چیزی در خروجی چاپ نمی‌شود زیرا باید نام این تابع را در جایی از برنامه فراخوانی کرد.

برای فراخوانی ماژولhello در پایتون، در همان مسیری که فایل hello.py در آن ایجاد شد، می‌توان فایلی با عنوانmain_program.py ایجاد کرد. چون ماژولhello، ماژول توکار پایتون نیست، برای فراخواندن آن باید فایل ماژولhelloرا در همان مسیر فایلmain_program.pyقرار داد.

به منظور فراخوانی ماژولhelloو استفاده از تابعworld()، در فایلmain_program.pyکد زیر نوشته می‌شود.

1# Import hello module
2import hello
3
4# Call function
5hello.world()

همان طور که در قطعه کد بالا ملاحظه می‌شود، پس از فراخوانی ماژولhelloبا استفاده از دستورimport ، می‌توان از تابعworld()با استفاده از علامت نقطه استفاده کرد.

با استفاده از دستور زیر در خط فرمان، می‌توان قطعه کد بالا را اجرا کرد.

1$ python main_program.py

خروجی دستور فوق به صورت زیر است:

Hello, World!

چنانچه در مسیر پروژه، فولدی برای ماژول‌های ساخته شده در نظر گرفته شود، در هنگام فراخوانی ماژول مورد نظر، در ابتدا باید نام فولدری نوشته شود که ماژول در آن قرار دارد. به عنوان مثال، چنانچه ماژولhelloدر فولدی با عنوان my_modules قرار بگیرد، هنگام فراخوانی ماژول با دستورimport باید نام فولدر ماژول نیز نوشته شود. لازم به ذکر است که در این روش از فراخوانی، تنها از دستور From...Import استفاده می‌شود.

1# Import hello module
2from my_modules.hello import world
3
4# Call function
5hello.world()

 ایجاد ماژول در پایتون برای متغیرها

می‌توان در ماژول‌ها متغیرهایی با مقادیر مشخص تعریف کرد و آن‌ها را در سایر پروژه‌های پایتون به کار برد. در ماژولhello که پیش از این تعریف شد، می‌توان به صورت زیر متغیری با عنوانshark تعریف کرد و مقدار Sammy‌ را به آن تخصیص داد.

1# Define a function
2def world():
3    print("Hello, World!")
4
5# Define a variable
6shark = "Sammy"

با استفاده از دستورimport می‌توان ماژولhello را در برنامه فراخوانی کرد و با استفاده از نام ماژول به همراه نقطه و اسم متغیر، به مقدار متغیر Sammy دسترسی داشت.

1# Import hello module
2import hello
3
4# Print variable
5print(hello.shark)

با اجرا کردن دستور فوق، مقدار Sammy در خروجی به صورت زیر ملاحظه می‌شود.

Summy

نحوه نوشتن ماژول برای کلاس ها

ماژول‌ها می‌توانند شامل تعریف کلاس و اجزای کلاس نظیر مشخصه‌ها و متدها نیز باشند. در مثال زیر، کلاسی با عنوانOctopus در ماژولhelloتعریف شده است که دارای مشخصه‌هایی با عناوینname وcolor و متدی با عنوانtell_me_about_the_octopus برای چاپ مقادیر مشخصه‌ها است.

1# Define a class
2class Octopus:
3    def __init__(self, name, color):
4        self.color = color
5        self.name = name
6
7    def tell_me_about_the_octopus(self):
8        print("This octopus is " + self.color + ".")
9        print(self.name + " is the octopus's name.")

به منظور استفاده از کلاسOctopusاز ماژولhello، در فایلmain_program.py، شئ‌ای از کلاسOctopusبا عنوانjesse ساخته شده است.

1# Call class
2jesse = hello.Octopus("Jesse", "orange")
3jesse.tell_me_about_the_octopus()

همان طور که در قطعه کد بالا ملاحظه می‌شود، زمانی که با استفاده از دستورhello.Octopus() کلاسOctopusصدا زده می‌شود، می‌توان به توابع درون کلاس و مشخصه‌های آن دسترسی داشت. بدین‌ ترتیب، می‌توان برای مشخصه‌های کلاسOctopus، مقادیر Jesse و Orange را ارسال کرد. همچنین، با استفاده از نام شئ ساخته شده (jesse)، می‌توان به تابع درون ماژول دسترسی داشت.

در این حالت، دیگر نیاز به نوشتن نام ماژول نیست و با دستورjese.tell_me_about_the_octopus() می‌توان تابع درون ماژولhelloرا صدا زد. همچنین، می‌توان بدون نوشتن نام ماژول، تنها با استفاده از نام شئ به مشخصه کلاس دسترسی داشت. در مثال فوق، می‌توان به مشخصهcolor شئjesse ، با استفاده از دستورjesse.color دسترسی داشت.

با اجرای قطعه کد فوق، خروجی برنامه به شکل زیر است:

This octopus is orange.
Jesse is the octopus's name.

شایان ذکر است که ماژول‌ها علاوه بر تعاریف (definitions)، می‌توانند شامل دستورات اجرایی نیز باشند. به عنوان مثال، می‌توان علاوه بر تعریف تابع و نوشتن بدنه آن در ماژولhello ، نام تابع را نیز در این ماژول صدا زد. در مثال زیر، علاوه بر تعریف تابعworld و مشخص کردن بدنه آن، از دستورworld() برای صدا زدن تابع استفاده شده است.

1# Define a function
2def world():
3    print("Hello, World!")
4
5# Call function within module
6world()

حال می‌توان در فایلmain_program.pyتنها نام ماژولhelloرا به صورت زیر فراخوانی کرد.

1# Import hello module
2import hello

با فراخوانی ماژولhelloو اجرای کد قبل، خروجی برنامه به صورت زیر است.

Hello, World!

دسترسی به ماژول های پایتون

یکی از اهداف ساخت ماژول‌، استفاده از آن‌ها در پروژه‌های برنامه‌نویسی مختلف است. زمانی که ماژولی فراخوانی می‌شود، پایتون چندین مسیر را برای فراخوانی ماژول بررسی می‌کند. مفسر پایتون، در ابتدا بین ماژول‌های توکار خود به دنبال ماژول فراخوانی شده می‌گردد. اگر نام ماژول را در میان ماژول‌های توکار پیدا نکرد، نام آن را در لیست مسیرهای تعریف شده درsys.path جستجو می‌کند. بدین‌ ترتیب، مفسر پایتون، سه مسیر را برای پیدا کردن نام ماژول فراخوانی شده جستجو می‌کند:

  • مسیر جاری که فایل پروژه پایتون در آن قرار دارد. در مثال قبل، مفسر پایتون مسیر فعلی فایلmain_program.pyرا برای پیدا کردن نام ماژولhello جستجو می‌کند.
  • PYTHONPATH (متغیر محیطی به همراه لیستی از مسیرهای مشخص شده)
  • مسیر پیش‌فرض نصب پایتون

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

در ادامه مطلب، به توضیح مراحل اضافه کردن ماژول به PYTHONPATH و مسیر پیش‌فرض نصب پایتون پرداخته می‌شود.

ماژول در پایتون

اضافه کردن مسیر ماژول‌ها به لیست مسیرهای ماژول پایتون

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

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

برای مثال، می‌توان فایل hello.py را به مسیر/usr/sammy/ منتقل کرد تا با فایلmain_program.pyهم‌مسیر نباشد. در این حالت، برای فراخوانی ماژولhelloدر فایلmain_program.py، باید از ماژولsysاستفاده کرد. به عبارتی، با استفاده از ماژولsysمی‌توان مسیر ماژولhello را به لیست مسیرهای ماژول‌های پایتون اضافه کرد تا پایتون برای فراخوانی آن، به مسیر مشخص شده رجوع کند.

1import sys
2sys.path.append('/usr/sammy/')
3
4import hello
5...

اضافه کردن ماژول به مسیر نصب پایتون

روش دیگری که می‌توان از ماژول‌های ساخته شده توسط کاربر در سایر پروژه‌های پایتون استفاده کرد، اضافه کردن ماژول به مسیر نصب پایتون است تا مفسر پایتون، نام ماژول کاربر را همانند نام سایر ماژول‌ها و «بسته‌های» (Packages) موجود در آن مسیر جستجو کند. این روش دسترسی به ماژول، روشی دائمی است و به راحتی می‌توان از ماژول در «سطح محیط مجازی» (Virtual Environment-Level) یا در «سطح کل سیستم» (System-Level) استفاده کرد.

به منظور یافتن مسیرهایی که پایتون برای بررسی ماژول‌های خود استفاده می‌کند، در ابتدا باید در خط فرمان با استفاده از دستور زیر مفسر پایتون را اجرا کرد.

1$ python3

سپس، می‌توان با فراخوانی ماژولsys و استفاده از دستورsys.path مسیر سیستم را ملاحظه کرد.

1import sys
2
3print(sys.path)

با اجرای قطعه کد فوق، حداقل آدرس یک مسیر، همانند مسیر زیر، در خروجی نمایش داده می‌شود:

'/usr/sammy/my_env/lib/python3.5/site-packages'

حال می‌توان فایل ماژول خود را (فایل hello.py) به مسیر فوق منتقل کرد. پس از انتقال ماژول به مسیر نصب پایتون، می‌توان نام ماژول را در هر پروژه پایتون به صورت زیر فراخوانی کرد.

1import hello
2...

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

بارگذاری مجدد ماژول

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

1# This module shows the effect of
2#  multiple imports and reload
3
4print("This code got executed")

چنانچه به دفعات مختلف، ماژولmy_module در برنامه فراخوانی شود، دستورات داخل ماژول تنها یک بار اجرا می‌شوند. در ادامه نیز ملاحظه می‌شود که دستورprint فقط یک بار اجرا شده است.

1>>> import my_module
2This code got executed
3>>> import my_module
4>>> import my_module

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

روش کارآمد دیگر برای بارگذاری مجدد ماژول، استفاده از تابعreload() از ماژولimp است. در قطعه کد زیر ملاحظه می‌شود که بعد از فراخوانی ماژولmy_module ، نام این ماژول با استفاده از تابعreload()مجدداً فراخوانی شده و دستورprintدو بار اجرا می‌شود.

1>>> import imp
2>>> import my_module
3This code got executed
4>>> import my_module
5>>> imp.reload(my_module)
6This code got executed

جمع‌بندی

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

بر اساس رای ۱۴ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
techvidvanprogramizdigitaloceanmakeuseof
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *