تابع eval در پایتون – به زبان ساده + مثال و تمرین
تابع eval در پایتون، کدهایی را اجرا میکند که به شکل رشته نوشته شدهاند. فرض کنیم عبارت '2+3' را به صورت رشته نوشتهایم. روش کار تابع eval() به این صورت است که ابتدا این رشته را به عنوان پارامتر ورودی دریافت میکند. سپس با آن مانند عبارت پایتون، رفتار میکند. یعنی ابتدا آن را از حالت رشته خارج کرده و سپس کد بدست آمده را مطابق با قوانین پایتون اجرا میکند. در نتیجه، جواب این عبارت - که برابر با 5 است - را به عنوان خروجی برمیگرداند. این تابع به برنامه نویسان کمک میکند دستوراتی را اجرا کنند که درون کدهای برنامهشان نوشته نشده است. در واقع با کمک تابع eval() میتوانیم کدها را به شکل پویا اجرا کنیم.
- روشهای مختلف استفاده از تابع eval را در پایتون یاد میگیرید.
- با کمک مثالهای سادهای روش حل عبارتهای ریاضی را با کمک تابع eval در پایتون میآموزید.
- یاد میگیرید که چگونه از تابع eval در پایتون برای اجرای کدهای پویا کمک بگیرید.
- روش استفاده از پارامترهای اختیاری globals و locals را یاد میگیرید.
- متوجه میشوید که استفاده از تابع eval چه خطراتی دارد و ممکن است چه مشکلاتی به وجود بیایند.
- در نهایت هم با بررسی مثالهای مختلف در کار با تابع eval، تجربه پیدا میکنید.


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

نکته: البته لازم است، رشته داده شده به تابع eval() تمام قوانین مربوط به سینتکس پایتون را رعایت کند. برای کسب مهارت در نوشتن سینتکس مفاهیم مختلف پایتون میتوانید فیلم آموزش برنامه نویسی پایتون Python – مقدماتی + گواهینامه را در فرادرس مشاهده کنید. لینک مربوط به این فیلم در پایین نیز قرار داده شده است.
سینتکس تابع eval در پایتون
قبل از بررسی مثالها و محل کاربرد تابع eval()، باید با سینتکس آن آشنا شویم. در کادر پایین، سینتکس استفاده از تابع eval() را نوشتهایم.
همینطور که مشاهده میکنید، تابع eval() سه پارامتر مختلف دریافت میکند. این پارامترها را در فهرست پایین معرفی کردهایم.
- expression: این پارامتر همان کدهای پایتونی است که باید به شکل رشته نوشته شده باشد. وجود این پارامتر الزامی است.
- globals: این پارامتر باید به شکل دیکشنری باشد. در داخل آن متغیرهای سراسری را تعریف میکنیم. وجود این پارامتر اختیاری است. بنابراین اگر پارامتر globals تعریف نشود، تابع eval() از فضای نام سراسری محیطی استفاده میکند که در آن فراخوانی شده است.
- locals: این پارامتر هم از نوع دیکشنری است. در داخل آن متغیرهای محلی نگهداری میشوند. وجود این پارامتر اختیاری است. اگر هیچ مقداری برای آن تعریف نشود، از فضای نام محلی محیط اجرای تابع استفاده میشود.
نکته: در خروجی تابعeval() نتیجه حاصل از اجرای دستوری برگشت داده میشود که به صورت رشته به آن ارسال شده است.
روشهای استفاده از تابع eval در پایتون
تابع eval() میتواند از کدهای ساده تا پیچیده را اجرا کند. در کل، سه روش مختلف برای استفاده از تابع eval() وجود دارد. این روشها را در فهرست پایین معرفی کردهایم.
- اجرای عبارتهای ریاضی: اجرای محاسبات نوشته شده به شکل رشته
- اجرای کدهای پویا: اجرای عبارتهای ساده پایتون
- کار با محدوده متغیرها: مدیریت متغیرهای در دسترس برای تابع eval()

