diff --git a/c-api/allocation.po b/c-api/allocation.po index 99846f4..1d20ec1 100644 --- a/c-api/allocation.po +++ b/c-api/allocation.po @@ -29,7 +29,6 @@ msgstr "" "X-Generator: Poedit 3.6\n" #: ../../c-api/allocation.rst:6 -#, fuzzy msgid "Allocating objects on the heap" msgstr "تخصیص اشیاء روی پشته" @@ -42,6 +41,10 @@ msgid "" "slot). Specifically, this function does **not** call the object's :meth:`!" "__init__` method." msgstr "" +"یک شیء *op* که به‌تازگی تخصیص داده شده را با نوع و مرجع اولیه‌اش مقداردهی اولیه می‌کند. " +"شیء مقداردهی‌شده را برمی‌گرداند. سایر فیلدهای شیء مقداردهی اولیه نمی‌شوند. " +"با وجود نام این تابع، آن به متد :meth:`~object.__init__` شیء (درگاه :c:member:`~PyTypeObject.tp_init`) مربوط نیست. " +"به‌طور خاص، این تابع متد :meth:`!__init__` شیء را **فراخوانی نمی‌کند**." #: ../../c-api/allocation.rst:24 msgid "" @@ -50,12 +53,18 @@ msgid "" "implementing :c:member:`!tp_alloc` for your type, " "prefer :c:func:`PyType_GenericAlloc` or :c:func:`PyObject_New`." msgstr "" +"در کل، این تابع را یک روتین سطح پایین در نظر بگیرید. " +"تا جایی که ممکن است از :c:member:`~PyTypeObject.tp_alloc` استفاده کنید. برای " +"پیاده‌سازی :c:member:`!tp_alloc` برای نوع خود، " +"از :c:func:`PyType_GenericAlloc` یا :c:func:`PyObject_New` استفاده کنید." #: ../../c-api/allocation.rst:31 msgid "" "This function only initializes the object's memory corresponding to the " "initial :c:type:`PyObject` structure. It does not zero the rest." msgstr "" +"این تابع فقط حافظه‌ی شیء را که مربوط به ساختار ابتدایی " +":c:type:`PyObject` است، مقداردهی اولیه می‌کند. بقیه‌ی حافظه را صفر نمی‌کند." #: ../../c-api/allocation.rst:37 msgid "" @@ -70,6 +79,8 @@ msgid "" "This function only initializes some of the object's memory. It does not zero " "the rest." msgstr "" +"این تابع فقط بخشی از حافظه‌ی شیء را مقداردهی اولیه می‌کند. بقیه‌ی " +"حافظه را صفر نمی‌کند." #: ../../c-api/allocation.rst:48 msgid "" @@ -79,12 +90,18 @@ msgid "" "caller will own the only reference to the object (i.e. its reference count " "will be one)." msgstr "" +"یک شیء پایتونی جدید با استفاده از نوع ساختار C یعنی *TYPE* و شیء نوع پایتون " +"یعنی *typeobj* (``PyTypeObject*``) با فراخوانی :c:func:`PyObject_Malloc` " +"برای تخصیص حافظه و مقداردهی اولیه‌ی آن مانند :c:func:`PyObject_Init` تخصیص می‌دهد. " +"فراخوان‌نده، تنها مرجع به شیء را در اختیار خواهد داشت (یعنی شمارنده‌ی ارجاع آن یک خواهد بود)." #: ../../c-api/allocation.rst:54 ../../c-api/allocation.rst:107 msgid "" "Avoid calling this directly to allocate memory for an object; call the " "type's :c:member:`~PyTypeObject.tp_alloc` slot instead." msgstr "" +"از فراخوانی مستقیم این تابع برای تخصیص حافظه به یک شیء خودداری کنید؛ به جای آن، " +"درگاه :c:member:`~PyTypeObject.tp_alloc` تایپ را فراخوانی کنید." #: ../../c-api/allocation.rst:57 ../../c-api/allocation.rst:110 msgid "" @@ -92,6 +109,8 @@ msgid "" "slot, :c:func:`PyType_GenericAlloc` is preferred over a custom function that " "simply calls this macro." msgstr "" +"هنگام پر کردن درگاه :c:member:`~PyTypeObject.tp_alloc` یک تایپ، " +":c:func:`PyType_GenericAlloc` بر یک تابع سفارشی که صرفاً این ماکرو را فراخوانی می‌کند، ترجیح داده می‌شود." #: ../../c-api/allocation.rst:61 msgid "" @@ -100,24 +119,35 @@ msgid "" "(:meth:`~object.__new__`), or :c:member:`~PyTypeObject.tp_init` " "(:meth:`~object.__init__`)." msgstr "" +"این ماکرو " +":c:member:`~PyTypeObject.tp_alloc`، :c:member:`~PyTypeObject.tp_new` " +"(:meth:`~object.__new__`) یا :c:member:`~PyTypeObject.tp_init` " +"(:meth:`~object.__init__`) را فراخوانی نمی‌کند." #: ../../c-api/allocation.rst:65 msgid "" "This cannot be used for objects with :c:macro:`Py_TPFLAGS_HAVE_GC` set " "in :c:member:`~PyTypeObject.tp_flags`; use :c:macro:`PyObject_GC_New` instead." msgstr "" +"این را نمی‌توان برای اشیایی که :c:macro:`Py_TPFLAGS_HAVE_GC` در " +":c:member:`~PyTypeObject.tp_flags` آنها تنظیم شده است، استفاده کرد؛ " +"به جای آن از :c:macro:`PyObject_GC_New` استفاده کنید." #: ../../c-api/allocation.rst:68 msgid "" "Memory allocated by this macro must be freed with :c:func:`PyObject_Free` " "(usually called via the object's :c:member:`~PyTypeObject.tp_free` slot)." msgstr "" +"حافظه‌ای که توسط این ماکرو تخصیص داده می‌شود، باید با :c:func:`PyObject_Free` آزاد شود " +"(معمولاً از طریق درگاه :c:member:`~PyTypeObject.tp_free` شیء فراخوانی می‌شود)." #: ../../c-api/allocation.rst:73 ../../c-api/allocation.rst:123 msgid "" "The returned memory is not guaranteed to have been completely zeroed before it " "was initialized." msgstr "" +"حافظه‌ی برگشتی تضمین نمی‌شود که به‌طور کامل صفر شده باشد قبل از این‌که " +"مقداردهی اولیه شود." #: ../../c-api/allocation.rst:78 ../../c-api/allocation.rst:128 msgid "" @@ -126,32 +156,37 @@ msgid "" "by :c:member:`~PyTypeObject.tp_init`. To construct a fully initialized " "object, call *typeobj* instead. For example::" msgstr "" +"این ماکرو یک شیء کاملاً مقداردهی‌شده از نوع داده‌شده را نمی‌سازد؛ بلکه " +"صرفاً حافظه تخصیص می‌دهد و آن را برای مقداردهی اولیه‌ی بیشتر " +"توسط :c:member:`~PyTypeObject.tp_init` آماده می‌کند. برای ساختن یک شیء کاملاً مقداردهی‌شده، " +"به جای آن *typeobj* را فراخوانی کنید. برای مثال::" #: ../../c-api/allocation.rst:83 msgid "PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);" msgstr "" +"PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);" #: ../../c-api/allocation.rst:87 ../../c-api/allocation.rst:137 #: ../../c-api/allocation.rst:184 ../../c-api/allocation.rst:186 #: ../../c-api/allocation.rst:188 msgid ":c:func:`PyObject_Free`" -msgstr "" +msgstr ":c:func:`PyObject_Free`" #: ../../c-api/allocation.rst:88 msgid ":c:macro:`PyObject_GC_New`" -msgstr "" +msgstr ":c:macro:`PyObject_GC_New`" #: ../../c-api/allocation.rst:89 ../../c-api/allocation.rst:139 msgid ":c:func:`PyType_GenericAlloc`" -msgstr "" +msgstr ":c:func:`PyType_GenericAlloc`" #: ../../c-api/allocation.rst:90 ../../c-api/allocation.rst:140 msgid ":c:member:`~PyTypeObject.tp_alloc`" -msgstr "" +msgstr ":c:member:`~PyTypeObject.tp_alloc`" #: ../../c-api/allocation.rst:95 msgid "Like :c:macro:`PyObject_New` except:" -msgstr "" +msgstr "مثل :c:macro:`PyObject_New` جز:" #: ../../c-api/allocation.rst:97 msgid "" @@ -159,10 +194,12 @@ msgid "" "(``Py_ssize_t``) fields of the size given by " "the :c:member:`~PyTypeObject.tp_itemsize` field of *typeobj*." msgstr "" +"این (ماکرو) به اندازه‌ی کافی برای ساختار *TYPE* به اضافه‌ی *size* " +"(``Py_ssize_t``) فیلد به اندازه‌ای که توسط فیلد :c:member:`~PyTypeObject.tp_itemsize` از *typeobj* مشخص شده، حافظه تخصیص می‌دهد." #: ../../c-api/allocation.rst:100 msgid "The memory is initialized like :c:func:`PyObject_InitVar`." -msgstr "" +msgstr "حافظه، مانند :c:func:`PyObject_InitVar` مقداردهی اولیه می‌شود." #: ../../c-api/allocation.rst:102 msgid "" @@ -171,6 +208,9 @@ msgid "" "the same allocation decreases the number of allocations, improving the memory " "management efficiency." msgstr "" +"این (روش) برای پیاده‌سازی اشیایی مثل تاپل‌ها مفید است، که می‌توانند " +"اندازه‌ی خود را در زمان ساخت تعیین کنند. جاسازی آرایه‌ی فیلدها در " +"همان تخصیص، تعداد تخصیص‌ها را کاهش می‌دهد و بازدهی مدیریت حافظه را بهبود می‌بخشد." #: ../../c-api/allocation.rst:114 msgid "" @@ -178,20 +218,25 @@ msgid "" "in :c:member:`~PyTypeObject.tp_flags`; use :c:macro:`PyObject_GC_NewVar` " "instead." msgstr "" +"این را نمی‌توان برای اشیایی که :c:macro:`Py_TPFLAGS_HAVE_GC` در " +":c:member:`~PyTypeObject.tp_flags` آنها تنظیم شده است، استفاده کرد؛ " +"به جای آن از :c:macro:`PyObject_GC_NewVar` استفاده کنید." #: ../../c-api/allocation.rst:118 msgid "" "Memory allocated by this function must be freed with :c:func:`PyObject_Free` " "(usually called via the object's :c:member:`~PyTypeObject.tp_free` slot)." msgstr "" +"حافظه‌ای که توسط این تابع تخصیص داده می‌شود، باید با :c:func:`PyObject_Free` آزاد شود " +"(معمولاً از طریق درگاه :c:member:`~PyTypeObject.tp_free` شیء فراخوانی می‌شود)." #: ../../c-api/allocation.rst:133 msgid "PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);" -msgstr "" +msgstr "PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);" #: ../../c-api/allocation.rst:138 msgid ":c:macro:`PyObject_GC_NewVar`" -msgstr "" +msgstr ":c:macro:`PyObject_GC_NewVar`" #: ../../c-api/allocation.rst:145 msgid "" @@ -199,56 +244,58 @@ msgid "" "using the :c:macro:`Py_None` macro, which evaluates to a pointer to this " "object." msgstr "" -"شیء ای که در پایتون به صورت ``None`` قابل مشاهده است\n" -"این فقط باید با استفاده از ماکرو :c:macro:`Py_None`، که به یک اشاره گر به این " -"شی ارزیابی می شود، دسترسی پیدا کند." +"شیء‌ای که در پایتون به صورت ``None`` قابل مشاهده است\n" +"این فقط باید با استفاده از ماکرو :c:macro:`Py_None`، که به یک اشاره‌گر به این " +"شیء ارزیابی می‌شود، دسترسی پذیر باشد." #: ../../c-api/allocation.rst:152 msgid ":ref:`moduleobjects`" -msgstr "" +msgstr ":ref:`moduleobjects`" #: ../../c-api/allocation.rst:153 msgid "To allocate and create extension modules." -msgstr "برای تخصیص و ایجاد ماژول های افزونه." +msgstr "برای تخصیص و ایجاد ماژول‌های افزونه." #: ../../c-api/allocation.rst:157 msgid "Soft-deprecated aliases" -msgstr "" +msgstr "نام‌های مستعار با منسوخ‌سازی نرم" #: ../../c-api/allocation.rst:161 msgid "" "These are aliases to existing functions and macros. They exist solely for " "backwards compatibility." msgstr "" +"این‌ها نام‌های مستعاری برای توابع و ماکروهای موجود هستند. آن‌ها صرفاً برای " +"سازگاری با نسخه‌های قبلی وجود دارند." #: ../../c-api/allocation.rst:169 msgid "Soft-deprecated alias" -msgstr "" +msgstr "نام‌های مستعار با منسوخ‌سازی نرم" #: ../../c-api/allocation.rst:170 msgid "Function" -msgstr "" +msgstr "تابع" #: ../../c-api/allocation.rst:172 msgid ":c:macro:`PyObject_New`" -msgstr "همانند :c:macro:`PyObject_New`" +msgstr ":c:macro:`PyObject_New`" #: ../../c-api/allocation.rst:174 msgid ":c:macro:`PyObject_NewVar`" -msgstr "" +msgstr ":c:macro:`PyObject_NewVar`" #: ../../c-api/allocation.rst:176 msgid ":c:func:`PyObject_Init`" -msgstr "همانند :c:func:`PyObject_Init`" +msgstr ":c:func:`PyObject_Init`" #: ../../c-api/allocation.rst:178 msgid ":c:func:`PyObject_InitVar`" -msgstr "همانند :c:func:`PyObject_InitVar`" +msgstr ":c:func:`PyObject_InitVar`" #: ../../c-api/allocation.rst:180 msgid ":c:func:`PyObject_Malloc`" -msgstr "همانند :c:func:`PyObject_Malloc`" +msgstr ":c:func:`PyObject_Malloc`" #: ../../c-api/allocation.rst:182 msgid ":c:func:`PyObject_Realloc`" -msgstr "همانند :c:func:`PyObject_Realloc`" +msgstr ":c:func:`PyObject_Realloc`" diff --git a/c-api/apiabiversion.po b/c-api/apiabiversion.po index ca482ac..e1a87d0 100644 --- a/c-api/apiabiversion.po +++ b/c-api/apiabiversion.po @@ -27,11 +27,11 @@ msgstr "" #: ../../c-api/apiabiversion.rst:7 msgid "API and ABI Versioning" -msgstr "" +msgstr "نسخه‌گذاری API و ABI" #: ../../c-api/apiabiversion.rst:11 msgid "Build-time version constants" -msgstr "" +msgstr "ثابت‌های نسخه در زمان ساخت" #: ../../c-api/apiabiversion.rst:13 msgid "" @@ -39,52 +39,60 @@ msgid "" "correspond to the version code is **built** with. See :c:var:`Py_Version` " "for the version used at **run time**." msgstr "" +"CPython شماره‌ی نسخه‌ی خود را در ماکروهای زیر در معرض دید قرار می‌دهد. توجه داشته باشید که این‌ها " +"مربوط به نسخه‌ای هستند که کد با آن **ساخته (build)** شده است. برای نسخه‌ای که در **زمان اجرا (run time)** استفاده می‌شود، به :c:var:`Py_Version` مراجعه کنید." #: ../../c-api/apiabiversion.rst:17 msgid "" "See :ref:`stable` for a discussion of API and ABI stability across versions." msgstr "" +"برای بحث درباره‌ی پایداری API و ABI در میان نسخه‌ها، به :ref:`stable` مراجعه کنید." #: ../../c-api/apiabiversion.rst:21 msgid "The ``3`` in ``3.4.1a2``." -msgstr "" +msgstr "3 در ``3.4.1a2``." #: ../../c-api/apiabiversion.rst:25 msgid "The ``4`` in ``3.4.1a2``." -msgstr "" +msgstr "4 در ``3.4.1a2``." #: ../../c-api/apiabiversion.rst:29 msgid "The ``1`` in ``3.4.1a2``." -msgstr "" +msgstr "1 در ``3.4.1a2``." #: ../../c-api/apiabiversion.rst:33 msgid "" "The ``a`` in ``3.4.1a2``. This can be ``0xA`` for alpha, ``0xB`` for beta, " "``0xC`` for release candidate or ``0xF`` for final." msgstr "" +"``a`` در ``3.4.1a2``. این می‌تواند ``0xA`` برای آلفا باشد، ``0xB`` برای بتا، " +"``0xC`` برای کاندیدای انتشار (release candidate) یا ``0xF`` برای نهایی (final)." #: ../../c-api/apiabiversion.rst:39 msgid "The ``2`` in ``3.4.1a2``. Zero for final releases." -msgstr "" +msgstr "``2`` در ``3.4.1a2``. برای انتشارهای نهایی، صفر است." #: ../../c-api/apiabiversion.rst:43 msgid "" "The Python version number encoded in a single integer. " "See :c:func:`Py_PACK_FULL_VERSION` for the encoding details." msgstr "" +"شماره‌ی نسخه‌ی پایتون که در یک عدد صحیح کدگذاری شده است. " +"برای جزئیات کدگذاری، به :c:func:`Py_PACK_FULL_VERSION` مراجعه کنید." #: ../../c-api/apiabiversion.rst:46 msgid "" "Use this for numeric comparisons, for example, ``#if PY_VERSION_HEX >= ...``." msgstr "" +"از این (مقدار) برای مقایسه‌های عددی استفاده کنید، برای مثال، ``#if PY_VERSION_HEX >= ...``." #: ../../c-api/apiabiversion.rst:49 msgid "These macros are defined in :source:`Include/patchlevel.h`." -msgstr "" +msgstr "این ماکروها در :source:`Include/patchlevel.h` تعریف می‌شوند." #: ../../c-api/apiabiversion.rst:53 msgid "Run-time version" -msgstr "" +msgstr "نسخه‌ی زمان اجرا" #: ../../c-api/apiabiversion.rst:57 msgid "" @@ -92,184 +100,192 @@ msgid "" "See :c:func:`Py_PACK_FULL_VERSION` for the encoding details. This contains " "the Python version used at run time." msgstr "" +"شماره‌ی نسخه‌ی زمان اجرای پایتون که در یک عدد صحیح ثابت کدگذاری شده است. " +"برای جزئیات کدگذاری، به :c:func:`Py_PACK_FULL_VERSION` مراجعه کنید. این (مقدار) شامل " +"نسخه‌ی پایتون است که در زمان اجرا استفاده می‌شود." #: ../../c-api/apiabiversion.rst:61 msgid "" "Use this for numeric comparisons, for example, ``if (Py_Version >= ...)``." msgstr "" +"از این (مقدار) برای مقایسه‌های عددی استفاده کنید، برای مثال، ``if (Py_Version >= ...)``." #: ../../c-api/apiabiversion.rst:67 msgid "Bit-packing macros" -msgstr "" +msgstr "ماکروهای بسته‌بندی بیتی" #: ../../c-api/apiabiversion.rst:71 msgid "" "Return the given version, encoded as a single 32-bit integer with the " "following structure:" msgstr "" +"نسخه‌ی داده‌شده را که به صورت یک عدد صحیح ۳۲-بیتی با " +"ساختار زیر کدگذاری شده است، برمی‌گرداند:" #: ../../c-api/apiabiversion.rst:77 msgid "Argument" -msgstr "" +msgstr "آرگومان" #: ../../c-api/apiabiversion.rst:75 msgid "No. of bits" -msgstr "" +msgstr "تعداد بیت‌ها" #: ../../c-api/apiabiversion.rst:77 msgid "Bit mask" -msgstr "" +msgstr "ماسک بیتی" #: ../../c-api/apiabiversion.rst:77 msgid "Bit shift" -msgstr "" +msgstr "شیفت بیتی" #: ../../c-api/apiabiversion.rst:75 msgid "Example values" -msgstr "" +msgstr "مقادیر نمونه" #: ../../c-api/apiabiversion.rst:77 ../../c-api/apiabiversion.rst:95 msgid "``3.4.1a2``" -msgstr "" +msgstr "``3.4.1a2``" #: ../../c-api/apiabiversion.rst:77 ../../c-api/apiabiversion.rst:97 msgid "``3.10.0``" -msgstr "" +msgstr "``3.10.0``" #: ../../c-api/apiabiversion.rst:79 msgid "*major*" -msgstr "" +msgstr "*major*" #: ../../c-api/apiabiversion.rst:79 ../../c-api/apiabiversion.rst:81 #: ../../c-api/apiabiversion.rst:83 msgid "8" -msgstr "" +msgstr "8" #: ../../c-api/apiabiversion.rst:79 msgid "``0xFF000000``" -msgstr "" +msgstr "``0xFF000000``" #: ../../c-api/apiabiversion.rst:79 msgid "24" -msgstr "" +msgstr "24" #: ../../c-api/apiabiversion.rst:79 msgid "``0x03``" -msgstr "" +msgstr "``0x03``" #: ../../c-api/apiabiversion.rst:81 msgid "*minor*" -msgstr "" +msgstr "*minor*" #: ../../c-api/apiabiversion.rst:81 msgid "``0x00FF0000``" -msgstr "" +msgstr "``0x00FF0000``" #: ../../c-api/apiabiversion.rst:81 msgid "16" -msgstr "" +msgstr "16" #: ../../c-api/apiabiversion.rst:81 msgid "``0x04``" -msgstr "" +msgstr "``0x04``" #: ../../c-api/apiabiversion.rst:81 msgid "``0x0A``" -msgstr "" +msgstr "``0x0A``" #: ../../c-api/apiabiversion.rst:83 msgid "*micro*" -msgstr "" +msgstr "*micro*" #: ../../c-api/apiabiversion.rst:83 msgid "``0x0000FF00``" -msgstr "" +msgstr "``0x0000FF00``" #: ../../c-api/apiabiversion.rst:83 msgid "``0x01``" -msgstr "" +msgstr "``0x01``" #: ../../c-api/apiabiversion.rst:83 msgid "``0x00``" -msgstr "" +msgstr "``0x00``" #: ../../c-api/apiabiversion.rst:85 msgid "*release_level*" -msgstr "" +msgstr "*release_level*" #: ../../c-api/apiabiversion.rst:85 ../../c-api/apiabiversion.rst:87 msgid "4" -msgstr "" +msgstr "4" #: ../../c-api/apiabiversion.rst:85 msgid "``0x000000F0``" -msgstr "" +msgstr "``0x000000F0``" #: ../../c-api/apiabiversion.rst:85 msgid "``0xA``" -msgstr "" +msgstr "``0xA``" #: ../../c-api/apiabiversion.rst:85 msgid "``0xF``" -msgstr "" +msgstr "``0xF``" #: ../../c-api/apiabiversion.rst:87 msgid "*release_serial*" -msgstr "" +msgstr "*release_serial*" #: ../../c-api/apiabiversion.rst:87 msgid "``0x0000000F``" -msgstr "" +msgstr "``0x0000000F``" #: ../../c-api/apiabiversion.rst:87 msgid "0" -msgstr "" +msgstr "0" #: ../../c-api/apiabiversion.rst:87 msgid "``0x2``" -msgstr "" +msgstr "``0x2``" #: ../../c-api/apiabiversion.rst:87 msgid "``0x0``" -msgstr "" +msgstr "``0x0``" #: ../../c-api/apiabiversion.rst:90 msgid "For example:" -msgstr "" +msgstr "برای مثال:" #: ../../c-api/apiabiversion.rst:93 msgid "Version" -msgstr "" +msgstr "نسخه" #: ../../c-api/apiabiversion.rst:93 msgid "``Py_PACK_FULL_VERSION`` arguments" -msgstr "" +msgstr "آرگومان‌های ``Py_PACK_FULL_VERSION``" #: ../../c-api/apiabiversion.rst:93 msgid "Encoded version" -msgstr "" +msgstr "نسخه‌ی کدگذاری شده" #: ../../c-api/apiabiversion.rst:95 msgid "``(3, 4, 1, 0xA, 2)``" -msgstr "" +msgstr "``(3, 4, 1, 0xA, 2)``" #: ../../c-api/apiabiversion.rst:95 msgid "``0x030401a2``" -msgstr "" +msgstr "``0x030401a2``" #: ../../c-api/apiabiversion.rst:97 msgid "``(3, 10, 0, 0xF, 0)``" -msgstr "" +msgstr "``(3, 10, 0, 0xF, 0)``" #: ../../c-api/apiabiversion.rst:97 msgid "``0x030a00f0``" -msgstr "" +msgstr "``0x030a00f0``" #: ../../c-api/apiabiversion.rst:100 msgid "" "Out-of range bits in the arguments are ignored. That is, the macro can be " "defined as:" msgstr "" +"بیت‌های خارج از محدوده در آرگومان‌ها نادیده گرفته می‌شوند. به عبارت دیگر، این ماکرو را می‌توان " +"به صورت زیر تعریف کرد:" #: ../../c-api/apiabiversion.rst:103 msgid "" @@ -282,12 +298,22 @@ msgid "" " (((SERIAL) & 0xf) << 0))\n" "#endif" msgstr "" - +"#ifndef Py_PACK_FULL_VERSION\n" +"#define Py_PACK_FULL_VERSION(X, Y, Z, LEVEL, SERIAL) ( \\\n" +" (((X) & 0xff) << 24) | \\\n" +" (((Y) & 0xff) << 16) | \\\n" +" (((Z) & 0xff) << 8) | \\\n" +" (((LEVEL) & 0xf) << 4) | \\\n" +" (((SERIAL) & 0xf) << 0))\n" +"#endif" #: ../../c-api/apiabiversion.rst:114 + msgid "" "``Py_PACK_FULL_VERSION`` is primarily a macro, intended for use in ``#if`` " "directives, but it is also available as an exported function." msgstr "" +"``Py_PACK_FULL_VERSION`` در درجه‌ی اول یک ماکرو است که برای استفاده در دستورات " +"``#if`` در نظر گرفته شده است، اما به‌عنوان یک تابع صادرشده نیز در دسترس است." #: ../../c-api/apiabiversion.rst:121 msgid "" @@ -295,3 +321,6 @@ msgid "" "does not correspond to any Python release, but is useful in numeric " "comparisons." msgstr "" +"معادل ``Py_PACK_FULL_VERSION(major, minor, 0, 0, 0)`` است. نتیجه " +"با هیچ نسخه‌ی انتشار یافته‌ای از پایتون مطابقت ندارد، اما در مقایسه‌های عددی " +"مفید است." diff --git a/c-api/bool.po b/c-api/bool.po index 52e8a04..d24acd8 100644 --- a/c-api/bool.po +++ b/c-api/bool.po @@ -20,7 +20,7 @@ msgstr "" #: ../../c-api/bool.rst:6 msgid "Boolean Objects" -msgstr "" +msgstr "اشیاء بولی" #: ../../c-api/bool.rst:8 msgid "" @@ -29,49 +29,63 @@ msgid "" "normal creation and deletion functions don't apply to booleans. The " "following macros are available, however." msgstr "" +"مقدارهای بولین (Boolean) در پایتون به‌عنوان زیرکلاسی از اعداد صحیح پیاده‌سازی شده‌اند. " +"تنها دو مقدار بولین وجود دارد: :c:data:`Py_False` و :c:data:`Py_True`. بنابراین، " +"توابع معمول ایجاد و حذف برای مقدارهای بولین کاربرد ندارند. با این حال، " +"ماکروهای زیر در دسترس هستند." #: ../../c-api/bool.rst:16 msgid "" "This instance of :c:type:`PyTypeObject` represents the Python boolean type; " "it is the same object as :class:`bool` in the Python layer." msgstr "" +"این نمونه از :c:type:`PyTypeObject` نوع داده‌ی بولین پایتون را نشان می‌دهد؛ " +"این همان شیء‌ای است که در لایه‌ی پایتون با نام :class:`bool` شناخته می‌شود." #: ../../c-api/bool.rst:22 msgid "" "Return true if *o* is of type :c:data:`PyBool_Type`. This function always " "succeeds." msgstr "" +"اگر *o* از نوع :c:data:`PyBool_Type` باشد، مقدار ``true`` را برمی‌گرداند. " +"این تابع همیشه با موفقیت اجرا می‌شود." #: ../../c-api/bool.rst:28 msgid "" "The Python ``False`` object. This object has no methods and " "is :term:`immortal`." msgstr "" +"شیء ``False`` در پایتون. این شیء هیچ متدی ندارد و " +":term:`جاودان (immortal)` است." #: ../../c-api/bool.rst:31 msgid ":c:data:`Py_False` is :term:`immortal`." -msgstr "" +msgstr ":c:data:`Py_False` :term:`جاودان (immortal)` است." #: ../../c-api/bool.rst:37 msgid "" "The Python ``True`` object. This object has no methods and " "is :term:`immortal`." msgstr "" +"شیء ``True`` در پایتون. این شیء هیچ متدی ندارد و " +":term:`جاودان (immortal)` است." #: ../../c-api/bool.rst:40 msgid ":c:data:`Py_True` is :term:`immortal`." -msgstr "" +msgstr ":c:data:`Py_True` :term:`جاودان (immortal)` است." #: ../../c-api/bool.rst:46 msgid "Return :c:data:`Py_False` from a function." -msgstr "" +msgstr ":c:data:`Py_False` را از یک تابع برگردانید." #: ../../c-api/bool.rst:51 msgid "Return :c:data:`Py_True` from a function." -msgstr "" +msgstr ":c:data:`Py_True` را از یک تابع برگردانید." #: ../../c-api/bool.rst:56 msgid "" "Return :c:data:`Py_True` or :c:data:`Py_False`, depending on the truth value " "of *v*." msgstr "" +":c:data:`Py_True` یا :c:data:`Py_False` را، بسته به مقدار صحت (truth value) " +"*v*، برگردانید." diff --git a/tutorial/appendix.po b/tutorial/appendix.po index 14aa0cc..0f31dca 100644 --- a/tutorial/appendix.po +++ b/tutorial/appendix.po @@ -37,7 +37,7 @@ msgid "" "interpreter is supported on all platforms with minimal line control " "capabilities." msgstr "" -"دو نوع از حالت تعاملی :term:`REPL` وجود دارد. مفسر پایهٔ کلاسیک در تمامی " +"دو نوع از حالت تعاملی :term:`REPL` وجود دارد. مفسر پایه‌ی کلاسیک در تمامی " "پلتفرم‌ها با حداقل امکانات برای ویرایش خط فرمان پشتیبانی می‌شود." #: ../../tutorial/appendix.rst:17 @@ -51,14 +51,14 @@ msgid "" "enters \"paste mode\", which makes pasting larger blocks of code easier. " "Press :kbd:`F3` to return to the regular prompt." msgstr "" -"در ویندوز یا سیستم های یونیکس مانند با پشتیبانی از، به صورت پیش فرض از یک شل " -"تعاملی جدید استفاده می شود. این شل از رنگ، ویرایش چندخطی، مرور تاریخچه، و حالت " -"چسباندن «paste mode» پشتیبانی می کند. برای غیرفعال کردن رنگ، جزئیات را " -"در :ref:`using-on-controlling-color` ببینید. کلیدهای تابعی برخی از قابلیت های " -"اضافی را فراهم می کنند. :kbd:`F1` مرورگر تعاملی راهنما :mod:`pydoc` را فعال می " -"کند. :kbd:`F2` اجازه می دهد تاریخچه خط فرمان را بدون خروجی و بدون اعلان " +"در ویندوز یا سیستم‌های یونیکس‌مانند با پشتیبانی از، به صورت پیش‌فرض از یک شل " +"تعاملی جدید استفاده می‌شود. این شل از رنگ، ویرایش چندخطی، مرور تاریخچه، و حالت " +"چسباندن «paste mode» پشتیبانی می‌کند. برای غیرفعال کردن رنگ، جزئیات را " +"در :ref:`using-on-controlling-color` ببینید. کلیدهای تابعی برخی از قابلیت‌های " +"اضافی را فراهم می‌کنند. :kbd:`F1` مرورگر تعاملی راهنما :mod:`pydoc` را فعال می " +"کند. :kbd:`F2` اجازه می‌دهد تاریخچه خط فرمان را بدون خروجی و بدون اعلان " "های :term:`>>>` و :term:`...` مرور کنید. :kbd:`F3` حالت \"چسباندن\" را فعال می " -"کند که چسباندن بلوک های بزرگ تر کد را آسان تر می سازد. برای بازگشت به اعلان " +"کند که چسباندن بلوک‌های بزرگ‌تر کد را آسان‌تر می‌سازد. برای بازگشت به اعلان " "معمولی، :kbd:`F3` را فشار دهید." #: ../../tutorial/appendix.rst:27 @@ -66,7 +66,7 @@ msgid "" "When using the new interactive shell, exit the shell by typing :kbd:`exit` " "or :kbd:`quit`. Adding call parentheses after those commands is not required." msgstr "" -"وقتی از پوسته تعاملی جدید استفاده می‌کنید، با تایپ :kbd:`exit` یا :kbd:`quit` " +"وقتی از پوسته‌ی تعاملی جدید استفاده می‌کنید، با تایپ :kbd:`exit` یا :kbd:`quit` " "از پوسته خارج شوید. اضافه‌کردن پرانتز پس از این دستورات ضروری نیست." #: ../../tutorial/appendix.rst:31 @@ -74,7 +74,7 @@ msgid "" "If the new interactive shell is not desired, it can be disabled via " "the :envvar:`PYTHON_BASIC_REPL` environment variable." msgstr "" -"اگر پوسته تعاملی جدید مطلوب نباشد، می توان آن را از طریق متغیر " +"اگر پوسته‌ی تعاملی جدید مطلوب نباشد، می‌توان آن را از طریق متغیر " "محیطی :envvar:`PYTHON_BASIC_REPL` غیرفعال کرد." #: ../../tutorial/appendix.rst:37 @@ -93,7 +93,7 @@ msgid "" "are written to the standard error stream; normal output from executed commands " "is written to standard output." msgstr "" -"موقع بروز خطا، مفسر یک پیام خطا و «گزارش پشته» «stack trace» چاپ می‌کند. در " +"زمان بروز خطا، مفسر یک پیام خطا و «گزارش پشته» «stack trace» چاپ می‌کند. در " "حالت تعاملی، بعد از نمایش خطا، برنامه به حالت آماده‌باش برای دریافت دستورات " "جدید بازمی‌گردد؛ اما اگر ورودی از یک فایل آمده باشد، پس از چاپ گزارش پشته با یک " "کد خروجی غیر صفر از برنامه خارج می‌شود. (استثناهایی که با بخش :keyword:`except` " @@ -112,21 +112,21 @@ msgid "" "a :keyword:`try` statement." msgstr "" "فشردن کلید وقفه (که معمولاً :kbd:`Control-C` یا :kbd:`Delete` است) در اعلان " -"اصلی یا فرعی، ورودی را لغو کرده و کاربر را به اعلان اصلی بازمی‌گرداند. [#]_\n" +"اصلی یا فرعی، ورودی را لغو کرده و کاربر را به اعلان اصلی بازمی‌گرداند. [#]_ \n" "فشردن کلید وقفه در حین اجرای یک دستور، استثنای :exc:`KeyboardInterrupt` را " "ایجاد می‌کند که می‌توان آن را با دستور :keyword:`try` مدیریت کرد." #: ../../tutorial/appendix.rst:59 msgid "Executable Python Scripts" -msgstr "اسکریپت های اجرایی پایتون" +msgstr "اسکریپت‌های اجرایی پایتون" #: ../../tutorial/appendix.rst:61 msgid "" "On BSD'ish Unix systems, Python scripts can be made directly executable, like " "shell scripts, by putting the line ::" msgstr "" -"در سیستم عامل های یونیکس مبتنی بر BSD، اسکریپت های پایتون می توانند مانند " -"اسکریپت های شل به صورت مستقیم اجرایی شوند، با قرار دادن خط ::" +"در سیستم‌عامل‌های یونیکس مبتنی بر BSD، اسکریپت‌های پایتون می‌توانند مانند " +"اسکریپت‌های شل به صورت مستقیم اجرایی شوند، با قرار دادن خط ::" #: ../../tutorial/appendix.rst:64 msgid "#!/usr/bin/env python3" @@ -168,14 +168,14 @@ msgid "" "suppressed." msgstr "" "در سیستم‌عامل ویندوز، مفهوم «حالت اجرایی» \"executable mode\" وجود ندارد. " -"نصب‌کننده پایتون به‌طور خودکار فایل‌های ``.py`` را به ``python.exe`` مرتبط می‌کند " +"نصب‌کننده‌ی پایتون به‌طور خودکار فایل‌های ``.py`` را به ``python.exe`` مرتبط می‌کند " "تا با دوبار کلیک روی فایل پایتون، به‌عنوان اسکریپت اجرا شود. پسوند فایل همچنین " "می‌تواند ``.pyw`` باشد که در این صورت پنجره کنسولی که معمولاً ظاهر می‌شود، نمایش " "داده نمی‌شود." #: ../../tutorial/appendix.rst:90 msgid "The Interactive Startup File" -msgstr "پروندهٔ آغازین تعاملی «The Interactive Startup File»" +msgstr "پرونده‌ی آغازین تعاملی «The Interactive Startup File»" #: ../../tutorial/appendix.rst:92 msgid "" @@ -185,10 +185,10 @@ msgid "" "name of a file containing your start-up commands. This is similar to " "the :file:`.profile` feature of the Unix shells." msgstr "" -"هنگامی که به صورت تعاملی از پایتون استفاده می کنید، اجرای برخی دستورات " -"استاندارد در هر بار شروع مفسر می تواند مفید باشد. شما می توانید این کار را با " +"هنگامی که به صورت تعاملی از پایتون استفاده می‌کنید، اجرای برخی دستورات " +"استاندارد در هر بار شروع مفسر می‌تواند مفید باشد. شما می‌توانید این کار را با " "تنظیم متغیر محیطی با نام :envvar:`PYTHONSTARTUP` به نام فایلی که حاوی دستورات " -"شروع شما است انجام دهید. این قابلیت شبیه به ویژگی :file:`.profile` در شل های " +"شروع شما است انجام دهید. این قابلیت شبیه به ویژگی :file:`.profile` در شل‌های " "یونیکس است." #: ../../tutorial/appendix.rst:98 @@ -201,12 +201,12 @@ msgid "" "the interactive session. You can also change the prompts ``sys.ps1`` and " "``sys.ps2`` in this file." msgstr "" -"این فایل فقط در جلسات تعاملی خوانده می شود، نه زمانی که پایتون دستورات را از " -"یک اسکریپت می خواند، و نه زمانی که :file:`/dev/tty` به عنوان منبع صریح دستورات " -"داده می شود (که در غیر این صورت همچون یک جلسه تعاملی رفتار می کند). این فایل " -"در همان فضای نامی که در آن دستورات تعاملی اجرا می شوند، اجرا می گردد بنابراین " -"اشیایی که تعریف یا وارد می کند می توانند بدون مشخص شدن در جلسه تعاملی مورد " -"استفاده قرار گیرند. شما می توانید درخواست ها ``sys.ps1`` و ``sys.ps2`` را نیز " +"این فایل فقط در جلسات تعاملی خوانده می‌شود، نه زمانی که پایتون دستورات را از " +"یک اسکریپت می‌خواند، و نه زمانی که :file:`/dev/tty` به عنوان منبع صریح دستورات " +"داده می‌شود (که در غیر این صورت همچون یک جلسه‌ی تعاملی رفتار می‌کند). این فایل " +"در همان فضای نامی که در آن دستورات تعاملی اجرا می‌شوند، اجرا می‌گردد بنابراین " +"اشیایی که تعریف یا وارد می‌کند می‌توانند بدون مشخص شدن در جلسه تعاملی مورد " +"استفاده قرار گیرند. شما می‌توانید درخواست‌ها ``sys.ps1`` و ``sys.ps2`` را نیز " "در این فایل تغییر دهید." #: ../../tutorial/appendix.rst:106 @@ -217,11 +217,11 @@ msgid "" "want to use the startup file in a script, you must do this explicitly in the " "script::" msgstr "" -"اگر می خواهید یک فایل راه اندازی اضافی از دایرکتوری فعلی بخوانید، می توانید" -" این کار را در فایل راه اندازی عمومی با کدی مشابه ``if " -"os.path.isfile('.pythonrc.py'): exec(open('.pythonrc.py').read())`` برنامه" -" ریزی کنید. اگر می خواهید از فایل راه اندازی در یک اسکریپت استفاده کنید، باید" -" این کار را به طور صریح در اسکریپت انجام دهید:" +"اگر می‌خواهید یک فایل راه‌اندازی اضافی از دایرکتوری فعلی بخوانید، می‌توانید " +"این کار را در فایل راه‌اندازی عمومی با کدی مشابه ``if " +"os.path.isfile('.pythonrc.py'): exec(open('.pythonrc.py').read())`` برنامه‌ریزی " +"کنید. اگر می‌خواهید از فایل راه‌اندازی در یک اسکریپت استفاده کنید، باید " +"این کار را به‌طور صریح در اسکریپت انجام دهید::" #: ../../tutorial/appendix.rst:112 msgid "" @@ -241,7 +241,7 @@ msgstr "" #: ../../tutorial/appendix.rst:123 msgid "The Customization Modules" -msgstr "ماژول های سفارشی سازی" +msgstr "ماژول‌های سفارشی‌سازی" #: ../../tutorial/appendix.rst:125 msgid "" @@ -250,9 +250,9 @@ msgid "" "location of your user site-packages directory. Start Python and run this " "code::" msgstr "" -"پایتون دو نقطهٔ اتصال برای سفارشی سازی ارائه می دهد: :index:`sitecustomize` " +"پایتون دو نقطه‌ی اتصال برای سفارشی سازی ارائه می‌دهد: :index:`sitecustomize` " "و :index:`usercustomize`. برای دیدن چگونگی کارکرد آن، ابتدا باید مکان " -"دایرکتوری user site-packages خود را پیدا کنید. پایتون را اجرا کنید و این کد را " +"دایرکتوری user site-packages خود را پیدا کنید. پایتون را اجرا کرده و این کد را " "اجرا کنید:" #: ../../tutorial/appendix.rst:129 @@ -284,15 +284,15 @@ msgid "" "imported before :index:`usercustomize`. See the documentation of " "the :mod:`site` module for more details." msgstr "" -":index:`sitecustomize` به همان صورت کار می کند، اما به طور معمول توسط مدیر " -"سیستم در دایرکتوری global site-packages ایجاد می شود و قبل " -"از :index:`usercustomize` وارد می شود. برای جزئیات بیشتر به مستندات " +":index:`sitecustomize` به همان صورت کار می‌کند، اما به‌طور معمول توسط مدیر " +"سیستم در دایرکتوری global site-packages ایجاد می‌شود و قبل " +"از :index:`usercustomize` وارد می‌شود. برای جزئیات بیشتر به مستندات " "ماژول :mod:`site` مراجعه کنید." #: ../../tutorial/appendix.rst:144 msgid "Footnotes" -msgstr "پاورقی ها" +msgstr "پاورقی‌ها" #: ../../tutorial/appendix.rst:145 msgid "A problem with the GNU Readline package may prevent this." -msgstr "یک مشکل در بستهٔ «GNU Readline» ممکن است مانع این کار شود." +msgstr "یک مشکل در بسته‌ی «GNU Readline» ممکن است مانع این کار شود." diff --git a/tutorial/classes.po b/tutorial/classes.po index fbd5ed0..0bb149c 100644 --- a/tutorial/classes.po +++ b/tutorial/classes.po @@ -27,7 +27,7 @@ msgstr "" #: ../../tutorial/classes.rst:5 msgid "Classes" -msgstr "کلاس ها" +msgstr "کلاس‌ها" #: ../../tutorial/classes.rst:7 msgid "" @@ -37,11 +37,11 @@ msgid "" "attributes attached to it for maintaining its state. Class instances can " "also have methods (defined by its class) for modifying its state." msgstr "" -"کلاس ها وسیله ای را برای بسته بندی کردن داده و عملکرد با هم فراهم می کنند. " -"ایجاد یک کلاس جدید، نوع جدیدی ایجاد می کند که اجازه می دهد موارد جدیدی از آن " -"نوع ساخته شود. هر نمونه از کلاس می تواند صفاتی داشته باشد که به آن متصل شده " -"اند تا وضعیت آن را حفظ کنند. نمونه های کلاس می توانند همچنین متدهایی (که " -"توسط کلاس تعریف شده اند) داشته باشند تا وضعیت آن را تغییر دهند." +"کلاس‌ها وسیله‌ای را برای بسته‌بندی کردن داده و عملکرد با هم فراهم می‌کنند. " +"ایجاد یک کلاس جدید، نوع جدیدی ایجاد می‌کند که اجازه می‌دهد موارد جدیدی از آن " +"نوع ساخته شود. هر نمونه از کلاس می‌تواند صفاتی داشته باشد که به آن متصل شده‌اند " +"تا وضعیت آن را حفظ کنند. نمونه‌های کلاس می‌توانند همچنین متد‌هایی (که " +"توسط کلاس تعریف شده‌اند) داشته باشند تا وضعیت آن را تغییر دهند." #: ../../tutorial/classes.rst:13 msgid "" @@ -56,15 +56,15 @@ msgid "" "nature of Python: they are created at runtime, and can be modified further " "after creation." msgstr "" -"در مقایسه با دیگر زبان های برنامه نویسی، مکانیزم کلاس در پایتون کلاس ها را " -"با حداقل قواعد و معناشناسی جدید اضافه می کند. این مکانیزم ترکیبی از مکانیزم " -"های کلاسی است که در C++ و Modula-3 یافت می شود. کلاس های پایتون تمام ویژگی " -"های استاندارد برنامه نویسی شی گرا را فراهم می کنند: مکانیزم ارث بری کلاس ها " -"اجازه می دهد کلاس های پایه متعددی داشته باشید، یک کلاس مشتق می تواند هر یک " -"از متدهای کلاس های پایه خود را بازنویسی کند و یک متد می تواند متدی از کلاس " -"پایه با همان نام را فراخوانی کند. اشیاء می توانند حاوی مقادیر و انواع داده " -"ای دلخواه باشند. همان طور که برای ماژول ها صادق است، کلاس ها نیز از طبیعت " -"پویا در پایتون برخوردارند: آن ها در زمان اجرا ایجاد می شوند و می توانند پس " +"در مقایسه با دیگر زبان‌های برنامه‌نویسی، مکانیزم کلاس در پایتون کلاس‌ها را " +"با حداقل قواعد و معناشناسی جدید اضافه می‌کند. این مکانیزم ترکیبی از مکانیزم‌های " +"کلاسی است که در C++ و Modula-3 یافت می‌شود. کلاس‌های پایتون تمام ویژگی‌های " +"استاندارد برنامه‌نویسی شیءگرا را فراهم می‌کنند: مکانیزم ارث بری کلاس‌ها " +"اجازه می‌دهد کلاس‌های پایه‌ی متعددی داشته باشید، یک کلاس مشتق می‌تواند هر یک " +"از متد‌های کلاس‌های پایه‌ی خود را بازنویسی کند و یک متد می‌تواند متدی از کلاس " +"پایه با همان نام را فراخوانی کند. اشیاء می‌توانند حاوی مقادیر و انواع داده‌ای " +"دلخواه باشند. همان‌طور که برای ماژول‌ها صادق است، کلاس‌ها نیز از طبیعت " +"پویا در پایتون برخوردارند: آن‌ها در زمان اجرا ایجاد می‌شوند و می‌توانند پس " "از ایجاد بیشتر تغییر داده شوند." #: ../../tutorial/classes.rst:23 @@ -83,14 +83,14 @@ msgid "" msgstr "" "در اصطلاحات C++، معمولاً اعضای کلاس (از جمله اعضای داده) *public* هستند (به " "جز موردی که در پایین :ref:`tut-private` ذکر شده است)، و تمامی توابع عضو " -"مجازی هستند. همان طور که در Modula-3، هیچ میانبرهایی برای ارجاع به اعضای " -"شیء از متدهای آن وجود ندارد: تابع متد با یک آرگومان اول صریح که نمایانگر شیء " -"است، اعلام می شود که این آرگومان به صورت ضمنی توسط فراخوانی فراهم می شود. " -"همان طور که در Smalltalk، خود کلاس ها اشیاء هستند. این ویژگی معناشناسی برای " -"وارد کردن و تغییر نام را فراهم می آورد. برخلاف C++ و Modula-3، نوع های داخلی " -"می توانند به عنوان کلاس های پایه برای توسعه توسط کاربر استفاده شوند. همچنین، " -"مانند C++، بیشتر عملگرهای داخلی با نحوی خاص (عملگرهای ریاضی، زیرنویسی و " -"غیره) می توانند برای نمونه های کلاس بازتعریف شوند." +"مجازی هستند. همان‌طور که در Modula-3، هیچ میانبر‌هایی برای ارجاع به اعضای " +"شیء از متد‌های آن وجود ندارد: تابع متد با یک آرگومان اول صریح که نمایانگر شیء " +"است، اعلام می‌شود که این آرگومان به صورت ضمنی توسط فراخوانی فراهم می‌شود. " +"همان‌طور که در Smalltalk، خود کلاس‌ها اشیاء هستند. این ویژگی معناشناسی برای " +"وارد کردن و تغییر نام را فراهم می‌آورد. برخلاف C++ و Modula-3، نوع‌های داخلی " +"می‌توانند به‌عنوان کلاس‌های پایه برای توسعه توسط کاربر استفاده شوند. همچنین، " +"مانند C++، بیشتر عملگر‌های داخلی با نحوی خاص (عملگر‌های ریاضی، زیرنویسی و " +"غیره) می‌توانند برای نمونه‌های کلاس بازتعریف شوند." #: ../../tutorial/classes.rst:34 msgid "" @@ -99,14 +99,14 @@ msgid "" "since its object-oriented semantics are closer to those of Python than C++, " "but I expect that few readers have heard of it.)" msgstr "" -"(با نبود اصطلاحات پذیرفته شده جهانی برای صحبت درباره کلاس‌ها، گاهی از " +"(با نبود اصطلاحات پذیرفته شده جهانی برای صحبت درباره‌ی کلاس‌ها، گاهی از " "اصطلاحات Smalltalk و C++ استفاده خواهم کرد. من از اصطلاحات Modula-3 استفاده " -"می‌کردم، چون معنای شیءگرای آن به پایتون نزدیک‌تر از C++ است، اما انتظار دارم " +"می‌کردم، چون معنای شیء‌گرای آن به پایتون نزدیک‌تر از C++ است، اما انتظار دارم " "که تعداد کمی از خوانندگان با آن آشنا باشند.)" #: ../../tutorial/classes.rst:43 msgid "A Word About Names and Objects" -msgstr "سخنی درباره نام‌ها و اشیاء" +msgstr "سخنی درباره‌ی نام‌ها و اشیاء" #: ../../tutorial/classes.rst:45 msgid "" @@ -123,10 +123,22 @@ msgid "" "the caller will see the change --- this eliminates the need for two " "different argument passing mechanisms as in Pascal." msgstr "" +"اشیاء هویت فردی دارند و چندین نام (در چندین محدوده) می‌توانند به یک شیء " +"مشخص متصل شوند. این در زبان‌های دیگر با نام «اسم‌های مستعار» شناخته می‌شود. " +"این ویژگی معمولاً در نگاه اول به پایتون چندان جلب توجه نمی‌کند و هنگام کار با " +"انواع پایه‌ی تغییرناپذیر (اعداد، رشته‌ها، تاپل‌ها) می‌توان آن را نادیده گرفت. " +"با این حال، نام‌های مستعار می‌توانند تأثیری شگفت‌آور بر معناشناسی کد پایتونی " +"داشته باشند، به‌ویژه هنگامی که با اشیاء تغییرپذیر مانند لیست‌ها، دیکشنری‌ها و " +"بیشتر انواع دیگر سروکار داریم. این ویژگی معمولاً به سود برنامه تمام می‌شود، " +"چون نام‌های مستعار از برخی جهات مانند اشاره‌گرها (pointer) رفتار می‌کنند. " +"برای مثال، ارسال یک شیء به‌عنوان آرگومان ارزان است، چون پیاده‌سازی فقط یک اشاره‌گر را " +"ارسال می‌کند؛ و اگر تابعی شیء‌ای را که به‌عنوان آرگومان دریافت کرده تغییر دهد، " +"فراخوان‌نده تغییر را مشاهده خواهد کرد --- این کار نیاز به دو مکانیزم متفاوت " +"برای ارسال آرگومان (مانند آنچه در پاسکال وجود دارد) را از بین می‌برد." #: ../../tutorial/classes.rst:61 msgid "Python Scopes and Namespaces" -msgstr "محدوده ها و فضای نام ها در پایتون" +msgstr "محدوده‌ها و فضای نام‌ها در پایتون" #: ../../tutorial/classes.rst:63 msgid "" @@ -136,10 +148,10 @@ msgid "" "understand what's going on. Incidentally, knowledge about this subject is " "useful for any advanced Python programmer." msgstr "" -"قبل از معرفی کلاس ها، ابتدا باید چیزی درباره قوانین حوزه در پایتون به شما " -"بگویم. تعریف کلاس ها چند ترفند جالب با فضاهای نام انجام می دهد و برای اینکه " -"به طور کامل متوجه شوید چه می گذرد، باید بدانید که حوزه ها و فضاهای نام چگونه " -"کار می کنند. ضمناً، آگاهی از این موضوع برای هر برنامه نویس پیشرفته پایتون " +"قبل از معرفی کلاس‌ها، ابتدا باید چیزی درباره‌ی قوانین حوزه در پایتون به شما " +"بگویم. تعریف کلاس‌ها چند ترفند جالب با فضا‌های نام انجام می‌دهد و برای اینکه " +"به‌طور کامل متوجه شوید چه می‌گذرد، باید بدانید که حوزه‌ها و فضا‌های نام چگونه " +"کار می‌کنند. ضمناً، آگاهی از این موضوع برای هر برنامه‌نویس پیشرفته‌ی پایتون " "مفید است." #: ../../tutorial/classes.rst:69 @@ -162,11 +174,11 @@ msgid "" msgstr "" "«فضای نام» *namespace* نگاشتی است از نام‌ها به اشیا. بیشتر فضای نام‌ها در حال " "حاضر به‌صورت دیکشنری‌های پایتون پیاده‌سازی شده‌اند، اما معمولاً این موضوع (به جز " -"در بازدهی «performance» ) قابل مشاهده نیست و ممکن است در آینده تغییر کند. " +"در بازدهی قابل مشاهده نیست و ممکن است در آینده تغییر کند. " "مثال‌هایی از فضای نام عبارت‌اند از: مجموعه نام‌های داخلی (که شامل توابعی " "مثل :func:`abs` و نام‌های استثنائات داخلی است)؛ نام‌های سراسری در یک ماژول؛ و " -"نام‌های محلی در یک فراخوانی تابع. به نوعی، مجموعه صفات «attributes» یک شی نیز " -"یک فضای نام را تشکیل می‌دهد. نکته مهم درباره فضای نام‌ها این است که هیچ " +"نام‌های محلی در یک فراخوانی تابع. به نوعی، مجموعه صفات «attributes» یک شیء نیز " +"یک فضای نام را تشکیل می‌دهد. نکته‌ی مهم درباره‌ی فضای نام‌ها این است که هیچ " "ارتباطی بین نام‌ها در فضای نام‌های مختلف وجود ندارد؛ برای مثال، دو ماژول مختلف " "می‌توانند هر دو تابعی با نام ``maximize`` تعریف کنند بدون اینکه ابهامی پیش " "بیاید — استفاده‌کنندگان از ماژول‌ها باید نام ماژول را به عنوان پیشوند بیاورند." @@ -181,10 +193,10 @@ msgid "" "happens to be a straightforward mapping between the module's attributes and " "the global names defined in the module: they share the same namespace! [#]_" msgstr "" -"به‌هرحال، من واژهٔ *ویژگی* «*attribute*» را برای هر نامی که بعد از یک نقطه " -"بیاید به کار می‌برم — برای مثال، در عبارت ``z.real``, ``real`` یک ویژگیِ شیءِ " +"به‌هرحال، من واژه‌ی *ویژگی* «*attribute*» را برای هر نامی که بعد از یک نقطه " +"بیاید به کار می‌برم — برای مثال، در عبارت ``z.real``, ``real`` یک ویژگی شیء " "``z`` است. از نظر دقیق‌تر، ارجاع به نام‌ها در ماژول‌ها نیز نوعی ارجاع به ویژگی " -"محسوب می‌شود: در عبارت ``modname.funcname``, ``modname`` یک شیءِ ماژول است و " +"محسوب می‌شود: در عبارت ``modname.funcname``, ``modname`` یک شیء ماژول است و " "``funcname`` یکی از ویژگی‌های آن است. در این حالت، نگاشتی ساده و مستقیم بین " "ویژگی‌های ماژول و نام‌های سراسری تعریف‌شده در آن وجود دارد: هر دو یک فضای نام " "(namespace) را به اشتراک می‌گذارند! [#]_" @@ -198,9 +210,9 @@ msgid "" "remove the attribute :attr:`!the_answer` from the object named by " "``modname``." msgstr "" -"ویژگی ها ممکن است فقط خواندنی یا قابل نوشتن باشند. در حالت دوم، اختصاص دادن " -"به ویژگی ها ممکن است. ویژگی های ماژول قابل نوشتن هستند: می توانید " -"``modname.the_answer = 42`` را بنویسید. ویژگی های قابل نوشتن را می توان با " +"ویژگی‌ها ممکن است فقط خواندنی یا قابل نوشتن باشند. در حالت دوم، اختصاص دادن " +"به ویژگی‌ها ممکن است. ویژگی‌های ماژول قابل نوشتن هستند: می‌توانید " +"``modname.the_answer = 42`` را بنویسید. ویژگی‌های قابل نوشتن را می‌توان با " "دستور :keyword:`del` نیز حذف کرد. به عنوان مثال، ``del modname.the_answer`` " "ویژگی :attr:`!the_answer` را از شیئی که توسط ``modname`` نامگذاری شده است " "حذف خواهد کرد." @@ -217,15 +229,15 @@ msgid "" "called :mod:`__main__`, so they have their own global namespace. (The built-" "in names actually also live in a module; this is called :mod:`builtins`.)" msgstr "" -"فضاهای نام در لحظات مختلف ایجاد می شوند و دارای طول عمرهای متفاوتی هستند. " -"فضای نام که شامل نام های داخلی است، زمانی که مفسر پایتون شروع به کار می کند " -"ایجاد می شود و هرگز حذف نمی شود. فضای نام عمومی برای یک ماژول زمانی که تعریف " -"ماژول خوانده می شود ایجاد می گردد؛ به طور معمول، فضاهای نام ماژول نیز تا " -"زمانی که مفسر پایان یابد باقی می مانند. دستوراتی که توسط اجرای سطح بالای " -"مفسر، یا از فایل اسکریپت خوانده شده یا به طور تعاملی اجرا می شوند، به عنوان " -"بخشی از ماژولی به نام :mod:`__main__` در نظر گرفته می شوند، بنابراین آن ها " +"فضا‌های نام در لحظات مختلف ایجاد می‌شوند و دارای طول عمر‌های متفاوتی هستند. " +"فضای نام که شامل نام‌های داخلی است، زمانی که مفسر پایتون شروع به کار می‌کند " +"ایجاد می‌شود و هرگز حذف نمی‌شود. فضای نام عمومی برای یک ماژول زمانی که تعریف " +"ماژول خوانده می‌شود ایجاد می‌گردد؛ به‌طور معمول، فضا‌های نام ماژول نیز تا " +"زمانی که مفسر پایان یابد باقی می‌مانند. دستوراتی که توسط اجرای سطح بالای " +"مفسر، یا از فایل اسکریپت خوانده شده یا به‌طور تعاملی اجرا می‌شوند، به عنوان " +"بخشی از ماژولی به نام :mod:`__main__` در نظر گرفته می‌شوند، بنابراین آن‌ها " "فضای نام عمومی خود را دارند. (نام‌های درون‌ساخت نیز در واقع در یک ماژول قرار " -"دارند؛ این ماژول :mod:`builtins` نامیده می شود.)" +"دارند؛ این ماژول :mod:`builtins` نامیده می‌شود.)" #: ../../tutorial/classes.rst:106 msgid "" @@ -246,10 +258,10 @@ msgid "" "directly accessible. \"Directly accessible\" here means that an unqualified " "reference to a name attempts to find the name in the namespace." msgstr "" -"یک *دامنه* «*scope*» یک ناحیه متنی از یک برنامه پایتون است که در آن یک فضای " -"نام «namespace» به طور مستقیم قابل دستیابی است. \"به طور مستقیم قابل " -"دستیابی\" در اینجا به این معنی است که یک ارجاع بدون صلاحیت به یک نام تلاش می " -"کند تا نام «name» را در فضای نام «namespace» پیدا کند." +"یک *دامنه* «*scope*» یک ناحیه‌ی متنی از یک برنامه‌ی پایتون است که در آن یک فضای " +"نام «namespace» به‌طور مستقیم قابل دستیابی است. \"به‌طور مستقیم قابل " +"دستیابی\" در اینجا به این معنی است که یک ارجاع بدون صلاحیت به یک نام تلاش می‌کند " +"تا نام «name» را در فضای نام «namespace» پیدا کند." #: ../../tutorial/classes.rst:116 msgid "" @@ -257,26 +269,33 @@ msgid "" "time during execution, there are 3 or 4 nested scopes whose namespaces are " "directly accessible:" msgstr "" +"اگرچه محدوده‌ها به‌صورت ایستا تعیین می‌شوند، اما به‌صورت پویا مورد استفاده قرار می‌گیرند. در هر " +"زمان حین اجرا، ۳ یا ۴ محدوده‌ی تو در تو وجود دارند که فضاهای نام آن‌ها " +"مستقیماً قابل دسترسی هستند:" #: ../../tutorial/classes.rst:120 msgid "the innermost scope, which is searched first, contains the local names" -msgstr "درونی ترین حوزه، که ابتدا جستجو می شود، شامل نام های محلی است" +msgstr "درونی‌ترین حوزه، که ابتدا جستجو می‌شود، شامل نام‌های محلی است" #: ../../tutorial/classes.rst:121 msgid "" "the scopes of any enclosing functions, which are searched starting with the " "nearest enclosing scope, contain non-local, but also non-global names" msgstr "" +"محدوده‌های هر تابع محاط‌شونده، که جستجو از نزدیک‌ترین " +"محدوده‌ی محاط‌شونده آغاز می‌شود، شامل نام‌های غیرمحلی و همچنین غیرسراسری هستند." #: ../../tutorial/classes.rst:123 msgid "the next-to-last scope contains the current module's global names" -msgstr "حوزه قبل از آخر شامل نام های عمومی ماژول جاری است." +msgstr "حوزه‌ی قبل از آخر شامل نام‌های عمومی ماژول جاری است." #: ../../tutorial/classes.rst:124 msgid "" "the outermost scope (searched last) is the namespace containing built-in " "names" msgstr "" +"بیرونی‌ترین محدوده (که آخر از همه جستجو می‌شود) فضای نامی است که شامل " +"نام‌های توکار است." #: ../../tutorial/classes.rst:126 msgid "" @@ -288,6 +307,12 @@ msgid "" "simply create a *new* local variable in the innermost scope, leaving the " "identically named outer variable unchanged)." msgstr "" +"اگر یک نام به‌عنوان سراسری اعلام شود، تمام ارجاع‌ها و تخصیص‌ها مستقیماً به " +"محدوده‌ی یکی‌مانده‌به‌آخر که شامل نام‌های سراسری ماژول است، می‌روند. برای " +"اتصال مجدد متغیرهایی که در خارج از درونی‌ترین محدوده یافت می‌شوند، " +"می‌توان از دستور :keyword:`nonlocal` استفاده کرد؛ اگر به‌عنوان nonlocal اعلام نشوند، " +"آن متغیرها فقط‌خواندنی هستند (تلاش برای نوشتن در چنین متغیری، صرفاً یک متغیر محلی *جدید* در " +"درونی‌ترین محدوده ایجاد می‌کند و متغیر بیرونی با همان نام را بدون تغییر باقی می‌گذارد)." #: ../../tutorial/classes.rst:133 msgid "" @@ -296,6 +321,9 @@ msgid "" "namespace as the global scope: the module's namespace. Class definitions " "place yet another namespace in the local scope." msgstr "" +"معمولاً، محدوده‌ی محلی به نام‌های محلی تابع جاری (از نظر متنی) ارجاع می‌دهد. " +"در خارج از توابع، محدوده‌ی محلی به همان فضای نامی ارجاع می‌دهد که محدوده‌ی سراسری " +"به آن ارجاع می‌دهد: فضای نام ماژول. تعاریف کلاس‌ها، فضای نام دیگری را در محدوده‌ی محلی قرار می‌دهند." #: ../../tutorial/classes.rst:138 msgid "" @@ -307,6 +335,12 @@ msgid "" "at \"compile\" time, so don't rely on dynamic name resolution! (In fact, " "local variables are already determined statically.)" msgstr "" +"درک این نکته مهم است که محدوده‌ها به‌صورت متنی (بر اساس جایگاه در کد) تعیین می‌شوند: محدوده‌ی سراسری " +"تابعی که در یک ماژول تعریف شده است، همان فضای نام آن ماژول است، " +"فرقی نمی‌کند که تابع از کجا یا با چه نام مستعاری فراخوانی شود. از سوی " +"دیگر، جستجوی واقعی برای نام‌ها به‌صورت پویا (داینامیک) و در زمان اجرا انجام می‌شود --- " +"با این حال، تعریف زبان به سمت و سوی حلِ ایستا (استاتیک) نام‌ها در زمان «کامپایل» پیش می‌رود، " +"پس به حلِ پویای نام‌ها اعتماد نکنید! (در واقع، متغیرهای محلی از قبل به‌صورت ایستا تعیین می‌شوند.)" #: ../../tutorial/classes.rst:146 msgid "" @@ -319,6 +353,13 @@ msgid "" "scope: in particular, :keyword:`import` statements and function definitions " "bind the module or function name in the local scope." msgstr "" +"یک ویژگی خاص پایتون این است که --- اگر دستور :keyword:`global` " +"یا :keyword:`nonlocal` فعال نباشد --- تخصیص‌های (مقداردهی‌های) نام‌ها همیشه " +"به درونی‌ترین محدوده (محلی‌ترین) می‌روند. تخصیص‌ها داده‌ها را کپی نمی‌کنند --- " +"بلکه فقط نام‌ها را به اشیاء متصل می‌کنند. همین موضوع در مورد حذف‌ها نیز صادق است: " +"دستور ``del x`` اتصال ``x`` را از فضای نامی که توسط محدوده‌ی محلی ارجاع داده شده است، حذف می‌کند. " +"در واقع، تمام عملیاتی که نام‌های جدیدی معرفی می‌کنند از محدوده‌ی محلی استفاده می‌کنند: " +"به‌ویژه، دستورات :keyword:`import` و تعاریف توابع، نام ماژول یا تابع را در محدوده‌ی محلی متصل می‌کنند." #: ../../tutorial/classes.rst:154 msgid "" @@ -327,10 +368,14 @@ msgid "" "the :keyword:`nonlocal` statement indicates that particular variables live " "in an enclosing scope and should be rebound there." msgstr "" +"از دستور :keyword:`global` می‌توان برای نشان دادن این استفاده کرد که متغیرهای خاصی " +"در محدوده‌ی سراسری قرار دارند و باید در همان محدوده دوباره متصل شوند؛ " +"دستور :keyword:`nonlocal` نشان می‌دهد که متغیرهای خاصی در یک محدوده‌ی محاط‌شونده قرار دارند " +"و باید در آن محدوده دوباره متصل شوند." #: ../../tutorial/classes.rst:162 msgid "Scopes and Namespaces Example" -msgstr "" +msgstr "مثال محدوده‌ها و فضای نام‌ها" #: ../../tutorial/classes.rst:164 msgid "" @@ -338,6 +383,9 @@ msgid "" "namespaces, and how :keyword:`global` and :keyword:`nonlocal` affect " "variable binding::" msgstr "" +"این مثالی است که نحوه‌ی ارجاع به محدوده‌ها و فضای نام‌های مختلف، و تأثیر " +"دستورات :keyword:`global` و :keyword:`nonlocal` بر اتصال متغیرها را نشان " +"می‌دهد::" #: ../../tutorial/classes.rst:168 msgid "" @@ -364,10 +412,32 @@ msgid "" "scope_test()\n" "print(\"In global scope:\", spam)" msgstr "" +"def scope_test():\n" +" def do_local():\n" +" spam = \"local spam\"\n" +"\n" +" def do_nonlocal():\n" +" nonlocal spam\n" +" spam = \"nonlocal spam\"\n" +"\n" +" def do_global():\n" +" global spam\n" +" spam = \"global spam\"\n" +"\n" +" spam = \"test spam\"\n" +" do_local()\n" +" print(\"After local assignment:\", spam)\n" +" do_nonlocal()\n" +" print(\"After nonlocal assignment:\", spam)\n" +" do_global()\n" +" print(\"After global assignment:\", spam)\n" +"\n" +"scope_test()\n" +"print(\"In global scope:\", spam)" #: ../../tutorial/classes.rst:191 msgid "The output of the example code is:" -msgstr "" +msgstr "خروجی کد مثال:" #: ../../tutorial/classes.rst:193 msgid "" @@ -376,6 +446,10 @@ msgid "" "After global assignment: nonlocal spam\n" "In global scope: global spam" msgstr "" +"After local assignment: test spam\n" +"After nonlocal assignment: nonlocal spam\n" +"After global assignment: nonlocal spam\n" +"In global scope: global spam" #: ../../tutorial/classes.rst:200 msgid "" @@ -384,24 +458,29 @@ msgid "" "changed *scope_test*\\'s binding of *spam*, and the :keyword:`global` " "assignment changed the module-level binding." msgstr "" +"توجه کنید که تخصیص *محلی* (که به‌صورت پیش‌فرض است)، اتصال *spam* را در " +"*scope_test* تغییر نداد. تخصیص :keyword:`nonlocal`، اتصال *spam* را در " +"*scope_test* تغییر داد، و تخصیص :keyword:`global`، اتصال را در سطح ماژول تغییر داد." #: ../../tutorial/classes.rst:205 msgid "" "You can also see that there was no previous binding for *spam* before " "the :keyword:`global` assignment." msgstr "" +"همچنین می‌توانید ببینید که قبل از تخصیص :keyword:`global`، هیچ اتصال قبلی برای *spam* " +"وجود نداشت." #: ../../tutorial/classes.rst:212 msgid "A First Look at Classes" -msgstr "در نگاه اول به کلاس ها" +msgstr "در نگاه اول به کلاس‌ها" #: ../../tutorial/classes.rst:214 msgid "" "Classes introduce a little bit of new syntax, three new object types, and " "some new semantics." msgstr "" -"کلاس ها اندکی سینتکس جدید، سه نوع شئ جدید و برخی مفاهیم معنایی جدید معرفی می " -"کنند." +"کلاس‌ها کمی نحو جدید، سه نوع شیء جدید، و " +"مفاهیم معنایی جدیدی را معرفی می‌کنند." #: ../../tutorial/classes.rst:221 msgid "Class Definition Syntax" @@ -409,7 +488,7 @@ msgstr "قواعد تعریف کلاس" #: ../../tutorial/classes.rst:223 msgid "The simplest form of class definition looks like this::" -msgstr "ساده ترین شکل تعریف کلاس به این صورت است:" +msgstr "ساده‌ترین شکل تعریف کلاس به این صورت است:" #: ../../tutorial/classes.rst:225 msgid "" @@ -420,6 +499,12 @@ msgid "" " .\n" " " msgstr "" +"class ClassName:\n" +" \n" +" .\n" +" .\n" +" .\n" +" " #: ../../tutorial/classes.rst:232 msgid "" @@ -428,6 +513,9 @@ msgid "" "a class definition in a branch of an :keyword:`if` statement, or inside a " "function.)" msgstr "" +"تعاریف کلاس‌ها، مانند تعاریف توابع (دستورات :keyword:`def`)، " +"باید قبل از اینکه تأثیری داشته باشند، اجرا شوند. (به‌طور تئوری می‌توانید " +"یک تعریف کلاس را در یک شاخه از دستور :keyword:`if` یا داخل یک تابع قرار دهید.)" #: ../../tutorial/classes.rst:236 msgid "" @@ -437,6 +525,10 @@ msgid "" "normally have a peculiar form of argument list, dictated by the calling " "conventions for methods --- again, this is explained later." msgstr "" +"در عمل، دستورات داخل یک تعریف کلاس معمولاً تعاریف توابع هستند، اما دستورات دیگری نیز مجاز هستند و گاهی مفیدند " +"--- بعداً به این موضوع بازخواهیم گشت. تعاریف توابع داخل یک کلاس " +"معمولاً دارای شکل خاصی از لیست آرگومان‌ها هستند که توسط قراردادهای فراخوانی برای متدها تعیین می‌شود " +"--- باز هم، این موضوع بعداً توضیح داده می‌شود." #: ../../tutorial/classes.rst:242 msgid "" @@ -445,6 +537,10 @@ msgid "" "new namespace. In particular, function definitions bind the name of the new " "function here." msgstr "" +"هنگامی که یک تعریف کلاس وارد می‌شود، یک فضای نام جدید ایجاد شده و به‌عنوان " +"محدوده‌ی محلی استفاده می‌شود --- بنابراین، تمام تخصیص‌ها به متغیرهای محلی به این " +"فضای نام جدید می‌روند. به‌ویژه، تعاریف توابع، نام تابع جدید را در اینجا " +"متصل می‌کنند." #: ../../tutorial/classes.rst:247 msgid "" @@ -456,16 +552,24 @@ msgid "" "here to the class name given in the class definition header (:class:`!" "ClassName` in the example)." msgstr "" +"هنگامی که یک تعریف کلاس به‌طور عادی (با رسیدن به انتها) ترک می‌شود، یک *شیء کلاس* " +"ایجاد می‌شود. این در اصل یک پوسته (wrapper) پیرامون محتویات فضای نامی است که " +"توسط تعریف کلاس ایجاد شده است؛ در بخش بعدی بیشتر درباره‌ی اشیاء کلاس خواهیم آموخت. " +"محدوده‌ی محلی اصلی (همان محدوده‌ای که درست قبل از ورود به تعریف کلاس فعال بود) " +"بازیابی می‌شود، و شیء کلاس در اینجا به نام کلاسی که در سرآیند تعریف کلاس داده شده است، متصل می‌شود " +"(:class:`!ClassName` در مثال)." #: ../../tutorial/classes.rst:259 msgid "Class Objects" -msgstr "" +msgstr "اشیاء کلاس" #: ../../tutorial/classes.rst:261 msgid "" "Class objects support two kinds of operations: attribute references and " "instantiation." msgstr "" +"اشیاء کلاس از دو نوع عملیات پشتیبانی می‌کنند: ارجاع به ویژگی‌ها و " +"نمونه‌سازی." #: ../../tutorial/classes.rst:264 msgid "" @@ -474,6 +578,10 @@ msgid "" "that were in the class's namespace when the class object was created. So, " "if the class definition looked like this::" msgstr "" +"*ارجاع به ویژگی‌ها* از همان دستور زبان استاندارد که برای همه‌ی ارجاع‌ها " +"به ویژگی‌ها در پایتون استفاده می‌شود، پیروی می‌کند: ``obj.name``. نام‌های ویژگی معتبر، " +"همه‌ی نام‌هایی هستند که در هنگام ایجاد شیء کلاس، در فضای نام آن کلاس وجود داشته‌اند. " +"بنابراین، اگر تعریف کلاس به این شکل بود::" #: ../../tutorial/classes.rst:269 msgid "" @@ -484,6 +592,12 @@ msgid "" " def f(self):\n" " return 'hello world'" msgstr "" +"class MyClass:\n" +" \"\"\"A simple example class\"\"\"\n" +" i = 12345\n" +"\n" +" def f(self):\n" +" return 'hello world'" #: ../../tutorial/classes.rst:276 msgid "" @@ -493,6 +607,10 @@ msgid "" "assignment. :attr:`~type.__doc__` is also a valid attribute, returning the " "docstring belonging to the class: ``\"A simple example class\"``." msgstr "" +"سپس ``MyClass.i`` و ``MyClass.f`` ارجاع‌های ویژگی معتبری هستند که به‌ترتیب یک عدد صحیح و یک شیء تابع را برمی‌گردانند. " +"به ویژگی‌های کلاس نیز می‌توان مقدار داد، بنابراین می‌توانید مقدار ``MyClass.i`` را با تخصیص (مقداردهی) تغییر دهید. " +":attr:`~type.__doc__` نیز یک ویژگی معتبر است که رشته‌ی مستند (docstring) متعلق به کلاس را برمی‌گرداند: " +"``\"A simple example class\"``." #: ../../tutorial/classes.rst:282 msgid "" @@ -500,16 +618,21 @@ msgid "" "object is a parameterless function that returns a new instance of the class. " "For example (assuming the above class)::" msgstr "" +"*نمونه‌سازی* کلاس از نماد توابع استفاده می‌کند. " +"فقط تصور کنید که شیء کلاس، یک تابع بدون پارامتر است که یک نمونه‌ی جدید از کلاس را برمی‌گرداند. " +"برای مثال (با فرض کلاس بالا)::" #: ../../tutorial/classes.rst:286 ../../tutorial/classes.rst:303 msgid "x = MyClass()" -msgstr "" +msgstr "x = MyClass()" #: ../../tutorial/classes.rst:288 msgid "" "creates a new *instance* of the class and assigns this object to the local " "variable ``x``." msgstr "" +"یک *نمونه* جدید از کلاس ایجاد می‌کند و این شیء را به متغیر محلی " +"``x`` تخصیص می‌دهد." #: ../../tutorial/classes.rst:291 msgid "" @@ -518,12 +641,18 @@ msgid "" "specific initial state. Therefore a class may define a special method " "named :meth:`~object.__init__`, like this::" msgstr "" +"عملیات نمونه‌سازی (که «فراخوانی» یک شیء کلاس است) یک شیء خالی ایجاد می‌کند. " +"بسیاری از کلاس‌ها ترجیح می‌دهند اشیایی با نمونه‌هایی ایجاد کنند که به یک حالت اولیه‌ی خاص سفارشی‌سازی شده‌اند. " +"بنابراین، یک کلاس ممکن است یک متد ویژه به نام :meth:`~object.__init__` تعریف کند، " +"مانند این::" #: ../../tutorial/classes.rst:296 msgid "" "def __init__(self):\n" " self.data = []" msgstr "" +"def __init__(self):\n" +" self.data = []" #: ../../tutorial/classes.rst:299 msgid "" @@ -532,6 +661,10 @@ msgid "" "instance. So in this example, a new, initialized instance can be obtained " "by::" msgstr "" +"وقتی یک کلاس یک متد :meth:`~object.__init__` تعریف می‌کند، نمونه‌سازی کلاس " +"به‌طور خودکار :meth:`!__init__` را برای نمونه‌ی تازه‌ایجادشده‌ی کلاس فراخوانی می‌کند. " +"بنابراین در این مثال، می‌توان یک نمونه‌ی جدید و مقداردهی‌شده را با دستور زیر " +"به‌دست آورد::" #: ../../tutorial/classes.rst:305 msgid "" @@ -539,6 +672,9 @@ msgid "" "greater flexibility. In that case, arguments given to the class " "instantiation operator are passed on to :meth:`!__init__`. For example, ::" msgstr "" +"البته، متد :meth:`~object.__init__` ممکن است برای انعطاف‌پذیری بیشتر، آرگومان‌هایی داشته باشد. " +"در آن صورت، آرگومان‌هایی که به عملگر نمونه‌سازی کلاس داده می‌شوند، به :meth:`!__init__` منتقل می‌شوند. " +"برای مثال، ::" #: ../../tutorial/classes.rst:309 msgid "" @@ -551,10 +687,18 @@ msgid "" ">>> x.r, x.i\n" "(3.0, -4.5)" msgstr "" +">>> class Complex:\n" +"... def __init__(self, realpart, imagpart):\n" +"... self.r = realpart\n" +"... self.i = imagpart\n" +"...\n" +">>> x = Complex(3.0, -4.5)\n" +">>> x.r, x.i\n" +"(3.0, -4.5)" #: ../../tutorial/classes.rst:322 msgid "Instance Objects" -msgstr "" +msgstr "اشیاء نمونه" #: ../../tutorial/classes.rst:324 msgid "" @@ -562,6 +706,9 @@ msgid "" "instance objects are attribute references. There are two kinds of valid " "attribute names: data attributes and methods." msgstr "" +"حالا با اشیاء نمونه چه کاری می‌توانیم انجام دهیم؟ تنها عملیاتی که اشیاء نمونه " +"می‌فهمند، ارجاع به ویژگی‌ها (attribute references) است. دو نوع نام ویژگی معتبر وجود دارد: " +"ویژگی‌های داده (data attributes) و متدها (methods)." #: ../../tutorial/classes.rst:328 msgid "" @@ -572,6 +719,11 @@ msgid "" "following piece of code will print the value ``16``, without leaving a " "trace::" msgstr "" +"*ویژگی‌های داده* معادل «متغیرهای نمونه» در زبان اسمالتاک و " +"«عضوهای داده» در ++C هستند. ویژگی‌های داده نیازی به اعلام ندارند؛ مانند متغیرهای محلی، " +"هنگامی که برای اولین بار به آنها مقدار داده می‌شود، به‌وجود می‌آیند. برای " +"مثال، اگر ``x`` نمونه‌ای از :class:`!MyClass` باشد که در بالا ایجاد شده است، " +"قطعه کد زیر مقدار ``16`` را چاپ می‌کند، بدون اینکه هیچ اثری از خود بر جای بگذارد::" #: ../../tutorial/classes.rst:334 msgid "" @@ -581,12 +733,19 @@ msgid "" "print(x.counter)\n" "del x.counter" msgstr "" +"x.counter = 1\n" +"while x.counter < 10:\n" +" x.counter = x.counter * 2\n" +"print(x.counter)\n" +"del x.counter" #: ../../tutorial/classes.rst:340 msgid "" "The other kind of instance attribute reference is a *method*. A method is a " "function that \"belongs to\" an object." msgstr "" +"نوع دیگر ارجاع به ویژگی نمونه، *متد* است. متد، تابعی است که " +"«به» یک شیء تعلق دارد." #: ../../tutorial/classes.rst:345 msgid "" @@ -597,18 +756,23 @@ msgid "" "not, since ``MyClass.i`` is not. But ``x.f`` is not the same thing as " "``MyClass.f`` --- it is a *method object*, not a function object." msgstr "" +"نام‌های متد معتبر یک شیء نمونه به کلاس آن بستگی دارد. طبق " +"تعریف، تمام ویژگی‌های یک کلاس که شیء تابع هستند، متدهای متناظر با نمونه‌های آن را تعریف می‌کنند. " +"بنابراین در مثال ما، ``x.f`` یک ارجاع متد معتبر است، زیرا ``MyClass.f`` یک تابع است، اما ``x.i`` " +"معتبر نیست، زیرا ``MyClass.i`` تابع نیست. اما ``x.f`` با ``MyClass.f`` یکسان نیست --- " +"بلکه یک *شیء متد* است، نه یک شیء تابع." #: ../../tutorial/classes.rst:356 msgid "Method Objects" -msgstr "" +msgstr "متد اشیاء" #: ../../tutorial/classes.rst:358 msgid "Usually, a method is called right after it is bound::" -msgstr "" +msgstr "معمولاً، یک متد بلافاصله پس از اتصال فراخوانی می‌شود::"" #: ../../tutorial/classes.rst:360 msgid "x.f()" -msgstr "" +msgstr "x.f()" #: ../../tutorial/classes.rst:362 msgid "" @@ -617,6 +781,10 @@ msgid "" "is a method object, and can be stored away and called at a later time. For " "example::" msgstr "" +"اگر ``x = MyClass()``، همان‌طور که در بالا ذکر شد، این (فراخوانی) رشته‌ی ``'hello " +"world'`` را برمی‌گرداند. با این حال، لزومی ندارد که یک متد بلافاصله فراخوانی شود: ``x.f`` " +"یک شیء متد است و می‌توان آن را ذخیره کرده و در زمان دیگری فراخوانی کرد. " +"برای مثال::" #: ../../tutorial/classes.rst:366 msgid "" @@ -624,10 +792,13 @@ msgid "" "while True:\n" " print(xf())" msgstr "" +"xf = x.f\n" +"while True:\n" +" print(xf())" #: ../../tutorial/classes.rst:370 msgid "will continue to print ``hello world`` until the end of time." -msgstr "" +msgstr "تا پایان زمان به چاپ ``hello world`` ادامه می‌دهد." #: ../../tutorial/classes.rst:372 msgid "" @@ -638,6 +809,10 @@ msgid "" "argument is called without any --- even if the argument isn't actually " "used..." msgstr "" +"دقیقاً وقتی یک متد فراخوانی می‌شود، چه اتفاقی می‌افتد؟ احتمالاً متوجه شده‌اید که " +"``x.f()`` در بالا بدون هیچ آرگومانی فراخوانی شد، حتی اگر تعریف تابع :meth:`!f` یک آرگومان را مشخص کرده بود. " +"چه بر سر آن آرگومان آمد؟ مسلماً پایتون وقتی یک تابع که به آرگومان نیاز دارد، بدون هیچ آرگومانی فراخوانی می‌شود، یک استثنا ایجاد می‌کند --- حتی اگر آن آرگومان واقعاً " +"استفاده نشود..." #: ../../tutorial/classes.rst:378 msgid "" @@ -649,6 +824,11 @@ msgid "" "that is created by inserting the method's instance object before the first " "argument." msgstr "" +"در واقع، شاید پاسخ را حدس زده باشید: نکته‌ی ویژه در مورد متدها این است که " +"شیء نمونه به عنوان اولین آرگومان تابع ارسال می‌شود. در مثال ما، فراخوانی ``x.f()`` دقیقاً معادل " +"``MyClass.f(x)`` است. به طور کلی، فراخوانی یک متد با لیستی از *n* آرگومان " +"معادل فراخوانی تابع متناظر با لیست آرگومانی است که با قرار دادن شیء نمونه‌ی متد قبل از اولین آرگومان " +"ایجاد می‌شود." #: ../../tutorial/classes.rst:385 msgid "" @@ -660,10 +840,17 @@ msgid "" "argument list is constructed from the instance object and the argument list, " "and the function object is called with this new argument list." msgstr "" +"به طور کلی، متدها به صورت زیر کار می‌کنند. هنگامی که به یک ویژگی غیرداده‌ای از یک " +"نمونه ارجاع داده می‌شود، کلاس آن نمونه جستجو می‌شود. اگر آن نام " +"نشان‌دهنده‌ی یک ویژگی کلاس معتبر باشد که یک شیء تابع است، ارجاعات به " +"هر دو شیء نمونه و شیء تابع در یک شیء متد بسته‌بندی " +"می‌شوند. هنگامی که شیء متد با یک لیست آرگومان فراخوانی می‌شود، یک لیست آرگومان جدید " +"از شیء نمونه و لیست آرگومان ساخته می‌شود و شیء تابع با این لیست آرگومان جدید " +"فراخوانی می‌شود." #: ../../tutorial/classes.rst:398 msgid "Class and Instance Variables" -msgstr "" +msgstr "کلاس و متغیر‌های نمونه" #: ../../tutorial/classes.rst:400 msgid "" @@ -671,6 +858,9 @@ msgid "" "and class variables are for attributes and methods shared by all instances " "of the class::" msgstr "" +"به‌طور کلی، متغیرهای نمونه برای داده‌هایی هستند که مختص به هر نمونه " +"و متغیرهای کلاس برای ویژگی‌ها و متدهایی هستند که بین همه‌ی نمونه‌ها " +"از آن کلاس مشترک هستند::" #: ../../tutorial/classes.rst:404 msgid "" @@ -692,6 +882,23 @@ msgid "" ">>> e.name # unique to e\n" "'Buddy'" msgstr "" +"class Dog:\n" +"\n" +" kind = 'canine' # class variable shared by all instances\n" +"\n" +" def __init__(self, name):\n" +" self.name = name # instance variable unique to each instance\n" +"\n" +">>> d = Dog('Fido')\n" +">>> e = Dog('Buddy')\n" +">>> d.kind # shared by all dogs\n" +"'canine'\n" +">>> e.kind # shared by all dogs\n" +"'canine'\n" +">>> d.name # unique to d\n" +"'Fido'\n" +">>> e.name # unique to e\n" +"'Buddy'" #: ../../tutorial/classes.rst:422 msgid "" @@ -701,6 +908,11 @@ msgid "" "class variable because just a single list would be shared by all *Dog* " "instances::" msgstr "" +"همان‌طور که در :ref:`tut-object` بحث شد، داده‌های مشترک می‌توانند تأثیرات " +"شگفت‌آوری بر روی اشیاء :term:`تغییرپذیر (mutable)` مانند لیست‌ها و دیکشنری‌ها داشته باشند. " +"برای مثال، لیست *tricks* در کد زیر نباید به‌عنوان یک " +"متغیر کلاس استفاده شود، زیرا فقط یک لیست واحد بین همه‌ی نمونه‌های *Dog* " +"مشترک خواهد بود::" #: ../../tutorial/classes.rst:428 msgid "" @@ -721,10 +933,26 @@ msgid "" ">>> d.tricks # unexpectedly shared by all dogs\n" "['roll over', 'play dead']" msgstr "" +"class Dog:\n" +"\n" +" tricks = [] # mistaken use of a class variable\n" +"\n" +" def __init__(self, name):\n" +" self.name = name\n" +"\n" +" def add_trick(self, trick):\n" +" self.tricks.append(trick)\n" +"\n" +">>> d = Dog('Fido')\n" +">>> e = Dog('Buddy')\n" +">>> d.add_trick('roll over')\n" +">>> e.add_trick('play dead')\n" +">>> d.tricks # unexpectedly shared by all dogs\n" +"['roll over', 'play dead']" #: ../../tutorial/classes.rst:445 msgid "Correct design of the class should use an instance variable instead::" -msgstr "" +msgstr "طراحی صحیح کلاس باید به جای آن از یک متغیر نمونه استفاده کند::" #: ../../tutorial/classes.rst:447 msgid "" @@ -746,16 +974,35 @@ msgid "" ">>> e.tricks\n" "['play dead']" msgstr "" +"class Dog:\n" +"\n" +" def __init__(self, name):\n" +" self.name = name\n" +" self.tricks = [] # creates a new empty list for each dog\n" +"\n" +" def add_trick(self, trick):\n" +" self.tricks.append(trick)\n" +"\n" +">>> d = Dog('Fido')\n" +">>> e = Dog('Buddy')\n" +">>> d.add_trick('roll over')\n" +">>> e.add_trick('play dead')\n" +">>> d.tricks\n" +"['roll over']\n" +">>> e.tricks\n" +"['play dead']" #: ../../tutorial/classes.rst:469 msgid "Random Remarks" -msgstr "" +msgstr "نکات پراکنده" #: ../../tutorial/classes.rst:473 msgid "" "If the same attribute name occurs in both an instance and in a class, then " "attribute lookup prioritizes the instance::" msgstr "" +"اگر نام ویژگی مشابهی هم در یک نمونه و هم در یک کلاس وجود داشته باشد، آنگاه " +"جستجوی ویژگی، نمونه را اولویت‌بندی می‌کند::" #: ../../tutorial/classes.rst:476 msgid "" @@ -771,6 +1018,17 @@ msgid "" ">>> print(w2.purpose, w2.region)\n" "storage east" msgstr "" +">>> class Warehouse:\n" +"... purpose = 'storage'\n" +"... region = 'west'\n" +"...\n" +">>> w1 = Warehouse()\n" +">>> print(w1.purpose, w1.region)\n" +"storage west\n" +">>> w2 = Warehouse()\n" +">>> w2.region = 'east'\n" +">>> print(w2.purpose, w2.region)\n" +"storage east" #: ../../tutorial/classes.rst:488 msgid "" @@ -782,6 +1040,13 @@ msgid "" "implementation details and control access to an object if necessary; this " "can be used by extensions to Python written in C.)" msgstr "" +"ویژگی‌های داده ممکن است هم توسط متدها و هم توسط کاربران عادی " +"(\"clients\") یک شیء ارجاع داده شوند. به عبارت دیگر، کلاس‌ها برای " +"پیاده‌سازی انواع داده‌ی انتزاعی خالص قابل استفاده نیستند. در واقع، هیچ چیزی در پایتون " +"امکان اعمال پنهان‌سازی داده را فراهم نمی‌کند --- همه‌چیز بر اساس قرارداد است. (از " +"سوی دیگر، پیاده‌سازی پایتون که به زبان C نوشته شده است، می‌تواند جزئیات پیاده‌سازی را کاملاً پنهان کند " +"و در صورت نیاز دسترسی به یک شیء را کنترل کند؛ این " +"قابلیت می‌تواند توسط افزونه‌های پایتون که به زبان C نوشته می‌شوند، استفاده شود.)" #: ../../tutorial/classes.rst:496 msgid "" @@ -791,6 +1056,11 @@ msgid "" "without affecting the validity of the methods, as long as name conflicts are " "avoided --- again, a naming convention can save a lot of headaches here." msgstr "" +"کاربران (clients) باید با احتیاط از ویژگی‌های داده استفاده کنند --- کاربران ممکن است " +"ناورداهای حفظ‌شده توسط متدها را با دستکاری در ویژگی‌های داده‌شان به هم بریزند. " +"توجه داشته باشید که کاربران ممکن است ویژگی‌های داده‌ی خود را به یک شیء نمونه اضافه کنند " +"بدون اینکه بر صحت متدها تأثیر بگذارند، تا زمانی که تداخل نام‌ها " +"اجتناب شود --- باز هم، یک قرارداد نام‌گذاری می‌تواند از بسیاری از سردرگمی‌ها در اینجا جلوگیری کند." #: ../../tutorial/classes.rst:502 msgid "" @@ -799,6 +1069,10 @@ msgid "" "methods: there is no chance of confusing local variables and instance " "variables when glancing through a method." msgstr "" +"هیچ گونه میان‌بری برای ارجاع به ویژگی‌های داده (یا سایر متدها!) " +"از درون متدها وجود ندارد. به نظر من، این موضوع در واقع خوانایی " +"متدها را افزایش می‌دهد: هیچ شانسی برای اشتباه گرفتن متغیرهای محلی و متغیرهای " +"نمونه هنگام مرور سریع یک متد وجود ندارد." #: ../../tutorial/classes.rst:507 msgid "" @@ -809,6 +1083,12 @@ msgid "" "that a *class browser* program might be written that relies upon such a " "convention." msgstr "" +"معمولاً، اولین آرگومان یک متد ``self`` نامیده می‌شود. این " +"چیزی بیش از یک قرارداد نیست: نام ``self`` هیچ معنی خاصی " +"برای پایتون ندارد. با این حال، توجه داشته باشید که با رعایت نکردن این قرارداد، کد شما " +"ممکن است برای سایر برنامه‌نویسان پایتون کمتر خوانا باشد، و همچنین قابل‌تصور است " +"که یک برنامه *مرورگر کلاس* (class browser) نوشته شود که به چنین " +"قراردادی وابسته باشد." #: ../../tutorial/classes.rst:513 msgid "" @@ -817,6 +1097,10 @@ msgid "" "textually enclosed in the class definition: assigning a function object to a " "local variable in the class is also ok. For example::" msgstr "" +"هر شیء تابعی که یک ویژگی کلاس باشد، یک متد برای نمونه‌های " +"آن کلاس تعریف می‌کند. لازم نیست که تعریف تابع " +"لزوماً درون تعریف کلاس قرار داشته باشد: اختصاص یک شیء تابع به یک " +"متغیر محلی در کلاس نیز مجاز است. برای مثال::" #: ../../tutorial/classes.rst:518 msgid "" @@ -832,6 +1116,17 @@ msgid "" "\n" " h = g" msgstr "" +"# Function defined outside the class\n" +"def f1(self, x, y):\n" +" return min(x, x+y)\n" +"\n" +"class C:\n" +" f = f1\n" +"\n" +" def g(self):\n" +" return 'hello world'\n" +"\n" +" h = g" #: ../../tutorial/classes.rst:530 msgid "" @@ -840,12 +1135,18 @@ msgid "" "instances of :class:`!C` --- ``h`` being exactly equivalent to ``g``. Note " "that this practice usually only serves to confuse the reader of a program." msgstr "" +"اکنون ``f``، ``g`` و ``h`` همگی ویژگی‌های کلاس :class:`!C` هستند که " +"به اشیاء تابع اشاره دارند، و در نتیجه همگی متدهایی از " +"نمونه‌های :class:`!C` هستند --- ``h`` دقیقاً معادل ``g`` است. توجه " +"داشته باشید که این روش معمولاً فقط باعث سردرگمی خواننده‌ی برنامه می‌شود." #: ../../tutorial/classes.rst:535 msgid "" "Methods may call other methods by using method attributes of the ``self`` " "argument::" msgstr "" +"متدها می‌توانند سایر متدها را با استفاده از ویژگی‌های متد آرگومان ``self`` " +"فراخوانی کنند::" #: ../../tutorial/classes.rst:538 msgid "" @@ -860,6 +1161,16 @@ msgid "" " self.add(x)\n" " self.add(x)" msgstr "" +"class Bag:\n" +" def __init__(self):\n" +" self.data = []\n" +"\n" +" def add(self, x):\n" +" self.data.append(x)\n" +"\n" +" def addtwice(self, x):\n" +" self.add(x)\n" +" self.add(x)" #: ../../tutorial/classes.rst:549 msgid "" @@ -873,16 +1184,27 @@ msgid "" "itself defined in this global scope, and in the next section we'll find some " "good reasons why a method would want to reference its own class." msgstr "" +"متدها ممکن است به نام‌های سراسری به همان روشی که توابع معمولی اشاره می‌کنند، ارجاع دهند. " +"محدوده‌ی سراسری مرتبط با یک متد، ماژولی است که شامل " +"تعریف آن است. (یک کلاس هرگز به عنوان محدوده‌ی سراسری استفاده نمی‌شود.) اگرچه به ندرت " +"دلیل خوبی برای استفاده از داده‌های سراسری در یک متد یافت می‌شود، اما کاربردهای " +"مشروع زیادی برای محدوده‌ی سراسری وجود دارد: برای یک چیز، توابع و ماژول‌هایی " +"که به محدوده‌ی سراسری ایمپورت شده‌اند، می‌توانند توسط متدها استفاده شوند، همچنین توابع " +"و کلاس‌های تعریف‌شده در آن. معمولاً، کلاسی که شامل متد است، " +"خود در این محدوده‌ی سراسری تعریف می‌شود، و در بخش بعدی دلایل خوبی " +"خواهیم یافت که چرا یک متد ممکن است بخواهد به کلاس خودش ارجاع دهد." #: ../../tutorial/classes.rst:559 msgid "" "Each value is an object, and therefore has a *class* (also called its " "*type*). It is stored as ``object.__class__``." msgstr "" +"هر مقدار یک شیء است، و بنابراین دارای یک *کلاس* (که به آن " +"*تایپ* نیز گفته می‌شود) می‌باشد. این مقدار به‌صورت ``object.__class__`` ذخیره می‌شود." #: ../../tutorial/classes.rst:566 msgid "Inheritance" -msgstr "" +msgstr "ارث‌بری" #: ../../tutorial/classes.rst:568 msgid "" @@ -890,6 +1212,9 @@ msgid "" "without supporting inheritance. The syntax for a derived class definition " "looks like this::" msgstr "" +"مسلماً، یک ویژگی زبانی بدون پشتیبانی از ارث‌بری، شایسته‌ی نام «کلاس» " +"نخواهد بود. نحو تعریف یک کلاس مشتق‌شده (derived class) " +"به این شکل است::" #: ../../tutorial/classes.rst:572 msgid "" @@ -900,6 +1225,12 @@ msgid "" " .\n" " " msgstr "" +"class DerivedClassName(BaseClassName):\n" +" \n" +" .\n" +" .\n" +" .\n" +" " #: ../../tutorial/classes.rst:579 msgid "" @@ -908,10 +1239,14 @@ msgid "" "class name, other arbitrary expressions are also allowed. This can be " "useful, for example, when the base class is defined in another module::" msgstr "" +"نام :class:`!BaseClassName` باید در فضای نامی تعریف شده باشد که از " +"محدوده‌ای که شامل تعریف کلاس مشتق‌شده است، قابل دسترسی باشد. به جای نام " +"کلاس پایه، سایر عبارت‌های دلخواه نیز مجاز هستند. این " +"می‌تواند مفید باشد، برای مثال، زمانی که کلاس پایه در ماژول دیگری تعریف شده است::" #: ../../tutorial/classes.rst:585 msgid "class DerivedClassName(modname.BaseClassName):" -msgstr "" +msgstr "class DerivedClassName(modname.BaseClassName):" #: ../../tutorial/classes.rst:587 msgid "" @@ -922,6 +1257,12 @@ msgid "" "rule is applied recursively if the base class itself is derived from some " "other class." msgstr "" +"اجرای تعریف یک کلاس مشتق‌شده به همان شیوه‌ای است که برای یک کلاس " +"پایه انجام می‌شود. هنگامی که شیء کلاس ساخته می‌شود، کلاس پایه به خاطر سپرده می‌شود. " +"این (اطلاعات) برای حل کردن ارجاعات به ویژگی‌ها استفاده می‌شود: اگر ویژگی درخواستی " +"در کلاس یافت نشود، جستجو در کلاس پایه ادامه می‌یابد. این " +"قاعده به‌صورت بازگشتی اعمال می‌شود اگر خود کلاس پایه از کلاس " +"دیگری مشتق شده باشد." #: ../../tutorial/classes.rst:593 msgid "" @@ -931,6 +1272,11 @@ msgid "" "searched, descending down the chain of base classes if necessary, and the " "method reference is valid if this yields a function object." msgstr "" +"هیچ نکته‌ی خاصی درباره‌ی نمونه‌سازی کلاس‌های مشتق‌شده وجود ندارد: " +"``DerivedClassName()`` یک نمونه‌ی جدید از کلاس ایجاد می‌کند. ارجاع‌های متد " +"به‌صورت زیر حل می‌شوند: ویژگی کلاس متناظر " +"جستجو می‌شود، در صورت لزوم در زنجیره‌ی کلاس‌های پایه به پایین می‌رود، و " +"ارجاع متد در صورتی معتبر است که این جستجو به یک شیء تابع منجر شود." #: ../../tutorial/classes.rst:599 msgid "" @@ -940,6 +1286,11 @@ msgid "" "class may end up calling a method of a derived class that overrides it. " "(For C++ programmers: all methods in Python are effectively ``virtual``.)" msgstr "" +"کلاس‌های مشتق‌شده ممکن است متدهای کلاس‌های پایه‌ی خود را بازنویسی کنند. از آنجایی که متدها " +"هنگام فراخوانی سایر متدهای همان شیء، امتیاز ویژه‌ای ندارند، یک " +"متد از یک کلاس پایه که متد دیگری را که در همان کلاس پایه تعریف شده فراخوانی می‌کند، ممکن است " +"در نهایت متدی از یک کلاس مشتق‌شده را فراخوانی کند که آن را بازنویسی کرده است. " +"(برای برنامه‌نویسان C++: تمام متدها در پایتون به‌طور مؤثر ``virtual`` هستند.)" #: ../../tutorial/classes.rst:605 msgid "" @@ -950,10 +1301,16 @@ msgid "" "to clients as well. (Note that this only works if the base class is " "accessible as ``BaseClassName`` in the global scope.)" msgstr "" +"یک متد بازنویسی‌شده در یک کلاس مشتق‌شده ممکن است در واقع بخواهد به جای " +"اینکه صرفاً متد کلاس پایه را با همین نام جایگزین کند، آن را گسترش دهد. یک " +"راه ساده برای فراخوانی مستقیم متد کلاس پایه وجود دارد: فقط " +"``BaseClassName.methodname(self, arguments)`` را فراخوانی کنید. این روش گاهی برای " +"کاربران (clients) نیز مفید است. (توجه داشته باشید که این روش تنها زمانی کار می‌کند که کلاس پایه " +"به عنوان ``BaseClassName`` در محدوده‌ی سراسری (global scope) قابل دسترسی باشد.)" #: ../../tutorial/classes.rst:612 msgid "Python has two built-in functions that work with inheritance:" -msgstr "" +msgstr "پایتون دو تابع داخلی دارد که با ارث‌بری کار می‌کنند:" #: ../../tutorial/classes.rst:614 msgid "" @@ -961,6 +1318,9 @@ msgid "" "will be ``True`` only if ``obj.__class__`` is :class:`int` or some class " "derived from :class:`int`." msgstr "" +"برای بررسی نوع یک نمونه (instance) از :func:`isinstance` استفاده کنید: ``isinstance(obj, int)`` " +"تنها زمانی ``True`` خواهد بود که ``obj.__class__`` از نوع :class:`int` باشد یا کلاسی " +"که از :class:`int` مشتق شده باشد." #: ../../tutorial/classes.rst:618 msgid "" @@ -969,16 +1329,22 @@ msgid "" "``issubclass(float, int)`` is ``False`` since :class:`float` is not a " "subclass of :class:`int`." msgstr "" +"برای بررسی ارث‌بری کلاس‌ها از :func:`issubclass` استفاده کنید: ``issubclass(bool, int)`` " +"مقدار ``True`` است چون :class:`bool` زیرکلاسی از :class:`int` است. با این حال، " +"``issubclass(float, int)`` مقدار ``False`` است چون :class:`float` زیرکلاسی از " +":class:`int` نیست." #: ../../tutorial/classes.rst:628 msgid "Multiple Inheritance" -msgstr "" +msgstr "ارث‌بری چندگانه" #: ../../tutorial/classes.rst:630 msgid "" "Python supports a form of multiple inheritance as well. A class definition " "with multiple base classes looks like this::" msgstr "" +"پایتون همچنین از نوعی ارث‌بری چندگانه پشتیبانی می‌کند. تعریف یک کلاس " +"با چندین کلاس پایه به این شکل است::" #: ../../tutorial/classes.rst:633 msgid "" @@ -989,6 +1355,12 @@ msgid "" " .\n" " " msgstr "" +"class DerivedClassName(Base1, Base2, Base3):\n" +" \n" +" .\n" +" .\n" +" .\n" +" " #: ../../tutorial/classes.rst:640 msgid "" @@ -1000,6 +1372,13 @@ msgid "" "classes of :class:`!Base1`, and if it was not found there, it was searched " "for in :class:`!Base2`, and so on." msgstr "" +"برای بیشتر کاربردها، در ساده‌ترین موارد، می‌توانید جستجو برای " +"ویژگی‌های به‌ارث‌برده‌شده از یک کلاس والد را به‌صورت عمق‌اول، چپ‌به‌راست، " +"بدون جستجوی دوباره در همان کلاس در جایی که همپوشانی در سلسله‌مراتب وجود دارد، " +"در نظر بگیرید. بنابراین، اگر ویژگی‌ای در :class:`!DerivedClassName` یافت نشد، " +"در :class:`!Base1` جستجو می‌شود، سپس (به‌صورت بازگشتی) در کلاس‌های پایه‌ی " +":class:`!Base1`، و اگر در آنجا یافت نشد، در " +":class:`!Base2` جستجو می‌شود، و به همین ترتیب." #: ../../tutorial/classes.rst:647 msgid "" @@ -1009,6 +1388,11 @@ msgid "" "method and is more powerful than the super call found in single-inheritance " "languages." msgstr "" +"در واقع، این موضوع کمی پیچیده‌تر از این است؛ ترتیب حل متد " +"به‌صورت پویا تغییر می‌کند تا از فراخوانی‌های مشارکتی به :func:`super` پشتیبانی کند. این " +"رویکرد در برخی دیگر از زبان‌های دارای ارث‌بری چندگانه با نام call-next-" +"method شناخته می‌شود و از فراخوانی super موجود در زبان‌های دارای ارث‌بری تکی " +"قدرتمندتر است." #: ../../tutorial/classes.rst:653 msgid "" @@ -1025,10 +1409,22 @@ msgid "" "properties make it possible to design reliable and extensible classes with " "multiple inheritance. For more detail, see :ref:`python_2.3_mro`." msgstr "" +"ترتیب‌دهی پویا ضروری است زیرا همه‌ی موارد ارث‌بری چندگانه " +"دارای یک یا چند رابطه‌ی الماسی هستند (جایی که حداقل یکی از کلاس‌های " +"والد از طریق چندین مسیر از پایین‌ترین کلاس قابل دسترسی است). " +"برای مثال، همه‌ی کلاس‌ها از :class:`object` ارث‌بری می‌کنند، بنابراین هر موردی از " +"ارث‌بری چندگانه بیش از یک مسیر برای رسیدن به :class:`object` فراهم می‌کند. " +"برای جلوگیری از دسترسی بیش از یک بار به کلاس‌های پایه، الگوریتم پویا " +"ترتیب جستجو را به‌گونه‌ای خطی‌سازی می‌کند که ترتیب چپ‌به‌راست " +"مشخص‌شده در هر کلاس را حفظ کند، که هر والد را فقط یک بار فراخوانی می‌کند، " +"و یکنواخت است (به این معنی که یک کلاس می‌تواند زیرکلاس‌ داشته باشد بدون " +"اینکه بر ترتیب اولویت والدین آن تأثیر بگذارد). این ویژگی‌ها در کنار هم، " +"طراحی کلاس‌های قابل اعتماد و قابل توسعه با " +"ارث‌بری چندگانه را ممکن می‌سازند. برای جزئیات بیشتر، به :ref:`python_2.3_mro` مراجعه کنید." #: ../../tutorial/classes.rst:670 msgid "Private Variables" -msgstr "" +msgstr "متغیر‌های خصوصی" #: ../../tutorial/classes.rst:672 msgid "" @@ -1039,6 +1435,12 @@ msgid "" "a function, a method or a data member). It should be considered an " "implementation detail and subject to change without notice." msgstr "" +"متغیرهای نمونه‌ای «خصوصی» که جز از درون یک " +"شیء قابل دسترسی نیستند، در پایتون وجود ندارند. با این حال، یک قرارداد وجود دارد که " +"توسط بیشتر کدهای پایتون دنبال می‌شود: یک نام که با زیرخط آغاز می‌شود (مثلاً " +"``_spam``) باید به عنوان بخشی غیرعمومی از API در نظر گرفته شود (خواه " +"یک تابع، یک متد یا یک عضو داده باشد). باید به عنوان یک " +"جزئیات پیاده‌سازی در نظر گرفته شود و ممکن است بدون اطلاع‌رسانی تغییر کند." #: ../../tutorial/classes.rst:682 msgid "" @@ -1051,18 +1453,30 @@ msgid "" "stripped. This mangling is done without regard to the syntactic position of " "the identifier, as long as it occurs within the definition of a class." msgstr "" +"از آنجا که یک مورد استفاده‌ی معتبر برای اعضای خصوصی کلاس وجود دارد (به‌ویژه برای جلوگیری از " +"برخورد نام‌ها با نام‌های تعریف‌شده توسط زیرکلاس‌ها)، پشتیبانی محدودی " +"برای چنین مکانیزمی، به نام :dfn:`name mangling` (دستکاری نام) وجود دارد. هر شناسه‌ای " +"به شکل ``__spam`` (حداقل دو زیرخط در ابتدا، حداکثر یک " +"زیرخط در انتها) به‌صورت متنی با ``_classname__spam`` جایگزین می‌شود، که در آن " +"``classname`` نام کلاس جاری است با زیرخط‌های ابتدایی " +"حذف‌شده. این دستکاری بدون در نظر گرفتن جایگاه نحوی " +"شناسه انجام می‌شود، تا زمانی که درون تعریف یک کلاس رخ دهد." #: ../../tutorial/classes.rst:693 msgid "" "The :ref:`private name mangling specifications ` for " "details and special cases." msgstr "" +"برای جزئیات و موارد خاص، به :ref:`مشخصات دستکاری نام‌های خصوصی ` " +"مراجعه کنید." #: ../../tutorial/classes.rst:696 msgid "" "Name mangling is helpful for letting subclasses override methods without " "breaking intraclass method calls. For example::" msgstr "" +"دستکاری نام برای این مفید است که به زیرکلاس‌ها اجازه دهد متدها را بدون " +"شکستن فراخوانی‌های متد درون‌کلاسی بازنویسی کنند. برای مثال::" #: ../../tutorial/classes.rst:699 msgid "" @@ -1085,6 +1499,24 @@ msgid "" " for item in zip(keys, values):\n" " self.items_list.append(item)" msgstr "" +"class Mapping:\n" +" def __init__(self, iterable):\n" +" self.items_list = []\n" +" self.__update(iterable)\n" +"\n" +" def update(self, iterable):\n" +" for item in iterable:\n" +" self.items_list.append(item)\n" +"\n" +" __update = update # private copy of original update() method\n" +"\n" +"class MappingSubclass(Mapping):\n" +"\n" +" def update(self, keys, values):\n" +" # provides new signature for update()\n" +" # but does not break __init__()\n" +" for item in zip(keys, values):\n" +" self.items_list.append(item)" #: ../../tutorial/classes.rst:718 msgid "" @@ -1093,6 +1525,10 @@ msgid "" "the ``Mapping`` class and ``_MappingSubclass__update`` in the " "``MappingSubclass`` class respectively." msgstr "" +"مثال بالا حتی اگر ``MappingSubclass`` یک شناسه‌ی " +"``__update`` معرفی کند، کار خواهد کرد زیرا این شناسه به ترتیب در کلاس " +"``Mapping`` با ``_Mapping__update`` و در کلاس " +"``MappingSubclass`` با ``_MappingSubclass__update`` جایگزین می‌شود." #: ../../tutorial/classes.rst:723 msgid "" @@ -1101,6 +1537,10 @@ msgid "" "private. This can even be useful in special circumstances, such as in the " "debugger." msgstr "" +"توجه داشته باشید که قوانین دستکاری نام بیشتر برای جلوگیری از اشتباهات طراحی شده‌اند؛ همچنان " +"دسترسی یا تغییر یک متغیر که خصوصی در نظر گرفته می‌شود، " +"ممکن است. این حتی می‌تواند در شرایط خاص، مانند " +"اشکال‌زدایی، مفید باشد." #: ../../tutorial/classes.rst:727 msgid "" @@ -1111,10 +1551,16 @@ msgid "" "applies to ``getattr()``, ``setattr()`` and ``delattr()``, as well as when " "referencing ``__dict__`` directly." msgstr "" +"توجه داشته باشید که کد ارسال‌شده به ``exec()`` یا ``eval()`` نام کلاس " +"کلاس فراخوان‌کننده را به عنوان کلاس جاری در نظر نمی‌گیرد؛ این مشابه " +"تأثیر دستور ``global`` است که تأثیر آن نیز به همین ترتیب " +"به کدی که با هم بایت‌کامپایل می‌شوند، محدود است. همین محدودیت " +"برای ``getattr()``، ``setattr()`` و ``delattr()`` نیز اعمال می‌شود، همچنین زمانی که " +"به طور مستقیم به ``__dict__`` ارجاع داده می‌شود." #: ../../tutorial/classes.rst:738 msgid "Odds and Ends" -msgstr "" +msgstr "نکات متفرقه" #: ../../tutorial/classes.rst:740 msgid "" @@ -1122,6 +1568,9 @@ msgid "" "or C \"struct\", bundling together a few named data items. The idiomatic " "approach is to use :mod:`dataclasses` for this purpose::" msgstr "" +"گاهی اوقات داشتن یک نوع داده مشابه «رکورد» در پاسکال یا " +"«ساختار» در C مفید است، که چندین آیتم داده‌ی نام‌دار را کنار هم بسته‌بندی می‌کند. روش استاندارد " +"برای این کار استفاده از :mod:`dataclasses` است::" #: ../../tutorial/classes.rst:744 msgid "" @@ -1133,6 +1582,13 @@ msgid "" " dept: str\n" " salary: int" msgstr "" +"from dataclasses import dataclass\n" +"\n" +"@dataclass\n" +"class Employee:\n" +" name: str\n" +" dept: str\n" +" salary: int" #: ../../tutorial/classes.rst:754 msgid "" @@ -1142,6 +1598,11 @@ msgid "" ">>> john.salary\n" "1000" msgstr "" +">>> john = Employee('john', 'computer lab', 1000)\n" +">>> john.dept\n" +"'computer lab'\n" +">>> john.salary\n" +"1000" #: ../../tutorial/classes.rst:760 msgid "" @@ -1152,6 +1613,12 @@ msgid "" "and :meth:`~io.TextIOBase.readline` that get the data from a string buffer " "instead, and pass it as an argument." msgstr "" +"یک قطعه کد پایتون که انتظار یک نوع دادهٔ انتزاعی خاص را دارد، اغلب " +"می‌تواند به جای آن، یک کلاس دریافت کند که متدهای آن نوع داده را شبیه‌سازی می‌کند. " +"برای مثال، اگر تابعی دارید که داده‌هایی را از یک شیء فایل قالب‌بندی می‌کند، " +"می‌توانید کلاسی تعریف کنید با متدهای :meth:`~io.TextIOBase.read` " +"و :meth:`~io.TextIOBase.readline` که داده‌ها را از یک بافر رشته‌ای دریافت می‌کنند، " +"و آن را به عنوان آرگومان به تابع ارسال کنید." #: ../../tutorial/classes.rst:772 msgid "" @@ -1160,16 +1627,22 @@ msgid "" "method :meth:`!m`, and :attr:`m.__func__ ` is " "the :ref:`function object ` corresponding to the method." msgstr "" +":ref:`اشیاء متد نمونه ` نیز ویژگی‌هایی دارند: " +":attr:`m.__self__ ` شیء نمونه‌ای است که متد :meth:`!m` " +"به آن تعلق دارد، و :attr:`m.__func__ ` همان " +":ref:`شیء تابع ` متناظر با آن متد است." #: ../../tutorial/classes.rst:782 msgid "Iterators" -msgstr "" +msgstr "تکرارگرها" #: ../../tutorial/classes.rst:784 msgid "" "By now you have probably noticed that most container objects can be looped " "over using a :keyword:`for` statement::" msgstr "" +"تا اینجا احتمالاً متوجه شده‌اید که می‌توان روی بیشتر اشیاء ظرف با استفاده از " +"دستور :keyword:`for` حلقه زد::" #: ../../tutorial/classes.rst:787 msgid "" @@ -1184,6 +1657,16 @@ msgid "" "for line in open(\"myfile.txt\"):\n" " print(line, end='')" msgstr "" +"for element in [1, 2, 3]:\n" +" print(element)\n" +"for element in (1, 2, 3):\n" +" print(element)\n" +"for key in {'one':1, 'two':2}:\n" +" print(key)\n" +"for char in \"123\":\n" +" print(char)\n" +"for line in open(\"myfile.txt\"):\n" +" print(line, end='')" #: ../../tutorial/classes.rst:798 msgid "" @@ -1197,6 +1680,15 @@ msgid "" "to terminate. You can call the :meth:`~iterator.__next__` method using " "the :func:`next` built-in function; this example shows how it all works::" msgstr "" +"این سبک دسترسی واضح، مختصر و راحت است. استفاده از " +"تکرارگرها در همه‌جا نفوذ کرده و پایتون را یکپارچه می‌کنند. در پشت صحنه، " +"دستور :keyword:`for` تابع :func:`iter` را روی شیء ظرف فراخوانی می‌کند. " +"این تابع یک شیء تکرارگر برمی‌گرداند که " +"متد :meth:`~iterator.__next__` را تعریف می‌کند که به المان‌ها در ظرف " +"یکی یکی دسترسی پیدا می‌کند. وقتی المان‌ها تمام شوند، :meth:`~iterator.__next__` " +"یک استثنای :exc:`StopIteration` ایجاد می‌کند که به حلقه‌ی :keyword:`!for` می‌گوید " +"پایان یابد. می‌توانید متد :meth:`~iterator.__next__` را با استفاده از " +"تابع داخلی :func:`next` فراخوانی کنید؛ این مثال نشان می‌دهد که چگونه همه‌چیز کار می‌کند::" #: ../../tutorial/classes.rst:807 msgid "" @@ -1216,6 +1708,21 @@ msgid "" " next(it)\n" "StopIteration" msgstr "" +">>> s = 'abc'\n" +">>> it = iter(s)\n" +">>> it\n" +"\n" +">>> next(it)\n" +"'a'\n" +">>> next(it)\n" +"'b'\n" +">>> next(it)\n" +"'c'\n" +">>> next(it)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" next(it)\n" +"StopIteration" #: ../../tutorial/classes.rst:823 msgid "" @@ -1225,6 +1732,11 @@ msgid "" "the class defines :meth:`!__next__`, then :meth:`!__iter__` can just return " "``self``::" msgstr "" +"حالا که با سازوکار پشت پروتکل تکرارگر آشنا شدید، اضافه کردن " +"رفتار تکرارگر به کلاس‌هایتان آسان است. یک متد :meth:`~container.__iter__` تعریف کنید " +"که یک شیء با متد :meth:`~iterator.__next__` برمی‌گرداند. اگر " +"کلاس :meth:`!__next__` را تعریف کرده باشد، آنگاه :meth:`!__iter__` می‌تواند فقط " +"``self`` را برگرداند::" #: ../../tutorial/classes.rst:828 msgid "" @@ -1243,6 +1755,20 @@ msgid "" " self.index = self.index - 1\n" " return self.data[self.index]" msgstr "" +"class Reverse:\n" +" \"\"\"Iterator for looping over a sequence backwards.\"\"\"\n" +" def __init__(self, data):\n" +" self.data = data\n" +" self.index = len(data)\n" +"\n" +" def __iter__(self):\n" +" return self\n" +"\n" +" def __next__(self):\n" +" if self.index == 0:\n" +" raise StopIteration\n" +" self.index = self.index - 1\n" +" return self.data[self.index]" #: ../../tutorial/classes.rst:845 msgid "" @@ -1257,10 +1783,20 @@ msgid "" "p\n" "s" msgstr "" +">>> rev = Reverse('spam')\n" +">>> iter(rev)\n" +"<__main__.Reverse object at 0x00A1DB50>\n" +">>> for char in rev:\n" +"... print(char)\n" +"...\n" +"m\n" +"a\n" +"p\n" +"s" #: ../../tutorial/classes.rst:860 msgid "Generators" -msgstr "" +msgstr "تولیدکننده‌ها" #: ../../tutorial/classes.rst:862 msgid "" @@ -1272,12 +1808,12 @@ msgid "" "An example shows that generators can be trivially easy to create::" msgstr "" ":term:`Generators ` یک ابزار ساده و قدرتمند برای ایجاد " -"اینتراتورها هستند. آنها مانند توابع عادی نوشته می شوند اما هر زمان که می " -"خواهند داده ای را بازگردانند از دستور :keyword:`yield` استفاده می کنند. هر " -"بار که :func:`next` بر روی آن فراخوانی می شود، مولد از جایی که متوقف شده " -"ادامه می یابد (تمام مقادیر داده ها و اینکه آخرین دستور اجرا شده چه بوده را " -"به خاطر می آورد). یک مثال نشان می دهد که ایجاد مولدها می تواند به طرز " -"باورنکردنی ساده باشد::" +"اینتراتور‌ها هستند. آن‌ها مانند توابع عادی نوشته می‌شوند اما هر زمان که می‌خواهند " +"داده‌ای را بازگردانند از دستور :keyword:`yield` استفاده می‌کنند. هر " +"بار که :func:`next` بر روی آن فراخوانی می‌شود، مولد از جایی که متوقف شده " +"ادامه می‌یابد (تمام مقادیر داده‌ها و اینکه آخرین دستور اجرا شده چه بوده را " +"به خاطر می‌آورد). یک مثال نشان می‌دهد که ایجاد مولد‌ها می‌تواند به طرز " +"باور‌نکردنی ساده باشد::" #: ../../tutorial/classes.rst:869 msgid "" @@ -1314,11 +1850,11 @@ msgid "" "compact is that the :meth:`~iterator.__iter__` " "and :meth:`~generator.__next__` methods are created automatically." msgstr "" -"هر چیزی که با تولیدکننده ها (generators) قابل انجام است، می تواند با استفاده " -"از تکرارگرهای مبتنی بر کلاس نیز انجام شود، همانطور که در بخش قبلی توضیح داده " -"شد. آنچه تولیدکننده ها را فشرده می کند، این است که روش " -"های :meth:`~iterator.__iter__` و :meth:`~generator.__next__` به طور خودکار " -"ایجاد می شوند." +"هر چیزی که با تولیدکننده‌ها قابل انجام است، می‌تواند با استفاده " +"از تکرارگر‌های مبتنی بر کلاس نیز انجام شود، همانطور که در بخش قبلی توضیح داده " +"شد. آنچه تولیدکننده‌ها را فشرده می‌کند، این است که روش‌های " +":meth:`~iterator.__iter__` و :meth:`~generator.__next__` به‌طور خودکار " +"ایجاد می‌شوند." #: ../../tutorial/classes.rst:888 msgid "" @@ -1327,10 +1863,10 @@ msgid "" "and much more clear than an approach using instance variables like " "``self.index`` and ``self.data``." msgstr "" -"یکی دیگر از ویژگی های کلیدی این است که متغیرهای محلی و وضعیت اجرا به طور " -"خودکار بین فراخوانی ها ذخیره می شوند. این امر نوشتن تابع را آسان تر و خیلی " -"واضح تر از رویکردی که از متغیرهای نمونه ای مانند ``self.index`` و " -"``self.data`` استفاده می کند، کرده است." +"یکی دیگر از ویژگی‌های کلیدی این است که متغیر‌های محلی و وضعیت اجرا به‌طور " +"خودکار بین فراخوانی‌ها ذخیره می‌شوند. این امر نوشتن تابع را آسان‌تر و خیلی " +"واضح‌تر از رویکردی که از متغیر‌های نمونه‌ای مانند ``self.index`` و " +"``self.data`` استفاده می‌کند، کرده است." #: ../../tutorial/classes.rst:893 msgid "" @@ -1339,14 +1875,14 @@ msgid "" "combination, these features make it easy to create iterators with no more " "effort than writing a regular function." msgstr "" -"علاوه بر ایجاد خودکار متدها و ذخیره سازی وضعیت برنامه، زمانی که جنراتورها " -"خاتمه می یابند، به طور خودکار :exc:`StopIteration` را ایجاد می کنند. این " -"ویژگی ها به صورت ترکیبی، ساختن تکرارگرها را به همان سادگی نوشتن یک تابع عادی " -"امکان پذیر می سازند." +"علاوه بر ایجاد خودکار متد‌ها و ذخیره سازی وضعیت برنامه، زمانی که تولیدکننده‌ها " +"خاتمه می‌یابند، به‌طور خودکار :exc:`StopIteration` را ایجاد می‌کنند. این " +"ویژگی‌ها به صورت ترکیبی، ساختن تکرارگر‌ها را به همان سادگی نوشتن یک تابع عادی " +"امکان پذیر می‌سازند." #: ../../tutorial/classes.rst:902 msgid "Generator Expressions" -msgstr "" +msgstr "عبارات تولیدکننده" #: ../../tutorial/classes.rst:904 msgid "" @@ -1357,10 +1893,16 @@ msgid "" "compact but less versatile than full generator definitions and tend to be " "more memory friendly than equivalent list comprehensions." msgstr "" +"برخی از تولیدکننده‌های ساده را می‌توان به‌صورت مختصر به عنوان عبارت کدنویسی کرد، با استفاده از یک نحو " +"مشابه درک‌لیست‌ها اما با پرانتز به جای کروشه‌ی " +"باز. این عبارت‌ها برای شرایطی طراحی شده‌اند که تولیدکننده " +"بلافاصله توسط یک تابع محاط‌شونده استفاده می‌شود. عبارت‌های تولیدکننده فشرده‌تر " +"هستند اما نسبت به تعاریف کامل تولیدکننده، انعطاف‌پذیری کمتری دارند و معمولاً " +"نسبت به درک‌لیست‌های معادل، با حافظه سازگارتر هستند." #: ../../tutorial/classes.rst:911 msgid "Examples::" -msgstr "" +msgstr "مثال‌ها" #: ../../tutorial/classes.rst:913 msgid "" @@ -1381,10 +1923,26 @@ msgid "" ">>> list(data[i] for i in range(len(data)-1, -1, -1))\n" "['f', 'l', 'o', 'g']" msgstr "" +">>> sum(i*i for i in range(10)) # sum of squares\n" +"285\n" +"\n" +">>> xvec = [10, 20, 30]\n" +">>> yvec = [7, 5, 3]\n" +">>> sum(x*y for x,y in zip(xvec, yvec)) # dot product\n" +"260\n" +"\n" +">>> unique_words = set(word for line in page for word in line.split())\n" +"\n" +">>> valedictorian = max((student.gpa, student.name) for student in " +"graduates)\n" +"\n" +">>> data = 'golf'\n" +">>> list(data[i] for i in range(len(data)-1, -1, -1))\n" +"['f', 'l', 'o', 'g']" #: ../../tutorial/classes.rst:932 msgid "Footnotes" -msgstr "" +msgstr "پا‌ورقی‌ها" #: ../../tutorial/classes.rst:933 msgid "" @@ -1395,19 +1953,25 @@ msgid "" "namespace implementation, and should be restricted to things like post-" "mortem debuggers." msgstr "" +"به جز یک مورد. اشیاء ماژول یک ویژگی مخفی فقط‌خواندنی دارند " +"به نام :attr:`~object.__dict__` که دیکشنری مورد استفاده برای " +"پیاده‌سازی فضای نام ماژول را برمی‌گرداند؛ نام ``__dict__`` یک ویژگی است اما " +"یک نام سراسری نیست. بدیهی است که استفاده از این ویژگی، انتزاع " +"پیاده‌سازی فضای نام را نقض می‌کند و باید به مواردی مانند " +"اشکال‌زدای پس‌ازمرگ محدود شود." #: ../../tutorial/classes.rst:343 msgid "object" -msgstr "" +msgstr "شیء" #: ../../tutorial/classes.rst:343 msgid "method" -msgstr "" +msgstr "متد" #: ../../tutorial/classes.rst:679 msgid "name" -msgstr "" +msgstr "اسم" #: ../../tutorial/classes.rst:679 msgid "mangling" -msgstr "" +msgstr "دستکاری نام"