الفرق بين المراجعتين لصفحة: «Python/compile»

من موسوعة حسوب
 
(مراجعتان متوسطتان بواسطة مستخدمين اثنين آخرين غير معروضتين)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:الدالة <code>compile()‎</code> في بايثون}}</noinclude>
تُجمّع الدّالة <code>compile()‎</code> شيفرة بايثون مصدريّةً إلى شيفرة أو كائن AST. يُمكن تنفيذ هذه الكائنات عبر استخدام الدّالة <code>[[Python/exec|exec()‎]]</code> أو الدّالة <code>[[Python/eval|eval()‎]]</code>.
تُجمّع الدّالة <code>compile()‎</code> شيفرة بايثون مصدريّةً إلى شيفرة أو كائن AST. يُمكن تنفيذ هذه الكائنات عبر استخدام الدّالة <code>exec()‎</code> أو الدّالة <code>eval()‎</code>.  
==البنية العامة==
 
== البنية العامة ==
<syntaxhighlight lang="python3">
<syntaxhighlight lang="python3">
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
</syntaxhighlight>
</syntaxhighlight>
==المعاملات==
===<code>source</code>===
الشيفرة المصدريّة المرغوب تجميعها، يُمكن أن تكون قيمة المُعامل سلسلةً نصيّة، أو سلسلة بايتات نصيّة (byte string) أو كانًا من النّوع AST. انظر توثيق الوحدة [[Python/ast|ast]] للمزيد من المعلومات حول كائنات AST.
===<code>filename</code>===
اسم الملفّ الذي قُرِئَت منه الشيفرة. مرّر قيمةً مفهومةً إن لم تكن الشّيفرة قد قرئَت من ملفّ مُعيّن (من الشّائع استخدام القيمة <code>‎'‎<string>‎'‎‎</code> للإشارة أنّ الشيفرة لم تُقرأ من أيّ ملفّ).


== المعاملات ==
===<code>mode</code>===
=== <code>source</code> ===
الشيفرة المصدريّة المرغوب تجميعها، يُمكن أن تكون قيمة المُعامل سلسلةً نصيّة، أو سلسلة بايتات نصيّة (byte string) أو كانًا من النّوع AST. انظر توثيق الوحدة ast للمزيد من المعلومات حول كائنات AST.
 
=== <code>filename</code> ===
اسم الملفّ الذي قُرِئَت منه الشيفرة. مرّر قيمةً مألوفةً إن لم تكن الشّيفرة قد قرئَت من ملفّ مُعيّن (من الشّائع استخدام القيمة <code>‎'‎<string>‎'‎‎</code>).
 
=== <code>mode</code> ===
مُعاملٌ يُحدّد نمط الشيفرة المرغوب تجميعها، يُمكن أن تكون قيمته <code>‎'‎exec‎'‎‎‎</code> إن كانت الشيفرة المصدريّة (أي قيمة المُعامل <code>source</code>) مجموعةً من الجمل (statements) البرمجيّة (مثل الشّروط وحلقات التّكرار...)، أو يُمكن أن تكون قيمته <code>‎'‎eval‎'‎‎‎</code> إن كانت الشّيفرة تعبيرًا (expression) واحدًا، أو يُمكن أن تكون قيمته <code>‎'‎single‎'‎‎‎</code> إن كانت الشّيفرة جملةً برمجيّة تفاعليّةً واحدة (في هذه الحالة الأخيرة، ستُطبَع الجمل التي تُعيد قيمةً غير القيمة None).
مُعاملٌ يُحدّد نمط الشيفرة المرغوب تجميعها، يُمكن أن تكون قيمته <code>‎'‎exec‎'‎‎‎</code> إن كانت الشيفرة المصدريّة (أي قيمة المُعامل <code>source</code>) مجموعةً من الجمل (statements) البرمجيّة (مثل الشّروط وحلقات التّكرار...)، أو يُمكن أن تكون قيمته <code>‎'‎eval‎'‎‎‎</code> إن كانت الشّيفرة تعبيرًا (expression) واحدًا، أو يُمكن أن تكون قيمته <code>‎'‎single‎'‎‎‎</code> إن كانت الشّيفرة جملةً برمجيّة تفاعليّةً واحدة (في هذه الحالة الأخيرة، ستُطبَع الجمل التي تُعيد قيمةً غير القيمة None).
 