در ادامه مطلب هر کدام از روشهای بالا را با کمک مثال سادهای نمایش دادهایم.
اجرای عبارتهای ریاضی
رایجترین کاربرد تابع eval() مربوط به حل عبارتهای ریاضی است. باید عبارتهای ریاضی را به صورت اعداد و عملگر به شکل رشته بنویسیم. فقط کافی است که این رشته به تابع eval() داده شود. در خروجی، نتیجه عبارت را محاسبه کرده و برمیگرداند.
در کادر زیر، مثال سادهای را درباره اجرای عبارتهای ریاضی، بررسی کردهایم.
بعد از اجرای کد بالا خروجی به شکل زیر، نوشته میشود.
15
2.0در کدهای بالا عبارت ریاضی نوشته شده به شکل رشته را به تابع eval() ارسال کردهایم. این تابع عبارت را دریافت میکند. سپس آن را به کد پایتون تبدیل کرده و نتیجه را محاسبه میکند. در نهایت هم نتیجه بدست آمده را به خروجی ارسال میکند. این کاربرد تابع eval() در زمان اجرای پروژههایی مانند ساخت ماشین حساب یا پردازش فرمولهای استخراج شده از متن مفید است.
با تابع eval() حتی میتوانیم عبارتهایی را اجرا کنیم که شامل متغیر هستند. اگر آن متغیرها در فضای نام محلی تابع، تعریف شده باشند، به شکل زیر میتوانیم از آنها استفاده کنیم.
بعد از اجرای کد بالا، خروجی برابر با عدد 205 در کنسول پایتون نوشته میشود. تابع eval() در فضای نام محلی خود به متغیرهای x و y دسترسی دارد. بنابراین به راحتی از مقدار آنها استفاده میکند. در بخشهای بعدی مطلب، مثالهای بیشتر و حرفهایتری درباره متغیرهای محلی و سراسری تابع eval() نوشته شدهاند.
یادگیری پایتون با کمک فیلم های آموزشی
زبان برنامه نویسی پایتون به دلیل سادگی و قدرت زیاد کاربرد بسیار خوبی در حوزههای مختلف پیدا کرده است. به طور معمول شروع یادگیری این زبان ساده است. افراد علاقهمند به برنامه نویسی خیلی زود موارد ابتدایی و سینتکس پایتون را یاد میگیرند. اما آموختن مفاهیم پیشرفته آن نیاز به تمرین و تلاش بیشتری دارد. استفاده از منابع آموزشی حرفهای مانند فیلمهای آموزشی کمک زیادی به یادگیری مطالب پیشرفته میکند. فیلمهای آموزشی نسبت به کلاسهای حضوری از امتیازات بیشتری برخوردار هستند. یکی از این امتیازات هزینه کمتر این محصولات است.

در همین زمینه هم فرادرس شروع به تولید فیلمهای آموزشی بسیار مناسبی برای پایتون کرده است. فیلمهای فرادرس با کمک گرفتن از اساتید باتجربه و تکنیکهای پیشرفته تولید شدهاند. در نتیجه کیفیت بالا و محتوای ارزشمندی دارند. این فیلمها از نکات ساده تا بخشهای بسیار پیشرفتهای مانند شبکههای عصبی و یادگیری ماشین را پوشش میدهند. استفاده از فیلمهای فرادرس نسبت به سایر روشها سریعتر و بهتر به نتیجه میرسد. در پایین، چند مورد از فیلمهای آموزشی مربوط به زبان پایتون را معرفی کردهایم.
- فیلم آموزش برنامه نویسی پایتون همراه با پیاده سازی مثال های عملی در Python + گواهینامه
- فیلم آموزش تجزیه و تحلیل و آماده سازی داده ها با پایتون
- فیلم آموزش رایگان کتابخانه Datetime در پایتون برای مدیریت زمان + گواهینامه
- فیلم آموزش مقدماتی کار با پایگاه های داده در Python + گواهینامه
- فیلم آموزش کاربرد «چت جی پی تی» (ChatGPT) در برنامه نویسی پایتون، دوره مقدماتی + گواهینامه
اجرای کدهای پویا
تابع eval() فقط برای محاسبات ریاضی نیست. با کمک این تابع میتوان تمام عبارتهای معتبر پایتون را اجرا کرد. برای نمونه میتوانیم به فراخوانی توابع یا ایجاد ساختمانهای داده، اشاره کنیم.
در مثال پایین، روش ساخت لیست از روی رشته، را بررسی میکنیم.
بعد از اجرای کد بالا خروجی به شکل زیر در کنسول پایتون، نوشته میشود.
[1, 2, 3, 4, 5]
<class 'list'>تابع eval() حتی میتواند سایر توابع تعریف شده توسط کاربر یا توابع درونی پایتون را هم فراخوانی کرده و اجرا کند.
بعد از اجرای کد بالا خروجی به شکل زیر در کنسول پایتون، نمایش داده میشود.
Hello, Alice!کار با محدوده متغیرها
تابع eval() به برنامه نویس اجازه میدهد تا محیط اجرای عبارتها را هم مدیریت بکند. برای انجام این کار باید از دیکشنریهای اختیاری globals و locals استفاده کنید. با کمک این دیکشنریها مشخص میکنیم که تابع eval() به کدام متغیرها و توابع دسترسی داشته باشد.
- globals: وظیفه این دیکشنری فراهم کردن متغیرهای سراسری برای اجرای عملیات است.
- locals: وظیفه این دیکشنری هم فراهم کردن متغیرهای محلی برای اجرای عملیات است.
اگر پارامترهای globals و locals را مشخص نکنیم، تابع eval() از متغیرهای محلی استفاده میکند. هر متغیر در پایتون به فضای نام اختصاصی خودش مربوط است. شناخت فضای نام پایتون و روش استفاده از آن برای بهینهسازی کدها، برنامههای نوشته شده را حرفهای تر میکند. برای آشنایی با این مفهوم میتوانید مطلب مربوط به آن را در مجله فرادرس مطالعه کنید.

