بکندباز

تابع ‎eval()‎‎ در پایتون

مثال

اجرای دستور ‘‎print(55)‎’:

x = 'print(55)'
eval(x)

توضیحات

تابع ‎eval()‎ یک خط دستور پایتون که در ورودی می گیرد را اجرا می کند.

تابع ‎exec() مشابه تابع ‎eval()‎ است اما برخلاف تابع ‎eval()‎ که فقط یک عبارت کوتاه را اجرا کند، می تواند بلوک های کد بزرگی را اجرا کند.

سینتکس

eval(expression, globals, locals)

پارامتر های ورودی

پارامتر توضیح
expression یک متن، شامل یک کد پایتون که قرار است اجرا شود.
globals اختیاری. یک دیکشنری شامل پارامتر های global
locals اختیاری. یک دیکشنری شامل پارامتر های local

مثال

z = 50
x = 'print(z + 100)'
eval(x)

در تابع eval()، پارامترهای locals و globals برای تعیین محدوده متغیرها در هنگام اجرا مورد استفاده قرار می‌گیرند.

  1. پارامتر globals:
    • globals یک دیکشنری است که متغیرهای global را تعیین می‌کند.
    • متغیرهای global، متغیرهایی هستند که در سطح بالاتر از تابع یا بلوک کد فعلی تعریف شده‌اند.
    • اگر در globals یک متغیر با یک نام تعریف شود، eval() از آن مقدار استفاده می‌کند.
  2. پارامتر locals:
    • locals همچنین یک دیکشنری است اما به متغیرهای local تابع یا بلوک کد ارتباط دارد.
    • متغیرهای local، متغیرهایی هستند که در داخل تابع یا بلوک کد مورد نظر تعریف شده‌اند.
    • اگر در locals یک متغیر با یک نام تعریف شده باشد، eval() از آن مقدار استفاده می‌کند.

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

چه زمانی باید از locals استفاده کنیم و چه زمانی از globals؟

استفاده از locals یا globals در تابع eval() به وابسته به نیازهای شما و ساختار کد مورد نظر دارد. در زیر توضیحاتی درباره زمانهایی که ممکن است از هرکدام استفاده کنید آورده شده است:

  1. استفاده از locals:
    • زمانی که تابع eval را درون یک تابع دیگر فراخوانی کرده اید و می‌خواهید از متغیرهای محلی (local variables) درون آن تابع یا بلوک کد خاص استفاده کنید.
    • اگر در تابع یا بلوک کد مورد نظر متغیرهای محلی تعریف شده‌اند و شما می‌خواهید در eval() از آن‌ها استفاده کنید، از تابع locals استفاده کنید.
      def example_function():
         local_var = 42
         eval('print(local_var)', globals(), locals())
      
  2. استفاده از globals:
    • زمانی که می‌خواهید از متغیرهای global در سطح بالاتر از تابع یا بلوک کد مورد نظر استفاده کنید.
    • اگر متغیرها در سطح بالاتر از تابع تعریف شده‌اند و شما می‌خواهید در eval() از آن‌ها استفاده کنید، از globals استفاده کنید.
      global_var = 100
      eval('print(global_var)', globals())
      
    • همچنین اگر بخواهید متغیری تعریف کنید که فقط روی کد درون eval اعمال شود و با متغیری که با همان نام خارج از تابع تعریف شده است تداخلی نداشته باشد، می‌توانید با تعریف یک دیکشنری جدید و افزودن متغیرهای مورد نظر به آن، از globals استفاده کنید.
      age = 100 
      eval('print(age)', {'age': 32})
      

از آنجا که استفاده از globals و locals به وابستگی به ساختار کد شما دارد، توصیه می‌شود که با دقت از آنها استفاده کنید تا جلوگیری از تداخل نام متغیرها و دسترسی به محدوده‌های ناخواسته.

backendbaz

مدیر وب سایت بکندباز

دیدگاه‌ها

*
*

    aliooooo پاسخ

    salam khaste nabashid.
    chejuri mishe yek tabbe nevesht manand tabbe eval
    age mitonid lotfan rahnamai konid va be email man msg bedi

      ‏زهره احمدی پاسخ

      سلام. برای اینکار می تونید یک تابع بسازید که کدی که قرار هست اجرا بشه رو به عنوان ورودی بگیره (مثل eval) و اون رو توی یک فایل پایتون ذخیره کنه. سپس با استفاده از تابع execfile('file.py') محتوای فایل رو اجرا کنید و خروجی رو برای کاربر برگردونید.

    JavadEs پاسخ

    z=50
    x = 'print(z + 100)'
    eval(x, {'z': 200})

    چرا خروجی 300 نشون میده من قسمت globals و locals متوجه نشدم

      zohreh پاسخ

      در انتهای متن، توضیحاتی برای کاربرد این دو پارامتر و تفاوت های آنها اضافه شد. 🙏