===<code>flags</code>===
=== <code>flags</code> ===
مُعامل اختياريّ يُحدّد أيًّا من الجمل المستقبليّة (future statements) ستُؤثر على تجميع الشّيفرة المصدريّة. إن لم تُحدّد قيمة كلّ من المُعامل <code>flags</code> والمُعامل <code>dont_inherit</code> أو إن كانت قيمتهما تُساوي 0، فستُجمَّع الشّيفرة مع استعمال الجمل المُستقبليّة الموجودة في الشّيفرة التي تستدعي الدّالة <code>compile()‎</code>. إن مُرّر المُعامل <code>flags</code> ولم يُمرّر المُعامل <code>dont_inherit</code> (أو كانت قيمته صفرًا) فستُستخدم الجمل المُستقبليّة المُحدّدة من طرف المُعامل <code>flags</code> إضافةً إلى تلك التّي ستُستخدم في الأصل.
مُعامل اختياريّ يُحدّد أيًّا من الجمل المستقبليّة (future statements) ستُؤثر على تجميع الشّيفرة المصدريّة. إن لم تُحدّد قيمة كلّ من المُعامل <code>flags</code> والمُعامل <code>dont_inherit</code> أو إن كانت قيمتهما تُساوي 0، فستُجمَّع الشّيفرة مع استعمال الجمل المُستقبليّة الموجودة في الشّيفرة التي تستدعي الدّالة <code>compile()‎</code>. إن مُرّر المُعامل <code>flags</code> ولم يُمرّر المُعامل <code>dont_inherit</code> (أو كانت قيمته صفرًا) فستُستخدم الجمل المُستقبليّة المُحدّدة من طرف المُعامل <code>flags</code> إضافةً إلى تلك التّي ستُستخدم في الأصل.
=== <code>dont_inherit</code> ===
===<code>dont_inherit</code>===
مُعامل اختياريّ آخر يُحدّد كيفيّة التّعامل مع الجمل المُستقبليّة في الشّيفرة المصدريّة، (انظر المُعامل <code>flags</code>).
مُعامل اختياريّ آخر يُحدّد كيفيّة التّعامل مع الجمل المُستقبليّة في الشّيفرة المصدريّة، (انظر المُعامل <code>flags</code>).


سطر 25: سطر 20:


تُحدّد الجمل المُستقبليّة عبر بتّات (bits) يُمكن ربطها بعمليّة bitwise OR لتحديد جمل مُتعدّدة.
تُحدّد الجمل المُستقبليّة عبر بتّات (bits) يُمكن ربطها بعمليّة bitwise OR لتحديد جمل مُتعدّدة.
يُمكن إيجاد حقل البتّات المطلوب لتحديد ميّزة مُعيّنة في الخاصيّة <code>compiler_flag</code> الموجودة على النّسخة <code>_Feature</code> في الوحدة <code><nowiki>__future__</nowiki></code>.


=== <code>optimize</code> ===
يُمكن إيجاد حقل البتّات المطلوب لتحديد ميّزة مُعيّنة في الخاصيّة <code>compiler_flag</code> الموجودة على النّسخة ‎<code>_Feature</code> في الوحدة <code><nowiki>__future__</nowiki></code>.
===<code>optimize</code>===
يُحدّد هذا المُعامل مستوى التّحسين للمُجمّع؛ القيمة الافتراضيّة هي <code>‎-‎1</code> وتختار مستوى التحسين حسب ما أُعطِيَ للمُفسّر (interpreter) عبر خيارات <code>‎-O</code> في سطر الأوامر.
يُحدّد هذا المُعامل مستوى التّحسين للمُجمّع؛ القيمة الافتراضيّة هي <code>‎-‎1</code> وتختار مستوى التحسين حسب ما أُعطِيَ للمُفسّر (interpreter) عبر خيارات <code>‎-O</code> في سطر الأوامر.