در مثال پایین، روش استفاده از دیکشنری globals را برای محدود کردن دسترسی، بررسی کردهایم.
بعد از اجرای کد بالا خروجی به شکل پایین در کنسول پایتون، نمایش داده میشود.
Result with restricted globals: 150
Error when accessing unauthorized variable: name 'local_var' is not defined
با تعریف دیکشنری restricted_globals، میتوانیم متغیرهای قابل دسترسی تابع eval() را کنترل کنیم. این کار به امنتر شدن برنامه کمک میکند.
البته برای دسترسی به متغیرهای خاص میتوانیم از آرگومان locals استفاده کنیم.
بعد از اجرای کد بالا خروجی برابر با عدد 200 در کنسول پایتون، نمایش داده میشود.
نکته: برای اینکه exec_locals به عنوان متغیر محلی شناخته شود، باید نشان دهیم که متغیر سراسری نداریم یا اینکه پارامتر دوم را مشخص کنیم. در نتیجه از دیکشنری خالی {} به عنوان پارامتر دوم تابع، استفاده کردهایم.
این کد، توانایی ایزوله کردن محیط اجرای تابع eval() را نشان میدهد. زیرا حفظ امنیت در زمان اجرای کدهای پویا اهمیت بسیار زیادی دارد.
خطرات استفاده از تابع eval در پایتون
قدرت زیاد تابع eval() باعث شده که استفاده از آن خطراتی هم به همراه داشته باشد. بنابرین هیچ وقت نباید از تابع eval() همراه با مقادیر ورودی نامطمئن استفاده کنیم.
اگر به کاربران اجازه استفاده از eval() را بدهیم ممکن است آنها کدهای مخربی را به این تابع ارسال کنند. این کد میتواند شامل دستورات زیر باشد.
- حذف بعضی از فایلها از سیستم
- دسترسی به دادههای حساس
- اجرای دستورات مضر

برای مثال، در کد پایین تابع eval() را با دستور مخربی اجرا میکنیم.
مثال بالا شامل دستوری برای حذف تمام فایلهای موجود در سیستم است. اجرای این کد میتواند آسیب جدی به سیستم بزند. همیشه دادههای ورودی کاربران را مانند دستوری خطرناک در نظر بگیرید. بنابراین فقط وقتی از eval() استفاده کنید که کنترل کاملی بر عبارت وارد شده توسط کابران داشته باشید.

برای عبارتهای ریاضی ساده، استفاده از کد ast.literal_eval() گزینه بهتری نسبت به تابع معمولی eval() است. این دستور امنیت بیشتری دارد، زیرا فقط ساختارهای پایهای مانند رشتهها، اعداد، تاپل، لیست، دیکشنری، بولین و None را بررسی میکند. در نتیجه از اجرا شدن کدهای ناشناس و ناایمن جلوگیری میشود.
چگونه با کمک فیلمهای پروژه محور فرادرس پایتون یاد بگیریم؟
یادگیری برنامه نویسی همراه با اجرای پروژههای واقعی باعث افزایش هرچه بیشتر بهرهوری میشود. مجموعه کاملی از فیلمهای پروژهمحور پایتون، توسط فرادرس، تولید و منتشر شدهاند. در این دورهها علاوه بر تمرکز بر پروژههای عملی، مفاهیم پایه و مهارتهای پیشرفته برنامه نویسی نیز آموزش داده میشوند. مشاهده این فیلمهای آموزشی به ما کمک میکند که هم با روش استفاده صحیح از دستورات پایتون آشنا شویم و هم کاربرد عملی این دستورات را در کنار پیادهسازی الگوریتمهای عملیاتی یاد بگیریم.
در پایین، چند مورد از فیلمهای آموزش پروژهمحور زبان پایتون را معرفی کردهایم.
- فیلم آموزش پروژه محور پایتون، درباره ساخت برنامه هواشناسی آنلاین در Python
- فیلم آموزش پروژه محور Python، درباره ساخت Music Player
- فیلم آموزش پروژه محور بینایی ماشین با پایتورچ، تشخیص اشیا در PyTorch با پایگاه داده COCO + گواهینامه
- فیلم آموزش ساخت چت روم با سوکت نویسی در پایتون، Socket Programming در Python
- فیلم آموزش پروژه محور پایتون، درباره ساخت بازی حافظه تصویری با کتابخانه Tkinter و Turtle + گواهینامه
با کلیک بر روی تصویر زیر میتوانید به صفحه اصلی این مجموعه آموزشی، هدایت شده و فیلمهای پروژهمحور بیشتری را مشاهده کنید.

