9. کامپوننتهای سطح بالا¶
مفسر پایتون میتواند ورودی خود را از منابع مختلفی دریافت کند: از یک اسکریپت که بهعنوان ورودی استاندارد یا آرگومان برنامه به آن داده میشود، از ورودی تایپشده بهصورت تعاملی، از پرونده منبع یک ماژول و غیره. این فصل سینتکس استفادهشده در این موارد را ارائه میدهد.
9.1. برنامههای کامل پایتون¶
اگرچه مشخصات زبان لازم نیست نحوهی فراخوانی مفسر زبان را تعیین کند، داشتن مفهوم یک برنامهی کامل پایتون مفید است. یک برنامهی کامل پایتون در محیطی با کمترین مقداردهی اولیه اجرا میشود: همهی ماژولهای توکار و استاندارد در دسترس هستند، اما هیچکدام مقداردهی اولیه نشدهاند، بهجز sys (خدمات سیستمی مختلف)، builtins (توابع توکار، استثناها و None) و __main__. از مورد آخر برای فراهم کردن فضای نام محلی و سراسری برای اجرای برنامهی کامل استفاده میشود.
سینتکس یک برنامه کامل پایتون، همان سینتکس ورودی پرونده است که در بخش بعدی توضیح دادهشده است.
همچنین میتوان مفسر را در حالت تعاملی فراخوانی کرد؛ در این حالت، مفسر یک برنامه کامل را نمیخواند و اجرا نمیکند، بلکه هر بار یک دستور (احتمالاً مرکب) را میخواند و اجرا میکند. محیط اولیه دقیقاً مانند محیط یک برنامه کامل است؛ هر دستور در فضای نام __main__ اجرا میشود.
یک برنامه کامل را میتوان به سه شکل به مفسر ارسال کرد: با گزینهی خط فرمان -c رشته، بهصورت پروندهای که بهعنوان نخستین آرگومان خط فرمان ارسال میشود، یا بهصورت ورودی استاندارد. اگر پرونده یا ورودی استاندارد یک دستگاه tty باشد، مفسر وارد حالت تعاملی میشود؛ در غیر این صورت، پرونده را بهعنوان یک برنامه کامل اجرا میکند.
9.2. ورودی پرونده¶
تمام ورودیهای خواندهشده از پروندههای غیرتعاملی، قالب یکسانی دارند:
file_input: (NEWLINE | statement)* ENDMARKER
این سینتکس در موارد زیر استفاده میشود:
هنگام تجزیهی یک برنامهی کامل پایتون (از یک پرونده یا از یک رشته)؛
هنگام تجزیه یک ماژول؛
هنگام تجزیهی رشتهی دادهشده به تابع
exec()؛
9.3. ورودی تعاملی¶
ورودی در حالت تعاملی با استفاده از دستور زبان زیر تجزیه میشود:
interactive_input: [stmt_list] NEWLINE |compound_stmtNEWLINE | ENDMARKER
توجه داشته باشید که در حالت تعاملی، پس از یک دستور مرکب (در سطح بالا) باید یک خط خالی بیاید؛ این کار برای کمک به پارسر جهت تشخیص پایان ورودی لازم است.
9.4. ورودی عبارت¶
eval() برای ورودی عبارت استفاده میشود. این تابع فاصلههای ابتدایی را نادیده میگیرد. آرگومان رشتهای eval() باید به شکل زیر باشد:
eval_input: expression_list NEWLINE* ENDMARKER