مُستويات التّحسين هي كالتّالي:
مُستويات التّحسين هي كالتّالي:
* <code>0</code>: لا تحسين، قيمة <code>‎_‎_‎debug‎_‎_‎</code> صحيحة (True).
*<code>0</code>: لا تحسين، قيمة <code>‎_‎_‎debug‎_‎_‎</code> صحيحة (True).
* <code>1</code>: تُحذف التأكيدات (asserts)، وقيمة <code><nowiki>‎_‎_‎debug‎_‎_</nowiki>‎</code> خاطئة (False).
*<code>1</code>: تُحذف التأكيدات (asserts)، وقيمة <code><nowiki>‎_‎_‎debug‎_‎_</nowiki>‎</code> خاطئة (False).
* <code>2</code>: تُحذف السّلاسل النّصيّة الموثّقة (docstrings) كذلك.
*<code>2</code>: تُحذف السّلاسل النّصيّة الموثّقة (docstrings) كذلك.
 
==القيمة المعادة==
== القيمة المعادة ==
شيفرة أو كائن AST يُمكن تنفيذه بالدّالة <code>exec()‎</code> أو بالدّالة <code>eval()‎</code>.
شيفرة أو كائن AST يُمكن تنفيذه بالدّالة <code>exec()‎</code> أو بالدّالة <code>eval()‎</code>.
 