چند مثال درباره استفاده از تابع eval در پایتون
در این بخش از مطلب، چند مثال مختلف را درباره کار با تابع eval() نوشتهایم. با بررسی این مثالها بهتر میتوانید عملکرد این تابع را درک کنید.
مثال اول: اجرای فرمول درجه دوم
در این مثال میخواهیم تابع درجه دوم x2 + 3x + 5 را زمانی که x برابر با 2 است، حل کنیم. برای حل این مسئله از تابع eval() استفاده کردهایم.
بعد از اجرای کد بالا خروجی به شکل پایین در کنسول پایتون، نمایش داده میشود.
The evaluated expression obtained is: 15مثال دوم: دسترسی به متغیرهای سراسر و محلی
از تابع eval() میتوان برای دسترسی همزمان به متغیرهای محلی و سراسری هم استفاده کرد. در این مسئله میخواهیم حاصل جمع متغیر سراسری global_var و متغیر محلی local_var را بدست بیاوریم.
در کادر پایین، روش حل این مسئله را با کمک تابع eval() نوشتهایم.
بعد از اجرای کد بالا خروجی به شکل پایین در کنسول پایتون، نمایش داده میشود.
The evaluated expression obtained is: 15مثال سوم: List Comprehension
در مثال پایین از تکنیک «List Comprehension» برای تعریف لیست استفاده کردهایم. هدف آن است که لیستی از مربع اعداد ۰ تا ۴ ساخته و نتیجه را در خروجی چاپ کنیم.
- ابتدا - در خط اول - دستور «List Comprehension» را به صورت رشته نوشتهایم.
- در خط دوم، این دستور را به تابع eval() میدهیم.
- در خط سوم، خروجی تابع eval() را با کمک تابع print() چاپ میکنیم.
بعد از اجرای کد بالا خروجی به شکل پایین در کنسول پایتون، نمایش داده میشود.
The evaluated expression obtained is: [0, 1, 4, 9, 16]مثال چهارم: فراخوانی تابع
در این مثال، تابعی به نام custom_function() میسازیم. این تابع پارامتر x را دریافت میکند. وظیفه تابع custom_function() محاسبه نتیجه فرمول درجه دوم x**2 + 2*x + 1 با متغیر x است. سپس رشتهای با نام expression ایجاد میکنیم. این رشته، تابع custom_function() را با پارامتر 3 فراخوانی میکند. برای اجرای این رشته از تابع eval() استفاده میکنیم. در زمان فراخوانی تابع eval() دو پارامتر به آن ارسال میکنیم. در پارامتر اول، متغیرهای سراسری را با استفاده از globals() قرار میدهیم. در پارامتر دوم هم دیکشنری را ارسال میکنیم که شامل تابع custom_function() است.
بعد از اجرای کد بالا خروجی به شکل پایین در کنسول پایتون، نمایش داده میشود.
The evaluated expression obtained is: 16جمعبندی
در این مطلب از مجله فرادرس با تابع eval() آشنا شدهایم. تابع eval در پایتون برای اجرای کدهایی استفاده میشود که به صورت رشته نوشته شدهاند. این تابع میتواند عبارتهای ریاضی، ساختارهای داده و حتی توابع تعریف شده را اجرا کند. با استفاده از پارامترهای globals و locals، میتوان محدودهی دسترسی eval() را کنترل کرد تا فقط به متغیرها یا توابع مشخصی دسترسی داشته باشد. همین ویژگی باعث انعطاف بالای آن در اجرای کدهای پویا میشود.
با این حال، استفاده از eval() خطرناک است، زیرا اگر ورودی نامطمئن به آن داده شود، امکان اجرای کدهای مخرب مانند حذف فایلها وجود دارد. به همین دلیل توصیه میشود فقط در شرایط کنترل شده از آن استفاده کنیم. برای پردازش امنتر دادههای ساده، میتوان از ast.literal_eval() به جای eval() استفاده کرد. به هر حال گاهی اوقات در بعضی از برنامهها لازم است قسمتی از کارها را برعهده کاربران بگذاریم. برای مثال، در برنامه ماشین حساب اجرای عبارت نوشته شده توسط کاربر با تابع eval() سادهتر از تجزیه رشته و تبدیل آن به عبارت پایتون است. بنابراین به عنوان توسعهدهنده پایتون باید روش کار با این تابع را هم بلد باشیم.












