আমি পাইথন কোডটির গতিশীল মূল্যায়নের দিকে লক্ষ্য করছি eval()
এবং এর compile()
কাজগুলি এবং exec
বিবৃতিটি দেখতে পাচ্ছি ।
কেউ দয়া করে eval
এবং এর মধ্যে পার্থক্যটি ব্যাখ্যা করতে পারেন exec
এবং কীভাবে বিভিন্ন ধরণের compile()
ফিট রয়েছে?
আমি পাইথন কোডটির গতিশীল মূল্যায়নের দিকে লক্ষ্য করছি eval()
এবং এর compile()
কাজগুলি এবং exec
বিবৃতিটি দেখতে পাচ্ছি ।
কেউ দয়া করে eval
এবং এর মধ্যে পার্থক্যটি ব্যাখ্যা করতে পারেন exec
এবং কীভাবে বিভিন্ন ধরণের compile()
ফিট রয়েছে?
উত্তর:
মূলত, eval
ব্যবহার করা হয় Eval uate একটি একক পরিবর্তনশীল উত্পন্ন পাইথন অভিব্যক্তি, এবং exec
ব্যবহার করা হয় Exec Ute পরিবর্তনশীল শুধুমাত্র তার পার্শ্ব প্রতিক্রিয়া জন্য পাইথন কোড উত্পন্ন।
eval
এবং exec
এই দুটি পার্থক্য আছে:
eval
কেবলমাত্র একটি একক অভিব্যক্তি গ্রহণ করে , exec
পাইথন স্টেটমেন্ট রয়েছে এমন একটি কোড ব্লক নিতে পারে: লুপস try: except:
, class
এবং ফাংশন / পদ্ধতি def
ইনসেশন এবং আরও অনেক কিছু।
পাইথনের একটি অভিব্যক্তি হ'ল ভেরিয়েবল অ্যাসাইনমেন্টে মান হিসাবে যা কিছু থাকতে পারে:
a_variable = (anything you can put within these parentheses is an expression)
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
প্রকৃতপক্ষে স্টেটমেন্টটি (যার মধ্যে পাইথন উত্স কোড রয়েছে ) পাস করা হয় কেবল তখনই "আইওয়াল কেবল একটি একক অভিব্যক্তি গ্রহণ করে" বিবৃতিটি প্রযোজ্য । তারপরে এটি অভ্যন্তরীণভাবে বাইটকোড ব্যবহার করে সংকলিত হয় এখানেই তাত্পর্যটি আসে।eval
compile(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
এবং eval
2 টি অতিরিক্ত অবস্থানগত আর্গুমেন্ট গ্রহণ করুন - 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
সংকলন সমর্থন করে; এবং অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রিগুলিতে উত্স কোড ( পাইথনে লিখিত এবং কেবল কল ); এগুলি উড়ানের উত্স কোড পরিবর্তন করার জন্য এবং গতিশীল কোড তৈরির জন্য উদাহরণস্বরূপ ব্যবহৃত হয়, কারণ জটিল ক্ষেত্রে পাঠ্য লাইনের পরিবর্তে নোডের গাছ হিসাবে কোড পরিচালনা করা প্রায়শই সহজ।code
ast.parse
compile(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
এবং exec
CPython 3 সোর্স কোড, এই খুব স্পষ্ট; তারা উভয়ই PyEval_EvalCode
একই যুক্তি দিয়ে কল করে, কেবলমাত্র পার্থক্য যা exec
স্পষ্টভাবে প্রত্যাবর্তন করেNone
।
exec
পাইথন 2 এবং পাইথন 3 এর মধ্যে সিনট্যাক্স পার্থক্যপাইথন 2 এর অন্যতম প্রধান পার্থক্য হ'ল এটি exec
একটি বিবৃতি এবং eval
একটি অন্তর্নির্মিত ফাংশন (উভয় পাইথন 3-এ বিল্ট-ইন ফাংশন)। এটি একটি সুপরিচিত সত্য যে exec
পাইথন 2 এ অফিশিয়াল সিনট্যাক্স exec code [in globals[, locals]]
।
পাইথন 2-টু-3 সংখ্যাগরিষ্ঠ ভিন্ন পোর্টিং গাইড মনে সুপারিশ , exec
CPython 2 বিবৃতি এছাড়াও সিনট্যাক্স ব্যবহার করা যেতে পারে যে কেমন লাগে ঠিক মত exec
পাইথন 3. ফাংশন আবাহন কারণ হলো পাইথন 0.9.9 ছিল exec(code, globals, locals)
বিল্ট কার্যরত! এবং পাইথন ১.০ প্রকাশের আগে কোথাও এই অন্তর্নির্মিত কার্যটিexec
বিবৃতি দিয়ে প্রতিস্থাপন করা হয়েছিল ।
যেহেতু পাইথন ০.৯.৯ এর সাথে পিছনে সামঞ্জস্যতা না ভাঙাই পছন্দনীয়, তাই গাইডো ভ্যান রসুম ১৯৯৩ সালে একটি সামঞ্জস্য হ্যাক যুক্ত করেছিলেন : যদি এটি code
দৈর্ঘ্য 2 বা 3 এর দৈর্ঘ্য ছিল globals
এবং যদি বিবৃতিতে না দেওয়া হয়, তবে তা ব্যাখ্যা করা হবে যেন টিপলের দ্বিতীয় এবং তৃতীয় উপাদান যথাক্রমে এবং হয়। সামঞ্জস্য হ্যাকের কথা পাইথন ১.৪ ডকুমেন্টেশনেও পাওয়া যায় নি (অনলাইনে উপলব্ধ প্রাচীনতম সংস্করণ) ; এবং এইভাবে পোর্টিং গাইড এবং সরঞ্জামগুলির অনেক লেখকের কাছে জানা ছিল না, যতক্ষণ না এটি ২০১২ সালের নভেম্বরে আবার নথিভুক্ত করা হয়েছিল :locals
exec
code
globals
locals
প্রথম প্রকাশটি 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
পরিবর্তে একটি লুপ ব্যবহার করুন!)।
42
এটিও একটি অভিব্যক্তি, এবং আপনি এটি @
একটি সজ্জা হিসাবে ব্যবহার করতে পারবেন না ।
decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE
; যেমন আপনি সজ্জা হিসাবে কেবল স্বেচ্ছাসেবক হিসাবে কেবলমাত্র (সম্ভবত একটি বিন্দুযুক্ত) সনাক্তকারী হিসাবে ব্যবহার করতে পারবেন না followedচ্ছিক কল আর্গুমেন্টগুলি অনুসরণ করুন।
a = b = c
এটি পুরোপুরি বৈধ বিবৃতি, যেমন এর ডানদিকে রয়েছে b = c
- যা কোনও অভিব্যক্তি নয়।
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.
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.
compile
একটি নিম্ন স্তরের সংস্করণ exec
এবং eval
। এটি আপনার বিবৃতি বা অভিব্যক্তিগুলি কার্যকর বা মূল্যায়ন করে না, তবে কোনও কোড অবজেক্ট দেয় যা এটি করতে পারে। পদ্ধতিগুলি নিম্নরূপ:
compile(string, '', 'eval')
কোড ऑজেক্টটি প্রদান করে যা আপনি করানো হলে তা কার্যকর করা হত eval(string)
। মনে রাখবেন আপনি এই মোডে বিবৃতি ব্যবহার করতে পারবেন না ; শুধুমাত্র একটি (একক) এক্সপ্রেশনটি বৈধ।compile(string, '', 'exec')
কোড ऑজেক্টটি প্রদান করে যা আপনি করানো হলে তা কার্যকর করা হত exec(string)
। আপনি এখানে যে কোনও সংখ্যক বিবৃতি ব্যবহার করতে পারেন।compile(string, '', 'single')
exec
মোডের মতো তবে এটি প্রথম বিবৃতি ব্যতীত সমস্ত কিছু উপেক্ষা করবে। নোট করুন যে এর ফলাফলগুলি সহ একটি if
/ else
বিবৃতি একটি একক বিবৃতি হিসাবে বিবেচিত হয়।exec()
এখন আসলে একটি ফাংশন।
exec
আপনি যে সংস্করণটিকে লক্ষ্য রেখেছিলেন তার একটি বিবৃতি, সুতরাং এই প্যারেনগুলি অন্তর্ভুক্ত করা প্রতারণামূলক এবং যদি আপনি এটি ব্যবহার করার চেষ্টা করেন তবে in globals, locals
এটিও বগি।
exec
প্রথম বন্ধনী এবং পাইথন 2 আবাহন মত ফাংশন সমর্থন ।
x = (y)
, এটি সত্য হতে পারে। অন্য বিবৃতি-পরিণত-ফাংশন হয় print
; print(1, 2, 3)
অজগর 2 এবং 3 এর ফলাফলের তুলনা করুন
এক্সিকিউট বিবৃতি জন্য এবং কিছুই ফেরত না। eval হল প্রকাশের জন্য এবং প্রকাশের অভিব্যক্তির মান।
অভিব্যক্তিটির অর্থ "কিছু" যখন বিবৃতি মানে "কিছু করা"।
[i for i in globals().values() if hasattr(i, '__call__')][0]
এক বিবৃতিতে বা অভিব্যক্তি? এটি যদি একটি অভিব্যক্তি হয় তবে আমি কেন এটি@
সাজসজ্জার হিসাবে ব্যবহার করতে পারি না ?