ইওল, এক্সিকিউট এবং সংকলনের মধ্যে পার্থক্য কী?


428

আমি পাইথন কোডটির গতিশীল মূল্যায়নের দিকে লক্ষ্য করছি eval()এবং এর compile()কাজগুলি এবং execবিবৃতিটি দেখতে পাচ্ছি ।

কেউ দয়া করে evalএবং এর মধ্যে পার্থক্যটি ব্যাখ্যা করতে পারেন execএবং কীভাবে বিভিন্ন ধরণের compile()ফিট রয়েছে?

উত্তর:


517

সংক্ষিপ্ত উত্তর, বা টিএল; ডিআর

মূলত, evalব্যবহার করা হয় Eval uate একটি একক পরিবর্তনশীল উত্পন্ন পাইথন অভিব্যক্তি, এবং execব্যবহার করা হয় Exec Ute পরিবর্তনশীল শুধুমাত্র তার পার্শ্ব প্রতিক্রিয়া জন্য পাইথন কোড উত্পন্ন।

evalএবং execএই দুটি পার্থক্য আছে:

  1. evalকেবলমাত্র একটি একক অভিব্যক্তি গ্রহণ করে , execপাইথন স্টেটমেন্ট রয়েছে এমন একটি কোড ব্লক নিতে পারে: লুপস try: except:, classএবং ফাংশন / পদ্ধতি defইনসেশন এবং আরও অনেক কিছু।

    পাইথনের একটি অভিব্যক্তি হ'ল ভেরিয়েবল অ্যাসাইনমেন্টে মান হিসাবে যা কিছু থাকতে পারে:

    a_variable = (anything you can put within these parentheses is an expression)
  2. eval প্রদত্ত অভিব্যক্তিটির মান প্রদান করে, যেখানে execতার কোড থেকে ফেরৎ মূল্য উপেক্ষা করে এবং সর্বদা ফিরে আসে None(পাইথন 2 এ এটি একটি বিবৃতি এবং অভিব্যক্তি হিসাবে ব্যবহার করা যায় না, সুতরাং এটি সত্যিকার অর্থে কিছুই ফেরায় না)।

সংস্করণে 1.0 - 2.7, execএকটি বিবৃতি ছিল, কারণ সিপিথনের ফাংশনের execঅভ্যন্তরে এর পার্শ্ব প্রতিক্রিয়ার জন্য ব্যবহৃত ফাংশনগুলির জন্য বিভিন্ন ধরণের কোড অবজেক্ট তৈরি করা প্রয়োজন ।

পাইথন 3 এ, execএকটি ফাংশন; এটি ব্যবহার করা ফাংশনের সংকলিত বাইকোডে এর ব্যবহারের কোনও প্রভাব নেই।


মূলত:

>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    a = 47
      ^
SyntaxError: invalid syntax

compileমধ্যে 'exec'মোড বাইটকোডে গঠন করে নিতে বিবৃতি যে কোন সংখ্যার প্রনয়ন যে পরোক্ষভাবে সবসময় আয় None, যেহেতু এ 'eval'মোডে এটি একটি প্রনয়ন একক বাইটকোডে গঠন করে নিতে অভিব্যক্তি আয় যে মত প্রকাশের মান।