==الاستثناءات==
== الاستثناءات ==
*استثناء [[Python/built-in exceptions#SyntaxError|SyntaxError]] إن كانت الشّيفرة المُجمَّعةُ غير صالحة.
* استثناء [[Python/SyntaxError|SyntaxError]] إن كانت الشّيفرة المُجمَّعةُ غير صالحة.
*استثناء [[Python/built-in exceptions#ValueError|ValueError]] إن كانت الشّيفرة المصدريّة تحتوي على بيتات فارغة (null bytes).
* استثناء [[Python/ValueError|ValueError]] إن كانت الشّيفرة المصدريّة تحتوي على بيتات فارغة (null bytes).
==أمثلة==
 
المثال التّالي يوضّح كيفيّة عمل هذه الدّالة:<syntaxhighlight lang="python3">
== أمثلة ==
>>> eval_code = compile('2*2', '<string>', 'eval') # تعبير حسابيّ
المثال التّالي يوضّح كيفيّة عمل هذه الدّالة:
<syntaxhighlight lang="python3">
>>> eval_code = compile('2*2', '<string>', 'eval') # تعبير رياضيّ
>>> eval(eval_code)
>>> eval(eval_code)
4
4
سطر 52: سطر 43:
Hi!
Hi!
</syntaxhighlight>
</syntaxhighlight>
 
==ملاحظات==
== ملاحظات ==
*عند تجميع سلسلة نصيّة تحتوي على عدّة أسطر برمجيّة في النّمط <code>‎'‎single‎'‎</code> أو النّمط <code>‎'‎eval‎'‎‎</code>، فيجب على المُدخل أن ينتهي بمحرف سطر جديد (newline character) واحد على الأقل. وذلك لتسهيل التّعرف على الجمل المُكتملة وغير المُكتملة في الوحدة [[Python/code|code]].
* عند تجميع سلسلة نصيّة تحتوي على عدّة أسطر برمجيّة في النّمط <code>‎'‎single‎'‎</code> أو النّمط <code>‎'‎eval‎'‎‎</code>، فيجب على المُدخل أن ينتهي بمحرف سطر جديد (newline character) واحد على الأقل. وذلك لتسهيل التّعرف على الجمل المُكتملة وغير المُكتملة في الوحدة [[Python/code|code]].
*يُمكن أن يحدث عطل مُفاجئ لمُفسّر بايثون بشيفرة مصدريّة كبيرة أو مُعقّدة عند تجميعها إلى كائن AST، وذلك بسبب القيود الموجودة في مُجمّع AST الخاصّ بلغة بايثون.
* يُمكن أن يحدث عطل مُفاجئ لمُفسّر بايثون بشيفرة مصدريّة كبيرة أو مُعقّدة عند تجميعها إلى كائن AST، وذلك بسبب القيود الموجودة في مُجمّع AST الخاصّ بلغة بايثون.
==انظر أيضًا==
 
*صفحة [[Python/built-in exceptions|الاسثناءات المضمنة في بايثون]].
== انظر أيضًا ==
*الدالة <code>[[Python/exec|exec()‎]]</code>: تستعمل لتنفيذ شيفرة بايثون ديناميكيًا.
* [[Python/ValueError|ValueError]].
*الدالة <code>[[Python/eval|eval()‎]]</code>: تستعمل لتقدير قيمة تعبير من تعابير لغة بايثون.
* [[Python/__future__|__future__]].
==مصادر==
* [[Python/SyntaxError|SyntaxError]].
*[https://docs.python.org/3/library/functions.html#compile قسم الدالة compile في صفحة Functions في توثيق Python الرسمي].<noinclude>{{DISPLAYTITLE:الدالة <code>compile()‎</code> في بايثون}}</noinclude>
 
== مصادر ==
* [https://docs.python.org/3/library/functions.html#compile قسم الدالة compile في صفحة Functions في توثيق Python الرسمي].
[[تصنيف:Python]]
[[تصنيف:Python]]
[[تصنيف:Python Function]]
[[تصنيف:Python Function]]
[[تصنيف:Python Built-in Functions]]
[[تصنيف:Python Built-in Functions]]

المراجعة الحالية بتاريخ 16:05، 25 مايو 2018

تُجمّع الدّالة compile()‎ شيفرة بايثون مصدريّةً إلى شيفرة أو كائن AST. يُمكن تنفيذ هذه الكائنات عبر استخدام الدّالة exec()‎ أو الدّالة eval()‎.

البنية العامة

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

المعاملات

source

الشيفرة المصدريّة المرغوب تجميعها، يُمكن أن تكون قيمة المُعامل سلسلةً نصيّة، أو سلسلة بايتات نصيّة (byte string) أو كانًا من النّوع AST. انظر توثيق الوحدة ast للمزيد من المعلومات حول كائنات AST.

filename

اسم الملفّ الذي قُرِئَت منه الشيفرة. مرّر قيمةً مفهومةً إن لم تكن الشّيفرة قد قرئَت من ملفّ مُعيّن (من الشّائع استخدام القيمة ‎'‎<string>‎'‎‎ للإشارة أنّ الشيفرة لم تُقرأ من أيّ ملفّ).

mode

مُعاملٌ يُحدّد نمط الشيفرة المرغوب تجميعها، يُمكن أن تكون قيمته ‎'‎exec‎'‎‎‎ إن كانت الشيفرة المصدريّة (أي قيمة المُعامل source) مجموعةً من الجمل (statements) البرمجيّة (مثل الشّروط وحلقات التّكرار...)، أو يُمكن أن تكون قيمته ‎'‎eval‎'‎‎‎ إن كانت الشّيفرة تعبيرًا (expression) واحدًا، أو يُمكن أن تكون قيمته ‎'‎single‎'‎‎‎ إن كانت الشّيفرة جملةً برمجيّة تفاعليّةً واحدة (في هذه الحالة الأخيرة، ستُطبَع الجمل التي تُعيد قيمةً غير القيمة None).

flags

مُعامل اختياريّ يُحدّد أيًّا من الجمل المستقبليّة (future statements) ستُؤثر على تجميع الشّيفرة المصدريّة. إن لم تُحدّد قيمة كلّ من المُعامل flags والمُعامل dont_inherit أو إن كانت قيمتهما تُساوي 0، فستُجمَّع الشّيفرة مع استعمال الجمل المُستقبليّة الموجودة في الشّيفرة التي تستدعي الدّالة compile()‎. إن مُرّر المُعامل flags ولم يُمرّر المُعامل dont_inherit (أو كانت قيمته صفرًا) فستُستخدم الجمل المُستقبليّة المُحدّدة من طرف المُعامل flags إضافةً إلى تلك التّي ستُستخدم في الأصل.

dont_inherit

مُعامل اختياريّ آخر يُحدّد كيفيّة التّعامل مع الجمل المُستقبليّة في الشّيفرة المصدريّة، (انظر المُعامل flags).

إن كانت قيمة المُعامل dont_inherit عددًا صحيحًا مُخالفًا للصّفر، فستُتجاهل الجمل المُستقبليّة التي تُؤثّر حول استدعاء الدّالة compile()‎.

تُحدّد الجمل المُستقبليّة عبر بتّات (bits) يُمكن ربطها بعمليّة bitwise OR لتحديد جمل مُتعدّدة.

يُمكن إيجاد حقل البتّات المطلوب لتحديد ميّزة مُعيّنة في الخاصيّة compiler_flag الموجودة على النّسخة ‎_Feature في الوحدة __future__.

optimize

يُحدّد هذا المُعامل مستوى التّحسين للمُجمّع؛ القيمة الافتراضيّة هي ‎-‎1 وتختار مستوى التحسين حسب ما أُعطِيَ للمُفسّر (interpreter) عبر خيارات ‎-O في سطر الأوامر.

مُستويات التّحسين هي كالتّالي:

  • 0: لا تحسين، قيمة ‎_‎_‎debug‎_‎_‎ صحيحة (True).
  • 1: تُحذف التأكيدات (asserts)، وقيمة ‎_‎_‎debug‎_‎_‎ خاطئة (False).
  • 2: تُحذف السّلاسل النّصيّة الموثّقة (docstrings) كذلك.

القيمة المعادة

شيفرة أو كائن AST يُمكن تنفيذه بالدّالة exec()‎ أو بالدّالة eval()‎.

الاستثناءات

  • استثناء SyntaxError إن كانت الشّيفرة المُجمَّعةُ غير صالحة.
  • استثناء ValueError إن كانت الشّيفرة المصدريّة تحتوي على بيتات فارغة (null bytes).

أمثلة

المثال التّالي يوضّح كيفيّة عمل هذه الدّالة:

>>> eval_code = compile('2*2', '<string>', 'eval') # تعبير حسابيّ
>>> eval(eval_code)
4
>>> exec_code = compile("if 1 == True: print('Hi!')", '<string>', 'exec') # جملة شرطيّة
>>> exec(exec_code)
Hi!

ملاحظات

  • عند تجميع سلسلة نصيّة تحتوي على عدّة أسطر برمجيّة في النّمط ‎'‎single‎'‎ أو النّمط ‎'‎eval‎'‎‎، فيجب على المُدخل أن ينتهي بمحرف سطر جديد (newline character) واحد على الأقل. وذلك لتسهيل التّعرف على الجمل المُكتملة وغير المُكتملة في الوحدة code.
  • يُمكن أن يحدث عطل مُفاجئ لمُفسّر بايثون بشيفرة مصدريّة كبيرة أو مُعقّدة عند تجميعها إلى كائن AST، وذلك بسبب القيود الموجودة في مُجمّع AST الخاصّ بلغة بايثون.

انظر أيضًا

مصادر