>>> eval(compile('42', '<string>', 'exec'))  # code returns None
>>> eval(compile('42', '<string>', 'eval'))  # code returns 42
42
>>> exec(compile('42', '<string>', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec

ইন 'eval'(এবং এইভাবে সঙ্গে মোড evalফাংশন যদি একটি স্ট্রিং পাস করা হয়েছে), compileএকটি ব্যতিক্রম যদি সোর্স কোড বিবৃতি বা একটি একক অভিব্যক্তি পরলোক অন্য কিছু রয়েছে উত্থাপন:

>>> compile('for i in range(3): print(i)', '<string>', 'eval')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax

প্রকৃতপক্ষে স্টেটমেন্টটি (যার মধ্যে পাইথন উত্স কোড রয়েছে ) পাস করা হয় কেবল তখনই "আইওয়াল কেবল একটি একক অভিব্যক্তি গ্রহণ করে" বিবৃতিটি প্রযোজ্য । তারপরে এটি অভ্যন্তরীণভাবে বাইটকোড ব্যবহার করে সংকলিত হয় এখানেই তাত্পর্যটি আসে।evalcompile(source, '<string>', 'eval')

যদি কোনও codeবস্তু (যার মধ্যে পাইথন বাইকোড থাকে ) পাস করা হয় execবা eval, তারা একইরূপে আচরণexec করে তবে প্রত্যাবর্তনের মানটিকে অবহেলা করে, এখনও Noneসবসময় ফিরে আসে । সুতরাং evalবিবৃতি আছে এমন কিছু কার্যকর করতে ব্যবহার করা সম্ভব , যদি আপনি কেবল compileস্ট্রিং হিসাবে পাস করার পরিবর্তে এটি বাইটকোডে প্রবেশ করেন:

>>> eval(compile('if 1: print("Hello")', '<string>', 'exec'))
Hello
>>>

সংকলিত কোডটিতে স্টেটমেন্ট থাকা সত্ত্বেও সমস্যা ছাড়াই কাজ করে। এটি এখনও প্রত্যাবর্তন করে None, কারণ এটি কোড অবজেক্টের ফিরে আসা মান compile

ইন 'eval'(এবং এইভাবে সঙ্গে মোড evalফাংশন যদি একটি স্ট্রিং পাস করা হয়েছে), compileএকটি ব্যতিক্রম যদি সোর্স কোড বিবৃতি বা একটি একক অভিব্যক্তি পরলোক অন্য কিছু রয়েছে উত্থাপন:

>>> compile('for i in range(3): print(i)', '<string>'. 'eval')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax

লম্বা উত্তর, উচ্ছ্বাসের বিশদ বিবরণ

exec এবং eval

execফাংশন (যা ছিল পাইথন 2 এক বিবৃতিতে ) একটি পরিবর্তনশীল নির্মিত বিবৃতি অথবা প্রোগ্রাম নির্বাহ জন্য ব্যবহার করা হয়:

>>> program = '''
for i in range(3):
    print("Python is cool")
'''
>>> exec(program)
Python is cool
Python is cool
Python is cool
>>> 

evalফাংশন একটি জন্য একই আছে একক অভিব্যক্তি , এবং মত প্রকাশের মান:

>>> a = 2
>>> my_calculation = '42 * a'
>>> result = eval(my_calculation)
>>> result
84

execএবং evalউভয়ই প্রোগ্রাম / এক্সপ্রেশনকে হয় হিসাবে চালিত করতে হয় str, unicodeবা bytesউত্স কোড সম্বলিত অবজেক্ট হিসাবে বা পাইথন বাইটকোডযুক্ত একটি codeবস্তু হিসাবে গ্রহণ করে ।

যদি কোনও str/ unicode/ bytesধারণকারী উত্স কোডটি পাস করা হয় তবে execএটি এর সাথে সমান আচরণ করে:

exec(compile(source, '<string>', 'exec'))

এবং evalএকইভাবে সমান আচরণ করে:

eval(compile(source, '<string>', 'eval'))

যেহেতু সমস্ত অভিব্যক্তি পাইথনে বিবৃতি হিসাবে ব্যবহার করা যেতে পারে (এগুলিকে Exprপাইথন বিমূর্ত ব্যাকরণে নোড বলা হয় ; বিপরীতটি সত্য নয়), আপনি execযদি ফেরতের মানের প্রয়োজন না হন তবে আপনি সর্বদা ব্যবহার করতে পারেন। বলতে হয়, আপনি ব্যবহার করতে পারেন eval('my_func(42)')বা exec('my_func(42)'), পার্থক্য যে হচ্ছে evalআয় মান দ্বারা ফিরে my_func, এবং execএটা পরিত্যাগ:

>>> def my_func(arg):
...     print("Called with %d" % arg)
...     return arg * 2
... 
>>> exec('my_func(42)')
Called with 42
>>> eval('my_func(42)')
Called with 42
84
>>> 

2, শুধুমাত্র execসোর্স কোড যে বিবৃতি, ধারণ করে গ্রহণ মত def, for, while, import, অথবা class, নিয়োগ বিবৃতি (ওরফে a = 42), অথবা সমগ্র প্রোগ্রাম:

>>> exec('for i in range(3): print(i)')
0
1
2
>>> eval('for i in range(3): print(i)')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax

উভয়ই গ্রহণ করুন execএবং eval2 টি অতিরিক্ত অবস্থানগত আর্গুমেন্ট গ্রহণ করুন - globalsএবং locals- যা কোডটি দেখায় যে গ্লোবাল এবং স্থানীয় ভেরিয়েবল স্কোপ। এই ডিফল্টগুলি globals()এবং locals()সেই স্কোপের মধ্যে যেটি ডেকেছিল execবা eval, কিন্তু যে কোনও অভিধানের জন্য globalsএবং যে কোনওটির mappingজন্য locals( dictঅবশ্যই সহ ) ব্যবহার করা যেতে পারে । এগুলি কেবল কোডটি দেখায় এমন ভেরিয়েবলগুলিকে সীমাবদ্ধ / সংশোধন করতেই ব্যবহার করা যায় না, তবে প্রায়শই execইউটিড কোড তৈরি করা ভেরিয়েবলগুলি ক্যাপচার করার জন্যও ব্যবহৃত হয় :

>>> g = dict()
>>> l = dict()
>>> exec('global a; a, b = 123, 42', g, l)
>>> g['a']
123
>>> l
{'b': 42}

(আপনি সমগ্র মান প্রদর্শন তাহলে g, এটা অনেক লম্বা হবে কারণ execএবং evalযোগ বিল্ট-ইন হিসেবে মডিউল __builtins__globals স্বয়ংক্রিয়ভাবে যদি এটা অনুপস্থিত করার জন্য)।

পাইথন 2-তে, execবিবৃতিটির জন্য সরকারী বাক্য গঠন আসলে exec code in globals, localsযেমন রয়েছে

>>> exec 'global a; a, b = 123, 42' in g, l

তবে বিকল্প বাক্য গঠন exec(code, globals, locals)সর্বদা গ্রহণযোগ্য হয়েছে (নীচে দেখুন)।

compile

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)বিল্ট-ইন সঙ্গে একই কোড বারবার আমন্ত্রণ গতি বাড়াতে ব্যবহার করা যেতে পারে execবা evalএকটি মধ্যে উৎস সংকলন দ্বারা codeপূর্বেই অবজেক্ট। modeপরামিতি নিয়ন্ত্রণ কোড টুকরা ধরনের compileফাংশন গ্রহণ এবং বাইটকোড এটা উৎপন্ন ধরনের। পছন্দ 'eval', 'exec'এবং 'single':

  • 'eval'মোড একটি একক অভিব্যক্তি প্রত্যাশা করে, এবং বাইটোকোড তৈরি করবে যা চালানো হলে সেই অভিব্যক্তির মান ফিরে আসবে :

    >>> dis.dis(compile('a + b', '<string>', 'eval'))
      1           0 LOAD_NAME                0 (a)
                  3 LOAD_NAME                1 (b)
                  6 BINARY_ADD
                  7 RETURN_VALUE
    
  • 'exec'কোডের সম্পূর্ণ মডিউলগুলিতে একক অভিব্যক্তি থেকে শুরু করে যেকোন ধরণের পাইথন নির্মাণকে গ্রহণ করে এবং এগুলি কার্যকর করে যেন তারা মডিউল শীর্ষ-স্তরের বিবৃতি। কোড অবজেক্ট ফেরত দেয় None:

    >>> dis.dis(compile('a + b', '<string>', 'exec'))
      1           0 LOAD_NAME                0 (a)
                  3 LOAD_NAME                1 (b)
                  6 BINARY_ADD
                  7 POP_TOP                             <- discard result
                  8 LOAD_CONST               0 (None)   <- load None on stack
                 11 RETURN_VALUE                        <- return top of stack
    
  • 'single'একটি সীমিত রূপ 'exec'যা এর একটি একক বিবৃতি (বা একাধিক বিবৃতি দ্বারা পৃথক পৃথক ;) সম্বলিত একটি উত্স কোড গ্রহণ করে যদি শেষ বিবৃতিটি একটি অভিব্যক্তি বিবৃতি হয়, ফলস্বরূপ বাইটকোড স্ট্যান্ডার্ড আউটপুট (!) এ সেই অভিব্যক্তির মানটিও মুদ্রণ করেrepr

    একটি if- elif- elseশৃঙ্খল সঙ্গে একটি লুপ else, এবং tryতার সঙ্গে except, elseএবং finallyব্লক একটি একক বিবৃতি বিবেচনা করা হয়।

    একটি উত্স 2 toplevel বিবৃতি ধারণকারী টুকরা জন্য একটি ত্রুটি 'single'ছাড়া পাইথন 2 আছে, একটি বাগ যে কখনও কখনও কোডে একাধিক toplevel বিবৃতি দেয়; কেবল প্রথমটি সংকলিত হয়; বাকিগুলি উপেক্ষা করা হয়:

    পাইথন ২.7.৮ এ:

    >>> exec(compile('a = 5\na = 6', '<string>', 'single'))
    >>> a
    5
    

    এবং পাইথন ৩.৪.২ এ:

    >>> exec(compile('a = 5\na = 6', '<string>', 'single'))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<string>", line 1
        a = 5
            ^
    SyntaxError: multiple statements found while compiling a single statement
    

    ইন্টারেক্টিভ পাইথন শেল তৈরির জন্য এটি খুব দরকারী। যাইহোক, আপনি ফলাফল কোড এমনকি যদি, অভিব্যক্তি মান ফিরে নাeval

এভাবে সর্বশ্রেষ্ঠ পার্থক্য execএবং evalআসলে থেকে আসে compileফাংশন এবং এর মোড।


বাইটোকোডে সোর্স কোডটি সংকলন করা ছাড়াও অবজেক্ট সিনট্যাক্স ট্রি (পাইথন কোডের পার্স ট্রি) অবজেক্টে compileসংকলন সমর্থন করে; এবং অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রিগুলিতে উত্স কোড ( পাইথনে লিখিত এবং কেবল কল ); এগুলি উড়ানের উত্স কোড পরিবর্তন করার জন্য এবং গতিশীল কোড তৈরির জন্য উদাহরণস্বরূপ ব্যবহৃত হয়, কারণ জটিল ক্ষেত্রে পাঠ্য লাইনের পরিবর্তে নোডের গাছ হিসাবে কোড পরিচালনা করা প্রায়শই সহজ।codeast.parsecompile(source, filename, mode, PyCF_ONLY_AST)


যদিও eval, আপনি পারবেন শুধুমাত্র আপনার একটি স্ট্রিং, যাতে একটি একক অভিব্যক্তি রয়েছে মূল্যায়ন করতে পারবেন evalএকটি সম্পূর্ণ বিবৃতি, অথবা এমনকি একটি সম্পূর্ণ মডিউল হয়েছে যে compileবাইটকোডে গঠন করে নিতে ঘ; অর্থাত পাইথন 2 সহ printএটি একটি বিবৃতি, এবং evalসরাসরি নেতৃত্ব দেওয়া যায় না:

>>> eval('for i in range(3): print("Python is cool")')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    for i in range(3): print("Python is cool")
      ^
SyntaxError: invalid syntax

compileএটি 'exec'একটি codeবস্তুতে মোড সহ এবং আপনি eval এটি করতে পারেন ; evalফাংশন ফিরে আসবে None

>>> code = compile('for i in range(3): print("Python is cool")',
                   'foo.py', 'exec')
>>> eval(code)
Python is cool
Python is cool
Python is cool

মধ্যে এক মনে হলে evalএবং execCPython 3 সোর্স কোড, এই খুব স্পষ্ট; তারা উভয়ই PyEval_EvalCodeএকই যুক্তি দিয়ে কল করে, কেবলমাত্র পার্থক্য যা execস্পষ্টভাবে প্রত্যাবর্তন করেNone

execপাইথন 2 এবং পাইথন 3 এর মধ্যে সিনট্যাক্স পার্থক্য

পাইথন 2 এর অন্যতম প্রধান পার্থক্য হ'ল এটি execএকটি বিবৃতি এবং evalএকটি অন্তর্নির্মিত ফাংশন (উভয় পাইথন 3-এ বিল্ট-ইন ফাংশন)। এটি একটি সুপরিচিত সত্য যে execপাইথন 2 এ অফিশিয়াল সিনট্যাক্স exec code [in globals[, locals]]

পাইথন 2-টু-3 সংখ্যাগরিষ্ঠ ভিন্ন পোর্টিং গাইড মনে সুপারিশ , execCPython 2 বিবৃতি এছাড়াও সিনট্যাক্স ব্যবহার করা যেতে পারে যে কেমন লাগে ঠিক মত execপাইথন 3. ফাংশন আবাহন কারণ হলো পাইথন 0.9.9 ছিল exec(code, globals, locals)বিল্ট কার্যরত! এবং পাইথন ১.০ প্রকাশের আগে কোথাও এই অন্তর্নির্মিত কার্যটিexec বিবৃতি দিয়ে প্রতিস্থাপন করা হয়েছিল ।

যেহেতু পাইথন ০.৯.৯ এর সাথে পিছনে সামঞ্জস্যতা না ভাঙাই পছন্দনীয়, তাই গাইডো ভ্যান রসুম ১৯৯৩ সালে একটি সামঞ্জস্য হ্যাক যুক্ত করেছিলেন : যদি এটি codeদৈর্ঘ্য 2 বা 3 এর দৈর্ঘ্য ছিল globalsএবং যদি বিবৃতিতে না দেওয়া হয়, তবে তা ব্যাখ্যা করা হবে যেন টিপলের দ্বিতীয় এবং তৃতীয় উপাদান যথাক্রমে এবং হয়। সামঞ্জস্য হ্যাকের কথা পাইথন ১.৪ ডকুমেন্টেশনেও পাওয়া যায় নি (অনলাইনে উপলব্ধ প্রাচীনতম সংস্করণ) ; এবং এইভাবে পোর্টিং গাইড এবং সরঞ্জামগুলির অনেক লেখকের কাছে জানা ছিল না, যতক্ষণ না এটি ২০১২ সালের নভেম্বরে আবার নথিভুক্ত করা হয়েছিল :localsexeccodeglobalslocals

প্রথম প্রকাশটি 2 বা 3 দৈর্ঘ্যের একটি দ্বিগুণও হতে পারে এই ক্ষেত্রে, caseচ্ছিক অংশগুলি বাদ দিতে হবে। ফর্ম exec(expr, globals)সমতূল্য exec expr in globalsযখন ফর্ম, exec(expr, globals, locals)সমতূল্য exec expr in globals, locals। টিউপল ফর্মটি execপাইথন 3 এর সাথে সামঞ্জস্যতা সরবরাহ করে, যেখানে execবিবৃতি না দিয়ে একটি ফাংশন রয়েছে।

হ্যাঁ, সিপিথন ২.7-এ হ'ল এটি একটি ফরোয়ার্ড-সামঞ্জস্যতা বিকল্প হিসাবে উল্লেখ করা হয়েছে (লোকেরা কেন পিছনে সামঞ্জস্যের বিকল্প রয়েছে তা নিয়ে কেন বিভ্রান্তি হয়), যখন এটি আসলে দুই দশক ধরে পিছিয়ে-সামঞ্জস্যের জন্য ছিল

সুতরাং execপাইথন 1 এবং পাইথন 2-তে একটি বিবৃতি এবং পাইথন 3 এবং পাইথন 0.9.9-এ একটি অন্তর্নির্মিত ফাংশন রয়েছে,

>>> exec("print(a)", globals(), {'a': 42})
42

সম্ভবত সর্বদা বহুল প্রচারিত পাইথন সংস্করণে অভিন্ন আচরণ রয়েছে; এবং জাইথন ​​২.২.২, পাইপাই ২.৩.১ (পাইথন ২.7..6) এবং আয়রন পাইথন ২.6.১ এও কাজ করে (সিপিথনের অননুমোদিত আচরণ অনুসরণ করে তাদের কাছে কুডোস)।

পাইথনস 1.0 - 2.7 এর সামঞ্জস্য হ্যাকের সাহায্যে আপনি যা করতে পারবেন না তা হ'ল তার execভেরিয়েবলের রিটার্ন ভ্যালু সংরক্ষণ করতে :

Python 2.7.11+ (default, Apr 17 2016, 14:00:29) 
[GCC 5.3.1 20160413] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = exec('print(42)')
  File "<stdin>", line 1
    a = exec('print(42)')
           ^
SyntaxError: invalid syntax

(যা পাইথন 3 তে কার্যকর হবে না, execবরাবরের মতো ফিরে আসে None) বা এখানে একটি রেফারেন্স দিন exec:

>>> call_later(exec, 'print(42)', delay=1000)
  File "<stdin>", line 1
    call_later(exec, 'print(42)', delay=1000)
                  ^
SyntaxError: invalid syntax

এটি এমন একটি নিদর্শন যা সম্ভবত বাস্তবে ব্যবহার করা সম্ভব, যদিও অসম্ভব;

বা এটি একটি তালিকা উপলব্ধিতে ব্যবহার করুন:

>>> [exec(i) for i in ['print(42)', 'print(foo)']
  File "<stdin>", line 1
    [exec(i) for i in ['print(42)', 'print(foo)']
        ^
SyntaxError: invalid syntax

যা তালিকা বোঝার অপব্যবহার ( forপরিবর্তে একটি লুপ ব্যবহার করুন!)।


ছিল [i for i in globals().values() if hasattr(i, '__call__')][0]এক বিবৃতিতে বা অভিব্যক্তি? এটি যদি একটি অভিব্যক্তি হয় তবে আমি কেন এটি @সাজসজ্জার হিসাবে ব্যবহার করতে পারি না ?
মারিও

এটি একটি অভিব্যক্তি। 42এটিও একটি অভিব্যক্তি, এবং আপনি এটি @একটি সজ্জা হিসাবে ব্যবহার করতে পারবেন না ।
অ্যান্টি হাপাল

সাজসজ্জা সিনট্যাক্স হয় decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE; যেমন আপনি সজ্জা হিসাবে কেবল স্বেচ্ছাসেবক হিসাবে কেবলমাত্র (সম্ভবত একটি বিন্দুযুক্ত) সনাক্তকারী হিসাবে ব্যবহার করতে পারবেন না followedচ্ছিক কল আর্গুমেন্টগুলি অনুসরণ করুন।
অ্যান্টি হাপাল

1
কোনও অ্যাসাইনমেন্টের ডানদিকে রেখে এবং এখনও সংকলন করা যায় এমন কোনও কিছুই এক্সপ্রেশন নয়। উদাহরণস্বরূপ, a = b = cএটি পুরোপুরি বৈধ বিবৃতি, যেমন এর ডানদিকে রয়েছে b = c- যা কোনও অভিব্যক্তি নয়।
টম

194
  1. execএকটি অভিব্যক্তি নয়: পাইথন ২.x এর একটি বিবৃতি, এবং পাইথন ৩.x এর একটি ফাংশন এটি স্ট্রিংতে থাকা বিবৃতি বা বিবৃতিটির সংকলন এবং অবিলম্বে মূল্যায়ন করে। উদাহরণ:

    exec('print(5)')           # prints 5.
    # exec 'print 5'     if you use Python 2.x, nor the exec neither the print is a function there
    exec('print(5)\nprint(6)')  # prints 5{newline}6.
    exec('if True: print(6)')  # prints 6.
    exec('5')                 # does nothing and returns nothing.
    
  2. evalএকটি বিল্ট-ইন ফাংশন (হয় না এক বিবৃতিতে), যা একটি অভিব্যক্তি এবং আয় মান অভিব্যক্তি উত্পাদন করে মূল্যায়ন করে। উদাহরণ:

    x = eval('5')              # x <- 5
    x = eval('%d + 6' % x)     # x <- 11
    x = eval('abs(%d)' % -100) # x <- 100
    x = eval('x = 5')          # INVALID; assignment is not an expression.
    x = eval('if 1: x = 4')    # INVALID; if is a statement, not an expression.
    
  3. compileএকটি নিম্ন স্তরের সংস্করণ execএবং eval। এটি আপনার বিবৃতি বা অভিব্যক্তিগুলি কার্যকর বা মূল্যায়ন করে না, তবে কোনও কোড অবজেক্ট দেয় যা এটি করতে পারে। পদ্ধতিগুলি নিম্নরূপ:

    1. compile(string, '', 'eval')কোড ऑজেক্টটি প্রদান করে যা আপনি করানো হলে তা কার্যকর করা হত eval(string)। মনে রাখবেন আপনি এই মোডে বিবৃতি ব্যবহার করতে পারবেন না ; শুধুমাত্র একটি (একক) এক্সপ্রেশনটি বৈধ।
    2. compile(string, '', 'exec')কোড ऑজেক্টটি প্রদান করে যা আপনি করানো হলে তা কার্যকর করা হত exec(string)। আপনি এখানে যে কোনও সংখ্যক বিবৃতি ব্যবহার করতে পারেন।
    3. compile(string, '', 'single')execমোডের মতো তবে এটি প্রথম বিবৃতি ব্যতীত সমস্ত কিছু উপেক্ষা করবে। নোট করুন যে এর ফলাফলগুলি সহ একটি if/ elseবিবৃতি একটি একক বিবৃতি হিসাবে বিবেচিত হয়।

40
পাইথন 3-তে exec()এখন আসলে একটি ফাংশন।
টিম পিটজ্যাকার

2
যেহেতু (যেমন আপনি উল্লেখ করেছেন), execআপনি যে সংস্করণটিকে লক্ষ্য রেখেছিলেন তার একটি বিবৃতি, সুতরাং এই প্যারেনগুলি অন্তর্ভুক্ত করা প্রতারণামূলক এবং যদি আপনি এটি ব্যবহার করার চেষ্টা করেন তবে in globals, localsএটিও বগি।
মাইক গ্রাহাম

2
@MikeGraham exec প্রথম বন্ধনী এবং পাইথন 2 আবাহন মত ফাংশন সমর্থন
আন্তি হাপালা

2
অ্যান্টিহাপালা ইনসোফার হিসাবে অ্যাসাইনমেন্ট হিসাবে 'প্রথম বন্ধনী সমর্থন করে' কারণ আপনি করতে পারেন x = (y), এটি সত্য হতে পারে। অন্য বিবৃতি-পরিণত-ফাংশন হয় print; print(1, 2, 3)অজগর 2 এবং 3 এর ফলাফলের তুলনা করুন
habnabit

1
পছন্দ করুন আমার উত্তরটির নীচের অংশটি এখানে পড়ুন এবং অবাক হন।
আন্তি হাপালা

50

এক্সিকিউট বিবৃতি জন্য এবং কিছুই ফেরত না। eval হল প্রকাশের জন্য এবং প্রকাশের অভিব্যক্তির মান।

অভিব্যক্তিটির অর্থ "কিছু" যখন বিবৃতি মানে "কিছু করা"।


9
দ্বিতীয় অনুচ্ছেদটি এমন সরলকরণ যা এটি প্রায় একটি মিথ্যা হয়ে যায়, এতে কোনও ফাংশন কল অন্তর্ভুক্ত থাকলে একটি অভিব্যক্তি খুব কিছু করতে পারে।
আন্তি হাপাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.