You are on page 1of 338

‫‪1.

 Introduction‬‬

‫‪.‬يصف هذا الدليل المرجعي لغة برمجة بايثون‪ .‬ال يقصد منه أن يكون تعليمي‬

‫بينما أحاول أن أكون دقي ًقا قدر اإلمكان ‪ ،‬اخترت استخدام اللغة اإلنجليزية بدالً من المواصفات الرسمية لكل شيء باستثناء بناء‬
‫الجملة والتحليل المعجمي‪  .‬هذا من شأنه أن يجعل المستند أكثر قابلية للفهم بالنسبة للقارئ العادي ‪ ،‬لكنه يترك مجااًل‬
‫من هذا المستند وحده ‪ ،‬فقد تضطر إلى تخمين األشياء ‪ Python‬للغموض‪ .‬وبالتالي ‪ ،‬إذا كنت قادمًا من المريخ وحاولت إعادة تطبيق‬
‫وتتساءل عن القواعد الدقيقة ‪ Python‬وفي الواقع ربما ينتهي بك األمر بتطبيق لغة مختلفة تمامًا‪ .‬من ناحية أخرى ‪ ،‬إذا كنت تستخدم‬
‫حول منطقة معينة من اللغة ‪ ،‬فيجب أن تكون قادرً ا بالتأكيد على العثور عليها هنا‪ .‬إذا كنت ترغب في رؤية تعريف أكثر رسمية للغة‬
‫‪ ، :-).‬فربما يمكنك التطوع بوقتك ‪ -‬أو ابتكار آلة استنساخ‬

‫من الخطر إضافة الكثير من تفاصيل التنفيذ إلى مستند مرجعي للغة ‪ -‬قد يتغير التطبيق ‪ ،‬وقد تعمل التطبيقات األخرى لنفس اللغة‬
‫الوحيد في االستخدام الواسع (على الرغم من استمرار التطبيقات ‪ Python‬هو تطبيق ‪ ، CPython‬بشكل مختلف‪ .‬من ناحية أخرى‬
‫البديلة في الحصول على الدعم) ‪ ،‬والمراوغات الخاصة به تستحق الذكر في بعض األحيان ‪ ،‬خاصة عندما يفرض التنفيذ قيو ًدا‬
‫‪.‬إضافية‪ .‬لذلك ‪ ،‬ستجد "مالحظات‪ L‬تنفيذية" قصيرة مبعثرة في جميع أنحاء النص‬

‫القياسية‪ . ‬يتم ذكر عدد ‪ Python‬مع عدد من الوحدات النمطية المضمنة والقياسية‪ .‬هذه موثقة في‪ ‬مكتبة ‪ Python‬يأتي كل تطبيق لـ‬
‫‪.‬قليل من الوحدات المدمجة عندما تتفاعل بطريقة مهمة مع تعريف اللغة‬

‫‪ ‬تطبيقات بديلة‪1.1 ‬‬

‫واحد وهو األكثر شيوعً ا إلى حد بعيد ‪ ،‬إال أن هناك بعض التطبيقات البديلة التي تهم بشكل ‪ Python‬على الرغم من وجود تطبيق‬
‫‪.‬خاص جماهير مختلفة‬

‫‪:‬تشمل التطبيقات المعروفة ما يلي‬

‫‪CPython‬‬

‫‪.‬تظهر ميزات اللغة الجديدة هنا أوالً ‪ C.‬هذا هو التطبيق األصلي واألكثر صيانة لبايثون ‪ ،‬والمكتوب بلغة‬

‫جايثون‬

‫أو يمكن استخدامه إلنشاء‪ L‬تطبيقات ‪ Java ،‬يمكن استخدام هذا التطبيق كلغة برمجة نصية لتطبيقات‪ Java. ‬في ‪ Python‬تم تنفيذ‬
‫يمكن العثور على مزيد من المعلومات ‪ Java. ‬وغالبًا ما يتم استخدامه أيضً ا إلنشاء اختبارات لمكتبات‪ Java. ‬باستخدام مكتبات‪ L‬فئة‬
‫‪ .‬اإللكتروني ‪ Jython‬على‪ ‬موقع‬

‫‪ .NET‬لـ ‪Python‬‬

‫‪ Brian‬متاحة‪ .‬تم إنشاؤه بواسطة ‪ .NET‬مُدار ويجعل مكتبات‪ .NET L‬ولكنه تطبيق ‪ CPython ،‬يستخدم هذا التطبيق في الواقع تطبيق‬
‫‪ .‬الرئيسية ‪ Python for .NET‬لمزيد من المعلومات ‪ ،‬راجع صفحة‪Lloyd. ‬‬

‫الحديد بايثون‬

‫‪ Python‬ويجمع تعليمات ‪ IL ،‬كاماًل يقوم بإنشاء ‪ Python‬يعد هذا تطبيق ‪ Python.NET ،‬بخالف‪ .NET. ‬بديلة لـ ‪ Python‬لغة‬
‫لمزيد من المعلومات ‪ Jython.  ،‬المبدع األصلي لـ ‪ Jim Hugunin ،‬تم إنشاؤه بواسطة‪ .NET. ‬البرمجية مباشر ًة إلى تجميعات‪L‬‬
‫‪ IronPython .‬راجع‪ ‬موقع ويب‬

‫‪PyPy‬‬

‫تنفيذ لبايثون مكتوب بالكامل بلغة بايثون‪  .‬وهو يدعم العديد من الميزات المتقدمة غير الموجودة في تطبيقات أخرى مثل دعم غير‬
‫يتمثل أحد أهداف المشروع في تشجيع التجريب مع اللغة نفسها من خالل تسهيل تعديل المترجم ‪ Just in Time. ‬مكدس ومترجم‬
‫‪ PyPy .‬الفوري (نظرً ا ألنه مكتوب بلغة بايثون)‪ .‬تتوفر معلومات إضافية على‪ ‬الصفحة الرئيسية لمشروع‬

‫‪Pg. 1‬‬
‫يختلف كل تطبيق من هذه التطبيقات بطريقة ما عن اللغة كما هو موثق في هذا الدليل ‪ ،‬أو يقدم معلومات محددة تتجاوز ما يتم تناوله‬
‫القياسية‪  .‬يرجى الرجوع إلى الوثائق الخاصة بالتنفيذ لتحديد األشياء األخرى التي تحتاج إلى معرفتها حول التنفيذ ‪ Python‬في وثائق‬
‫‪.‬المحدد الذي تستخدمه‬

‫‪1.2. Notation‬‬

‫‪:‬يستخدم هذا أسلوب التعريف التالي‪ BNF. ‬تستخدم أوصاف التحليل المعجمي وبناء الجملة تدوي ًنا نحويًا معدالً لـ‬

‫االسم‬ ‫* )"_" |‪:: = lc_letter( lc_letter‬‬

‫"أ" ‪" ...‬ض" = ‪lc_letter ::‬‬

‫بدوره أي من ‪ lc_letter‬الصورة وسفلية‪ .‬و‪ lc_letter‬تليها سلسلة من صفر أو أكثر‪ lc_letter‬هو‪ name‬يقول السطر األول أن‬


‫يتم االلتزام بهذه القاعدة في الواقع لألسماء المحددة في القواعد المعجمية والقواعدية في هذا (‪ 'z'. ‬من خالل'‪ 'a‬األحرف واحدة‬
‫)‪.‬المستند‬

‫تبدأ كل قاعدة باسم (وهو االسم الذي تحدده القاعدة) و‪ .=:: ‬شريط عمودي (‪ )| ‬يستخدم لفصل البدائل ؛‪ ‬إنه أقل عامل ملزم في هذا‬
‫الترميز‪ .‬النجمة (‪ )* ‬تعني صفرً ا أو أكثر من التكرار للعنصر السابق ؛‪ ‬وبالمثل ‪+ ،‬تعني‪ ‬عالمة الجمع (‪ ) ‬تكرارً ا واح ًدا أو أكثر ‪،‬‬
‫واحدا (بمعنى آخر ‪ ،‬العبارة المرفقة اختيارية)‪ .‬و‪ ‬و[‪+*] ‬ربط‬‫والعبارة الموضوعة بين قوسين مربعين (‪ ) ‬تعني صفرً ا أو‪ ‬تكرارً ا‪ً  ‬‬
‫المشغلين بإحكام قدر اإلمكان ؛‪ ‬تستخدم األقواس للتجميع‪ .‬يتم وضع السالسل الحرفية بين عالمتي اقتباس‪ .‬الفضاء األبيض له معنى‬
‫فقط لفصل الرموز‪ .‬عادة ما يتم احتواء القواعد في سطر واحد ؛‪ ‬يمكن تنسيق القواعد مع العديد من البدائل بدالً من ذلك مع كل سطر‬
‫‪.‬بعد البداية األولى بشريط عمودي‬

‫في التعريفات المعجمية (كما في المثال أعاله) ‪ ،‬يتم استخدام اصطالحين إضافيين‪ :‬حرفان حرفيان مفصوالن بثالث نقاط يعني‬
‫عبارة بين األقواس الزاوية (‪ )>...< ‬تعطي وص ًفا غير ‪ ASCII. ‬اختيار أي حرف واحد في النطاق المحدد (الشامل) من أحرف‬
‫‪.‬رسمي للرمز المحدد ؛‪  ‬على سبيل المثال ‪ ،‬يمكن استخدام هذا لوصف فكرة "شخصية التحكم" إذا لزم األمر‬

‫على الرغم من أن الترميز المستخدم هو نفسه تقريبًا ‪ ،‬إال أن هناك فر ًقا كبيرً ا بين معنى التعريفات المعجمية‪ L‬والنحوية‪ :‬يعمل التعريف‬
‫المعجمي على األحرف الفردية لمصدر اإلدخال ‪ ،‬بينما يعمل تعريف النحو على تدفق الرموز المميزة التي تم إنشاؤها بواسطة‬
‫في الفصل التالي ("التحليل المعجمي") هي تعريفات معجمية‪ L‬؛‪ ‬االستخدامات‪ L‬في الفصول ‪ BNF‬التحليل المعجمي‪ .‬جميع استخدامات‬
‫‪.‬الالحقة هي تعريفات نحوية‬

‫جدول المحتويات‬

‫‪2. Lexical analysis‬‬

‫‪A Python program is read by a parser. Input to the parser is a stream of tokens, generated by‬‬
‫‪the lexical analyzer. This chapter describes how the lexical analyzer breaks a file into tokens.‬‬

‫‪Python reads program text as Unicode code points; the encoding of a source file can be given by an‬‬
‫‪encoding declaration and defaults to UTF-8, see PEP 3120 for details. If the source file cannot be‬‬
‫‪decoded, a SyntaxError is raised.‬‬

‫‪2.1. Line structure‬‬

‫‪A Python program is divided into a number of logical lines.‬‬

‫‪2.1.1. Logical lines‬‬

‫‪The end of a logical line is represented by the token NEWLINE. Statements cannot cross logical line‬‬
‫‪boundaries except where NEWLINE is allowed by the syntax (e.g., between statements in compound‬‬
‫‪statements). A logical line is constructed from one or more physical lines by following the explicit or‬‬
‫‪implicit line joining rules.‬‬

‫‪2.1.2. Physical lines‬‬

‫‪Pg. 2‬‬
A physical line is a sequence of characters terminated by an end-of-line sequence. In source files and
strings, any of the standard platform line termination sequences can be used - the Unix form using
ASCII LF (linefeed), the Windows form using the ASCII sequence CR LF (return followed by linefeed),
or the old Macintosh form using the ASCII CR (return) character. All of these forms can be used
equally, regardless of platform. The end of input also serves as an implicit terminator for the final
physical line.

When embedding Python, source code strings should be passed to Python APIs using the standard C
conventions for newline characters (the \n character, representing ASCII LF, is the line terminator).

2.1.3. Comments

A comment starts with a hash character (#) that is not part of a string literal, and ends at the end of
the physical line. A comment signifies the end of the logical line unless the implicit line joining rules
are invoked. Comments are ignored by the syntax.

2.1.4. Encoding declarations

If a comment in the first or second line of the Python script matches the regular
expression coding[=:]\s*([-\w.]+), this comment is processed as an encoding declaration; the first
group of this expression names the encoding of the source code file. The encoding declaration must
appear on a line of its own. If it is the second line, the first line must also be a comment-only line. The
recommended forms of an encoding expression are

# -*- coding: <encoding-name> -*-

which is recognized also by GNU Emacs, and

# vim: fileencoding=<encoding-name>

which is recognized by Bram Moolenaar’s VIM.

If no encoding declaration is found, the default encoding is UTF-8. In addition, if the first bytes of the
file are the UTF-8 byte-order mark (b'\xef\xbb\xbf'), the declared file encoding is UTF-8 (this is
supported, among others, by Microsoft’s notepad).

If an encoding is declared, the encoding name must be recognized by Python. The encoding is used
for all lexical analysis, including string literals, comments and identifiers.

2.1.5. Explicit line joining

Two or more physical lines may be joined into logical lines using backslash characters (\), as follows:
when a physical line ends in a backslash that is not part of a string literal or comment, it is joined with
the following forming a single logical line, deleting the backslash and the following end-of-line
character. For example:

if 1900 < year < 2100 and 1 <= month <= 12 \

and 1 <= day <= 31 and 0 <= hour < 24 \

and 0 <= minute < 60 and 0 <= second < 60: # Looks like a valid date

return 1

A line ending in a backslash cannot carry a comment. A backslash does not continue a comment. A
backslash does not continue a token except for string literals (i.e., tokens other than string literals

Pg. 3
cannot be split across physical lines using a backslash). A backslash is illegal elsewhere on a line
outside a string literal.

2.1.6. Implicit line joining

Expressions in parentheses, square brackets or curly braces can be split over more than one physical
line without using backslashes. For example:

month_names = ['Januari', 'Februari', 'Maart', # These are the

'April', 'Mei', 'Juni', # Dutch names

'Juli', 'Augustus', 'September', # for the months

'Oktober', 'November', 'December'] # of the year

Implicitly continued lines can carry comments. The indentation of the continuation lines is not
important. Blank continuation lines are allowed. There is no NEWLINE token between implicit
continuation lines. Implicitly continued lines can also occur within triple-quoted strings (see below);
in that case they cannot carry comments.

2.1.7. Blank lines

A logical line that contains only spaces, tabs, formfeeds and possibly a comment, is ignored (i.e., no
NEWLINE token is generated). During interactive input of statements, handling of a blank line may
differ depending on the implementation of the read-eval-print loop. In the standard interactive
interpreter, an entirely blank logical line (i.e. one containing not even whitespace or a comment)
terminates a multi-line statement.

2.1.8. Indentation

Leading whitespace (spaces and tabs) at the beginning of a logical line is used to compute the
indentation level of the line, which in turn is used to determine the grouping of statements.

Tabs are replaced (from left to right) by one to eight spaces such that the total number of characters
up to and including the replacement is a multiple of eight (this is intended to be the same rule as
used by Unix). The total number of spaces preceding the first non-blank character then determines
the line’s indentation. Indentation cannot be split over multiple physical lines using backslashes; the
whitespace up to the first backslash determines the indentation.

Indentation is rejected as inconsistent if a source file mixes tabs and spaces in a way that makes the
meaning dependent on the worth of a tab in spaces; a TabError is raised in that case.

Cross-platform compatibility note: because of the nature of text editors on non-UNIX platforms, it is


unwise to use a mixture of spaces and tabs for the indentation in a single source file. It should also be
noted that different platforms may explicitly limit the maximum indentation level.

A formfeed character may be present at the start of the line; it will be ignored for the indentation
calculations above. Formfeed characters occurring elsewhere in the leading whitespace have an
undefined effect (for instance, they may reset the space count to zero).

The indentation levels of consecutive lines are used to generate INDENT and DEDENT tokens, using a
stack, as follows.

Pg. 4
Before the first line of the file is read, a single zero is pushed on the stack; this will never be popped
off again. The numbers pushed on the stack will always be strictly increasing from bottom to top. At
the beginning of each logical line, the line’s indentation level is compared to the top of the stack. If it
is equal, nothing happens. If it is larger, it is pushed on the stack, and one INDENT token is generated.
If it is smaller, it must be one of the numbers occurring on the stack; all numbers on the stack that
are larger are popped off, and for each number popped off a DEDENT token is generated. At the end

of the file, a DEDENT token is generated for each number remaining on the stack that is larger than
zero.

Here is an example of a correctly (though confusingly) indented piece of Python code:

def perm(l):

# Compute the list of all permutations of l

if len(l) <= 1:

return [l]

r = []

for i in range(len(l)):

s = l[:i] + l[i+1:]

p = perm(s)

for x in p:

r.append(l[i:i+1] + x)

return r

The following example shows various indentation errors:

def perm(l): # error: first line indented

for i in range(len(l)): # error: not indented

s = l[:i] + l[i+1:]

p = perm(l[:i] + l[i+1:]) # error: unexpected indent

for x in p:

r.append(l[i:i+1] + x)

return r # error: inconsistent dedent

(Actually, the first three errors are detected by the parser; only the last error is found by the lexical
analyzer — the indentation of return r does not match a level popped off the stack.)

2.1.9. Whitespace between tokens

Except at the beginning of a logical line or in string literals, the whitespace characters space, tab and
formfeed can be used interchangeably to separate tokens. Whitespace is needed between two
tokens only if their concatenation could otherwise be interpreted as a different token (e.g., ab is one
token, but a b is two tokens).

Pg. 5
2.2. Other tokens

Besides NEWLINE, INDENT and DEDENT, the following categories of tokens


exist: identifiers, keywords, literals, operators, and delimiters. Whitespace characters (other than line
terminators, discussed earlier) are not tokens, but serve to delimit tokens. Where ambiguity exists, a
token comprises the longest possible string that forms a legal token, when read from left to right.

2.3. Identifiers and keywords

Identifiers (also referred to as names) are described by the following lexical definitions.

The syntax of identifiers in Python is based on the Unicode standard annex UAX-31, with elaboration
and changes as defined below; see also PEP 3131 for further details.

Within the ASCII range (U+0001..U+007F), the valid characters for identifiers are the same as in
Python 2.x: the uppercase and lowercase letters A through Z, the underscore _ and, except for the
first character, the digits 0 through 9.

Python 3.0 introduces additional characters from outside the ASCII range (see PEP 3131). For these
characters, the classification uses the version of the Unicode Character Database as included in
the unicodedata module.

Identifiers are unlimited in length. Case is significant.

identifier ::= xid_start xid_continue*

id_start ::= <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and
characters with the Other_ID_Start property>

id_continue ::= <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and
others with the Other_ID_Continue property>

xid_start ::= <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">

xid_continue ::= <all characters in id_continue whose NFKC normalization is in "id_continue*">

The Unicode category codes mentioned above stand for:

 Lu - uppercase letters

 Ll - lowercase letters

 Lt - titlecase letters

 Lm - modifier letters

 Lo - other letters

 Nl - letter numbers

 Mn - nonspacing marks

 Mc - spacing combining marks

 Nd - decimal numbers

 Pc - connector punctuations

 Other_ID_Start - explicit list of characters in PropList.txt to support backwards compatibility

Pg. 6
 Other_ID_Continue - likewise

All identifiers are converted into the normal form NFKC while parsing; comparison of identifiers is
based on NFKC.

A non-normative HTML file listing all valid identifier characters for Unicode 4.1 can be found
at https://www.unicode.org/Public/13.0.0/ucd/DerivedCoreProperties.txt

2.3.1. Keywords

The following identifiers are used as reserved words, or keywords of the language, and cannot be
used as ordinary identifiers. They must be spelled exactly as written here:

False await else import pass

None break except in raise

True class finally is return

and continue for lambda try

as def from nonlocal while

assert del global not with

async elif if or yield

2.3.2. Soft Keywords

New in version 3.10.

Some identifiers are only reserved under specific contexts. These are known as soft keywords. The
identifiers match, case and _ can syntactically act as keywords in contexts related to the pattern
matching statement, but this distinction is done at the parser level, not when tokenizing.

As soft keywords, their use with pattern matching is possible while still preserving compatibility with
existing code that uses match, case and _ as identifier names.

2.3.3. Reserved classes of identifiers

Certain classes of identifiers (besides keywords) have special meanings. These classes are identified
by the patterns of leading and trailing underscore characters:

_*

Not imported by from module import *. The special identifier _ is used in the interactive interpreter
to store the result of the last evaluation; it is stored in the builtins module. When not in interactive
mode, _ has no special meaning and is not defined. See section The import statement.

Note

The name _ is often used in conjunction with internationalization; refer to the documentation for
the gettext module for more information on this convention.

__*__

Pg. 7
System-defined names, informally known as “dunder” names. These names are defined by the
interpreter and its implementation (including the standard library). Current system names are
discussed in the Special method names section and elsewhere. More will likely be defined in future
versions of Python. Any use of __*__ names, in any context, that does not follow explicitly
documented use, is subject to breakage without warning.

__*

Class-private names. Names in this category, when used within the context of a class definition, are
re-written to use a mangled form to help avoid name clashes between “private” attributes of base
and derived classes. See section Identifiers (Names).

2.4. Literals

Literals are notations for constant values of some built-in types.

2.4.1. String and Bytes literals

String literals are described by the following lexical definitions:

stringliteral ::= [stringprefix](shortstring | longstring)

stringprefix ::= "r" | "u" | "R" | "U" | "f" | "F"

| "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"

shortstring ::= "'" shortstringitem* "'" | '"' shortstringitem* '"'

longstring ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""'

shortstringitem ::= shortstringchar | stringescapeseq

longstringitem ::= longstringchar | stringescapeseq

shortstringchar ::= <any source character except "\" or newline or the quote>

longstringchar ::= <any source character except "\">

stringescapeseq ::= "\" <any source character>

bytesliteral ::= bytesprefix(shortbytes | longbytes)

bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"

shortbytes ::= "'" shortbytesitem* "'" | '"' shortbytesitem* '"'

longbytes ::= "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'

shortbytesitem ::= shortbyteschar | bytesescapeseq

longbytesitem ::= longbyteschar | bytesescapeseq

shortbyteschar ::= <any ASCII character except "\" or newline or the quote>

longbyteschar ::= <any ASCII character except "\">

bytesescapeseq ::= "\" <any ASCII character>

One syntactic restriction not indicated by these productions is that whitespace is not allowed
between the stringprefix or bytesprefix and the rest of the literal. The source character set is defined

Pg. 8
by the encoding declaration; it is UTF-8 if no encoding declaration is given in the source file; see
section Encoding declarations.

In plain English: Both types of literals can be enclosed in matching single quotes (') or double quotes
("). They can also be enclosed in matching groups of three single or double quotes (these are
generally referred to as triple-quoted strings). The backslash (\) character is used to escape
characters that otherwise have a special meaning, such as newline, backslash itself, or the quote
character.

Bytes literals are always prefixed with 'b' or 'B'; they produce an instance of the bytes type instead of
the str type. They may only contain ASCII characters; bytes with a numeric value of 128 or greater
must be expressed with escapes.

Both string and bytes literals may optionally be prefixed with a letter 'r' or 'R'; such strings are
called raw strings and treat backslashes as literal characters. As a result, in string
literals, '\U' and '\u' escapes in raw strings are not treated specially. Given that Python 2.x’s raw
unicode literals behave differently than Python 3.x’s the 'ur' syntax is not supported.

New in version 3.3:  The 'rb' prefix of raw bytes literals has been added as a synonym of 'br'.

New in version 3.3:  Support for the unicode legacy literal (u'value') was reintroduced to simplify the
maintenance of dual Python 2.x and 3.x codebases. See PEP 414 for more information.

A string literal with 'f' or 'F' in its prefix is a formatted string literal; see Formatted string literals.
The 'f' may be combined with 'r', but not with 'b' or 'u', therefore raw formatted strings are possible,
but formatted bytes literals are not.

In triple-quoted literals, unescaped newlines and quotes are allowed (and are retained), except that
three unescaped quotes in a row terminate the literal. (A “quote” is the character used to open the
literal, i.e. either ' or ".)

Unless an 'r' or 'R' prefix is present, escape sequences in string and bytes literals are interpreted
according to rules similar to those used by Standard C. The recognized escape sequences are:

Escape Sequence Meaning Notes

Backslash and newline


\newline
ignored

\\ Backslash (\)

\' Single quote (')

\" Double quote (")

\a ASCII Bell (BEL)

\b ASCII Backspace (BS)

\f ASCII Formfeed (FF)

Pg. 9
Escape Sequence Meaning Notes

\n ASCII Linefeed (LF)

\r ASCII Carriage Return (CR)

\t ASCII Horizontal Tab (TAB)

\v ASCII Vertical Tab (VT)

Character with octal


\ooo (1,3)
value ooo

\xhh Character with hex value hh (2,3)

Escape sequences only recognized in string literals are:

Note
Escape Sequence Meaning
s

\N{name} Character named name in the Unicode database (4)

\uxxxx Character with 16-bit hex value xxxx (5)

\Uxxxxxxxx Character with 32-bit hex value xxxxxxxx (6)

Notes:

1. As in Standard C, up to three octal digits are accepted.

2. Unlike in Standard C, exactly two hex digits are required.

3. In a bytes literal, hexadecimal and octal escapes denote the byte with the given value. In a
string literal, these escapes denote a Unicode character with the given value.

4. Changed in version 3.3:  Support for name aliases 1 has been added.

5. Exactly four hex digits are required.

6. Any Unicode character can be encoded this way. Exactly eight hex digits are required.

Unlike Standard C, all unrecognized escape sequences are left in the string unchanged, i.e., the
backslash is left in the result. (This behavior is useful when debugging: if an escape sequence is
mistyped, the resulting output is more easily recognized as broken.) It is also important to note that
the escape sequences only recognized in string literals fall into the category of unrecognized escapes
for bytes literals.

Changed in version 3.6:  Unrecognized escape sequences produce a DeprecationWarning. In a future


Python version they will be a SyntaxWarning and eventually a SyntaxError.

Even in a raw literal, quotes can be escaped with a backslash, but the backslash remains in the result;
for example, r"\"" is a valid string literal consisting of two characters: a backslash and a double

Pg. 10
quote; r"\" is not a valid string literal (even a raw string cannot end in an odd number of
backslashes). Specifically, a raw literal cannot end in a single backslash (since the backslash would
escape the following quote character). Note also that a single backslash followed by a newline is
interpreted as those two characters as part of the literal, not as a line continuation.

2.4.2. String literal concatenation

Multiple adjacent string or bytes literals (delimited by whitespace), possibly using different quoting
conventions, are allowed, and their meaning is the same as their concatenation.
Thus, "hello" 'world' is equivalent to "helloworld". This feature can be used to reduce the number of
backslashes needed, to split long strings conveniently across long lines, or even to add comments to
parts of strings, for example:

re.compile("[A-Za-z_]" # letter or underscore

"[A-Za-z0-9_]*" # letter, digit or underscore

Note that this feature is defined at the syntactical level, but implemented at compile time. The ‘+’
operator must be used to concatenate string expressions at run time. Also note that literal
concatenation can use different quoting styles for each component (even mixing raw strings and
triple quoted strings), and formatted string literals may be concatenated with plain string literals.

2.4.3. Formatted string literals

New in version 3.6.

A formatted string literal or f-string is a string literal that is prefixed with 'f' or 'F'. These strings may
contain replacement fields, which are expressions delimited by curly braces {}. While other string
literals always have a constant value, formatted strings are really expressions evaluated at run time.

Escape sequences are decoded like in ordinary string literals (except when a literal is also marked as a
raw string). After decoding, the grammar for the contents of the string is:

f_string ::= (literal_char | "{{" | "}}" | replacement_field)*

replacement_field ::= "{" f_expression ["="] ["!" conversion] [":" format_spec] "}"

f_expression ::= (conditional_expression | "*" or_expr)

("," conditional_expression | "," "*" or_expr)* [","]

| yield_expression

conversion ::= "s" | "r" | "a"

format_spec ::= (literal_char | NULL | replacement_field)*

literal_char ::= <any code point except "{", "}" or NULL>

The parts of the string outside curly braces are treated literally, except that any doubled curly
braces '{{' or '}}' are replaced with the corresponding single curly brace. A single opening curly
bracket '{' marks a replacement field, which starts with a Python expression. To display both the
expression text and its value after evaluation, (useful in debugging), an equal sign '=' may be added
after the expression. A conversion field, introduced by an exclamation point '!' may follow. A format

Pg. 11
specifier may also be appended, introduced by a colon ':'. A replacement field ends with a closing
curly bracket '}'.

Expressions in formatted string literals are treated like regular Python expressions surrounded by
parentheses, with a few exceptions. An empty expression is not allowed, and both lambda and
assignment expressions := must be surrounded by explicit parentheses. Replacement expressions can
contain line breaks (e.g. in triple-quoted strings), but they cannot contain comments. Each expression
is evaluated in the context where the formatted string literal appears, in order from left to right.

Changed in version 3.7:  Prior to Python 3.7, an await expression and comprehensions containing
an async for clause were illegal in the expressions in formatted string literals due to a problem with
the implementation.

When the equal sign '=' is provided, the output will have the expression text, the '=' and the
evaluated value. Spaces after the opening brace '{', within the expression and after the '=' are all
retained in the output. By default, the '=' causes the repr() of the expression to be provided, unless
there is a format specified. When a format is specified it defaults to the str() of the expression unless
a conversion '!r' is declared.

New in version 3.8:  The equal sign '='.

If a conversion is specified, the result of evaluating the expression is converted before formatting.
Conversion '!s' calls str() on the result, '!r' calls repr(), and '!a' calls ascii().

The result is then formatted using the format() protocol. The format specifier is passed to
the __format__() method of the expression or conversion result. An empty string is passed when the
format specifier is omitted. The formatted result is then included in the final value of the whole
string.

Top-level format specifiers may include nested replacement fields. These nested fields may include
their own conversion fields and format specifiers, but may not include more deeply-nested
replacement fields. The format specifier mini-language is the same as that used by
the str.format() method.

Formatted string literals may be concatenated, but replacement fields cannot be split across literals.

Some examples of formatted string literals:

>>>

>>> name = "Fred"

>>> f"He said his name is {name!r}."

"He said his name is 'Fred'."

>>> f"He said his name is {repr(name)}." # repr() is equivalent to !r

"He said his name is 'Fred'."

>>> width = 10

>>> precision = 4

>>> value = decimal.Decimal("12.34567")

Pg. 12
>>> f"result: {value:{width}.{precision}}" # nested fields

'result: 12.35'

>>> today = datetime(year=2017, month=1, day=27)

>>> f"{today:%B %d, %Y}" # using date format specifier

'January 27, 2017'

>>> f"{today=:%B %d, %Y}" # using date format specifier and debugging

'today=January 27, 2017'

>>> number = 1024

>>> f"{number:#0x}" # using integer format specifier

'0x400'

>>> foo = "bar"

>>> f"{ foo = }" # preserves whitespace

" foo = 'bar'"

>>> line = "The mill's closed"

>>> f"{line = }"

'line = "The mill\'s closed"'

>>> f"{line = :20}"

"line = The mill's closed "

>>> f"{line = !r:20}"

'line = "The mill\'s closed" '

A consequence of sharing the same syntax as regular string literals is that characters in the
replacement fields must not conflict with the quoting used in the outer formatted string literal:

f"abc {a["x"]} def" # error: outer string literal ended prematurely

f"abc {a['x']} def" # workaround: use different quoting

Backslashes are not allowed in format expressions and will raise an error:

f"newline: {ord('\n')}" # raises SyntaxError

To include a value in which a backslash escape is required, create a temporary variable.

>>>

>>> newline = ord('\n')

>>> f"newline: {newline}"

'newline: 10'

Pg. 13
Formatted string literals cannot be used as docstrings, even if they do not include expressions.

>>>

>>> def foo():

... f"Not a docstring"

...

>>> foo.__doc__ is None

True

See also PEP 498 for the proposal that added formatted string literals, and str.format(), which uses a
related format string mechanism.

2.4.4. Numeric literals

There are three types of numeric literals: integers, floating point numbers, and imaginary numbers.
There are no complex literals (complex numbers can be formed by adding a real number and an
imaginary number).

Note that numeric literals do not include a sign; a phrase like -1 is actually an expression composed
of the unary operator ‘-‘ and the literal 1.

2.4.5. Integer literals

Integer literals are described by the following lexical definitions:

integer ::= decinteger | bininteger | octinteger | hexinteger

decinteger ::= nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")*

bininteger ::= "0" ("b" | "B") (["_"] bindigit)+

octinteger ::= "0" ("o" | "O") (["_"] octdigit)+

hexinteger ::= "0" ("x" | "X") (["_"] hexdigit)+

nonzerodigit ::= "1"..."9"

digit ::= "0"..."9"

bindigit ::= "0" | "1"

octdigit ::= "0"..."7"

hexdigit ::= digit | "a"..."f" | "A"..."F"

There is no limit for the length of integer literals apart from what can be stored in available memory.

Underscores are ignored for determining the numeric value of the literal. They can be used to group
digits for enhanced readability. One underscore can occur between digits, and after base specifiers
like 0x.

Note that leading zeros in a non-zero decimal number are not allowed. This is for disambiguation
with C-style octal literals, which Python used before version 3.0.

Some examples of integer literals:

Pg. 14
7 2147483647 0o177 0b100110111

3 79228162514264337593543950336 0o377 0xdeadbeef

100_000_000_000 0b_1110_0101

Changed in version 3.6:  Underscores are now allowed for grouping purposes in literals.

2.4.6. Floating point literals

Floating point literals are described by the following lexical definitions:

floatnumber ::= pointfloat | exponentfloat

pointfloat ::= [digitpart] fraction | digitpart "."

exponentfloat ::= (digitpart | pointfloat) exponent

digitpart ::= digit (["_"] digit)*

fraction ::= "." digitpart

exponent ::= ("e" | "E") ["+" | "-"] digitpart

Note that the integer and exponent parts are always interpreted using radix 10. For
example, 077e010 is legal, and denotes the same number as 77e10. The allowed range of floating
point literals is implementation-dependent. As in integer literals, underscores are supported for digit
grouping.

Some examples of floating point literals:

3.14 10. .001 1e100 3.14e-10 0e0 3.14_15_93

Changed in version 3.6:  Underscores are now allowed for grouping purposes in literals.

2.4.7. Imaginary literals

Imaginary literals are described by the following lexical definitions:

imagnumber ::= (floatnumber | digitpart) ("j" | "J")

An imaginary literal yields a complex number with a real part of 0.0. Complex numbers are
represented as a pair of floating point numbers and have the same restrictions on their range. To
create a complex number with a nonzero real part, add a floating point number to it, e.g., (3+4j).
Some examples of imaginary literals:

3.14j 10.j 10j .001j 1e100j 3.14e-10j 3.14_15_93j

2.5. Operators

The following tokens are operators:

+ - * ** / // % @

<< >> & | ^ ~ :=

< > <= >= == !=

2.6. Delimiters

Pg. 15
‫‪The following tokens serve as delimiters in the grammar:‬‬

‫(‬ ‫)‬ ‫[‬ ‫]‬ ‫{‬ ‫}‬

‫‪,‬‬ ‫‪:‬‬ ‫‪.‬‬ ‫;‬ ‫@‬ ‫=‬ ‫>‪-‬‬

‫=‪+‬‬ ‫=‪-‬‬ ‫=*‬ ‫=‪/‬‬ ‫=‪//‬‬ ‫=‪%‬‬ ‫=@‬

‫=&‬ ‫=|‬ ‫=^‬ ‫=>>‬ ‫=<<‬ ‫=**‬

‫‪The period can also occur in floating-point and imaginary literals. A sequence of three periods has a‬‬
‫‪special meaning as an ellipsis literal. The second half of the list, the augmented assignment‬‬
‫‪operators, serve lexically as delimiters, but also perform an operation.‬‬

‫‪The following printing ASCII characters have special meaning as part of other tokens or are otherwise‬‬
‫‪significant to the lexical analyzer:‬‬

‫'‬ ‫"‬ ‫‪#‬‬ ‫\‬

‫‪The following printing ASCII characters are not used in Python. Their occurrence outside string literals‬‬
‫‪and comments is an unconditional error:‬‬

‫‪$‬‬ ‫?‬ ‫`‬

‫‪ ‬نموذج البيانات‪3. ‬‬

‫‪ ‬األشياء والقيم واألنواع‪3.1. ‬‬

‫بواسطة كائنات أو من خالل العالقات بين ‪ Python‬للبيانات‪ .‬يتم تمثيل جميع البيانات في برنامج ‪ Python‬الكائنات‪ ‬هي تجريد‬
‫الكائنات‪( .‬بمعنى ما ‪ ،‬ووف ًقا لنموذج فون نيومان لـ "كمبيوتر البرنامج المخزن" ‪ ،‬يتم تمثيل الكود أيضً ا بواسطة الكائنات‪).‬‬

‫عامل التشغيل‪. is " " ‬كل كائن له هوية ونوع وقيمة‪ .‬ال تتغير‪ ‬هوية‪ ‬الكائن‪ ‬أب ًدا بمجرد إنشائه ؛‪ ‬قد تعتقد أنه عنوان الكائن في الذاكرة‬
‫‪.‬الدالة بإرجاع عدد صحيح يمثل هويتها)(‪ id‬يقارن هوية كائنين ؛‪ ‬تقوم‬

‫‪.‬يتم تخزينه‪ x‬هو عنوان الذاكرة حيث)‪ CPython ، id(x‬بالنسبة لـ‪ CPython: ‬تفاصيل تنفيذ‬
‫يحدد نوع الكائن العمليات التي يدعمها الكائن (على سبيل المثال ‪" ،‬هل له طول؟") ويحدد أي ً‬
‫ضا القيم المحتملة للكائنات من هذا‬
‫ضا غير قابل )(‪ type‬النوع‪ .‬تقوم‬ ‫الدالة بإرجاع نوع كائن (وهو كائن بحد ذاته)‪ .‬كما هو الحال في هويته ‪ ،‬فإن‪ ‬نوع‪ ‬الكائن‪ ‬أي ً‬
‫للتغيير‪1 .‬‬
‫في‪ ‬قيمة‪ ‬بعض األشياء يمكن أن تتغير‪ .‬يقال إن األشياء التي يمكن أن تتغير قيمتها‪ ‬قابلة للتغيير‪ ‬؛‪ ‬تسمى األشياء التي تكون قيمتها غير‬
‫قابلة للتغيير بمجرد إنشائها‪ ‬غير قابلة للتغيير‪(  . ‬يمكن أن تتغير قيمة كائن الحاوية غير القابل للتغيير الذي يحتوي على مرجع إلى‬
‫كائن قابل للتغيير عند تغيير قيمة األخير ؛ ومع ذلك ال تزال الحاوية تعتبر غير قابلة للتغيير ‪ ،‬ألن مجموعة العناصر التي تحتوي‬
‫عليها ال يمكن تغييرها‪ .‬لذلك ‪ ،‬ال يمكن تغيير الثبات بشكل صارم مثل وجود قيمة غير قابلة للتغيير ‪ ،‬فهو أكثر دقة‪ ).‬يتم تحديد قابلية‬
‫‪.‬تغيير الكائن حسب نوعه ؛‪  ‬على سبيل المثال ‪ ،‬األرقام والسالسل والجداول غير قابلة للتغيير ‪ ،‬بينما القواميس والقوائم قابلة للتغيير‬

‫ال يتم تدمير األشياء بشكل صريح ؛‪ ‬ومع ذلك ‪ ،‬عندما يتعذر الوصول إليها ‪ ،‬فقد يتم جمعها من القمامة‪ .‬يُسمح للتطبيق بتأجيل جمع‬
‫‪.‬القمامة أو حذفها‪ L‬تما ًما ‪ -‬إنها مسألة جودة التنفيذ كيفية تنفيذ جمع القمامة‪ ، L‬طالما لم يتم جمع أي كائنات ال تزال قابلة للوصول‬

‫حاليًا مخطط حساب‪ L‬مرجعي مع اكتشاف متأخر (اختياري) للقمامة المرتبطة دوريًا ‪ CPython ،‬يستخدم‪ CPython: ‬تفاصيل تنفيذ‬
‫والتي تجمع معظم الكائنات بمجرد أن يتعذر الوصول إليها ‪ ،‬ولكن ال يضمن جمع القمامة التي تحتوي على مراجع دائرية‪ .‬راجع‬
‫الوحدة للحصول على معلومات حول التحكم في جمع القمامة الدورية‪ .‬التطبيقات األخرى تعمل بشكل مختلف وقد يتغير‪ gc ‬توثيق‬
‫‪.‬ال تعتمد على اإلنهاء الفوري للكائنات عندما يتعذر الوصول إليها (لذلك يجب دائمًا إغالق الملفات بشكل صريح)‪CPython. ‬‬

‫الحظ أن استخدام تسهيالت التتبع أو التصحيح الخاصة بالتنفيذ قد تحافظ على الكائنات الحية التي عادة ما تكون قابلة للتحصيل‪ .‬الحظ‬
‫‪.‬قد يُبقي الكائنات على قيد الحياة "‪ " try… except‬أيضً ا أن اصطياد استثناء بعبارة‬

‫‪Pg. 16‬‬
‫تحتوي بعض الكائنات على مراجع لمصادر "خارجية" مثل الملفات أو النوافذ المفتوحة‪ .‬من المفهوم أن هذه الموارد يتم تحريرها‬
‫ضا طريقة‬‫عندما يتم جمع الكائن بالقمامة ‪ ،‬ولكن نظرً ا لعدم ضمان حدوث عملية جمع البيانات المهملة ‪ ،‬توفر هذه الكائنات أي ً‬
‫طريقة‪  .‬يوصى بشدة بالبرامج إلغالق هذه الكائنات بشكل صريح‪ .‬توفر )(‪ close‬واضحة لتحرير المورد الخارجي ‪ ،‬وعادة ما تكون‬
‫‪.‬طر ًقا مالئمة للقيام بذلك "‪ " with‬وعبارة "‪ " try… finally‬عبارة‬

‫تحتوي بعض الكائنات على إشارات إلى كائنات أخرى ؛‪ ‬هذه تسمى‪ ‬الحاويات‪ . ‬أمثلة على الحاويات هي المجموعات والقوائم‬
‫والقواميس‪ .‬المراجع جزء من قيمة الحاوية‪  .‬في معظم الحاالت ‪ ،‬عندما نتحدث عن قيمة الحاوية ‪ ،‬فإننا نعني القيم وليس هويات‬
‫الكائنات الموجودة ؛‪  ‬ومع ذلك ‪ ،‬عندما نتحدث عن قابلية تغيير الحاوية ‪ ،‬يتم تضمين فقط هويات الكائنات المحتواة مباشرة‪ .‬لذلك ‪ ،‬إذا‬
‫كانت الحاوية غير القابلة للتغيير (مثل المجموعة) تحتوي على مرجع لكائن قابل للتغيير ‪ ،‬تتغير قيمته إذا تم تغيير هذا الكائن القابل‬
‫‪.‬للتغيير‬

‫تؤثر األنواع تقريبًا على جميع جوانب سلوك الكائن‪  .‬حتى أهمية هوية الكائن تتأثر إلى حد ما‪ :‬بالنسبة لألنواع غير القابلة للتغيير ‪ ،‬قد‬
‫تقوم العمليات التي تحسب القيم الجديدة في الواقع بإرجاع مرجع إلى أي كائن موجود بنفس النوع والقيمة ‪ ،‬بينما هذا غير مسموح به‬
‫بالنسبة للكائنات القابلة للتغيير‪ .‬على سبيل المثال‪ ،‬بعد‪ ، ‬و‪  ‬قد أو قد ال تشير إلى نفس الكائن مع قيمة واحدة‪ ،‬وهذا يتوقف على التنفيذ‪،‬‬
‫ولكن بعد‪ ، ‬و‪  ‬مضمونة لإلشارة إلى اثنين من مختلف فريدة من نوعها‪ ،‬والقوائم فارغة‪ ،‬التي أنشئت حديثا‪( .‬الحظ أنه يقوم‪ ‬بتعيين‬
‫‪a = 1; b = 1abc = []; d = []cdc = d = []cd‬نفس الكائن لكل من‪ ‬و‪). ‬‬

‫‪ ‬التسلسل الهرمي للنوع القياسي‪3.2 ‬‬

‫أو لغات أخرى ‪ ،‬اعتما ًدا على ‪ Java‬أو ‪ C‬المكتوبة بلغة( يمكن لوحدات االمتداد‪ Python. ‬فيما يلي قائمة باألنواع المضمنة في‬
‫أنوا ًع ا إلى التسلسل الهرمي للنوع (على سبيل المثال ‪ Python ،‬تحديد أنواع إضافية‪ .‬قد تضيف اإلصدارات المستقبلية من )التطبيق‬
‫األرقام المنطقية ‪ ،‬المصفوفات المخزنة بكفاءة من األعداد الصحيحة ‪ ،‬وما إلى ذلك) ‪ ،‬على الرغم من أن هذه اإلضافات‪ L‬غالبًا ما يتم‬
‫‪.‬توفيرها عبر المكتبة القياسية بدالً من ذلك‬

‫تحتوي بعض أوصاف األنواع أدناه على فقرة تسرد "سمات‪ L‬خاصة"‪  .‬هذه هي السمات التي توفر الوصول إلى التنفيذ وليست‬
‫‪.‬مخصصة لالستخدام العام‪ .‬قد يتغير تعريفهم في المستقبل‬

‫ال أحد‬

‫يتم استخدامه ‪ None. ‬هذا النوع له قيمة واحدة‪ .‬يوجد كائن واحد بهذه القيمة‪  .‬يتم الوصول إلى هذا الكائن من خالل االسم المضمن‬
‫للداللة على عدم وجود قيمة في العديد من المواقف ‪ ،‬على سبيل المثال ‪ ،‬يتم إرجاعها من وظائف ال تقوم بإرجاع أي شيء بشكل‬
‫‪.‬صريح‪ .‬قيمة الحقيقة خاطئة‬

‫لم تنفذ‬
‫هذا النوع له قيمة واحدة‪ .‬يوجد كائن واحد بهذه القيمة‪ .‬يتم الوصول إلى هذا الكائن من خالل االسم‬
‫يجب أن ُت رجع الطرق الرقمية وطرق المقارنة الثرية هذه القيمة إذا لم يتم تنفيذ العملية للمعامالت‪ NotImplemented.  L‬المضمن‬
‫المتوفرة‪(  .‬سيحاول المترجم بعد ذلك العملية المنعكسة ‪ ،‬أو بعض اإلجراءات االحتياطية األخرى ‪ ،‬اعتما ًدا على عامل التشغيل‪ ).‬ال‬
‫‪.‬ينبغي تقييمها في سياق منطقي‬

‫‪.‬راجع‪ ‬تنفيذ العمليات الحسابية‪ ‬لمزيد من التفاصيل‬

‫تم إهمال‪ ‬التقييم‪ ‬في سياق منطقي‪ .‬بينما يتم تقييمه حاليًا على أنه صحيح ‪ ،‬فإنه ‪:NotImplemented ‬تم التغيير في اإلصدار ‪3.9‬‬
‫‪ Python.‬طرح إصدار في المستقبل من‪ TypeError‬سيتم‪ DeprecationWarning. ‬سيصدر ملف‬

‫القطع الناقص‬
‫هذا النوع له قيمة واحدة‪ .‬يوجد كائن واحد بهذه القيمة‪ .‬يتم الوصول إلى هذا الكائن من خالل االسم الحرفي‪... ‬أو‬
‫‪.‬قيمة الحقيقة صحيحة‪ Ellipsis. ‬المضمن‬

‫‪numbers.Number‬‬

‫يتم إنشاؤها بواسطة حرفية رقمية وإعادتها كنتائج بواسطة عوامل حسابية ووظائف حسابية مضمنة‪ .‬الكائنات الرقمية غير قابلة‬
‫ً‬
‫ارتباطا وثي ًقا باألرقام الرياضية ‪ ،‬ولكنها تخضع لقيود التمثيل‬ ‫للتغيير ؛‪ ‬بمجرد إنشاء قيمتها ال تتغير ً‬
‫أبدا‪ .‬ترتبط أرقام بايثون بالطبع‬
‫‪.‬العددي في أجهزة الكمبيوتر‬

‫‪Pg. 17‬‬
‫‪:‬لها الخصائص التالية ‪ __str__()،‬و)(__‪ __repr‬تمثيالت السلسلة للفئات الرقمية ‪ ،‬محسوبة بواسطة‬

‫‪‬‬ ‫‪.‬إنها حرفية رقمية صالحة والتي ‪ ،‬عند تمريرها إلى مُنشئ الفئة الخاصة بها ‪ ،‬تنتج كائ ًنا له قيمة الرقم األصلي‬

‫‪‬‬ ‫‪.‬التمثيل في األساس ‪ ، 10‬عندما يكون ذلك ممك ًنا‬

‫‪‬‬ ‫‪.‬ال يتم عرض األصفار البادئة ‪ ،‬ربما باستثناء صفر واحد قبل الفاصلة العشرية‬

‫‪‬‬ ‫‪.‬ال يتم عرض األصفار الالحقة ‪ ،‬ربما باستثناء صفر واحد بعد فاصلة عشرية‬

‫‪‬‬ ‫‪.‬تظهر اإلشارة فقط عندما يكون الرقم سالبًا‬

‫‪:‬تميز بايثون بين األعداد الصحيحة وأرقام الفاصلة العائمة واألرقام المركبة‬

‫‪numbers.Integral‬‬

‫‪.‬تمثل هذه العناصر من المجموعة الرياضية لألعداد الصحيحة (الموجبة والسالبة)‬

‫‪:‬هناك نوعان من األعداد الصحيحة‬

‫)‪ ( int‬عدد صحيح‬

‫تمثل هذه األرقام في نطاق غير محدود ‪ ،‬رهنا بالذاكرة (االفتراضية) المتاحة فقط‪  .‬لغرض عمليات اإلزاحة والقناع ‪ ،‬يُفترض التمثيل‬
‫‪.‬الثنائي ‪ ،‬ويتم تمثيل األرقام السالبة في متغير مكمل ‪ 2‬مما يعطي الوهم بسلسلة ال نهائية من بتات اإلشارة تمتد إلى اليسار‬

‫)‪ ( bool‬قيمة منطقية‬

‫هي األشياء فقط منطقية‪ .‬النوع المنطقي هو نوع فرعي من ‪ True‬و‪ False‬هذه تمثل قيم الحقيقة خطأ وصحيح‪ .‬الكائنين تمثل القيم‬
‫نوع العدد الصحيح ‪ ،‬وتتصرف القيم المنطقية مثل القيمتين ‪ 0‬و ‪ ، 1‬على التوالي ‪ ،‬في جميع السياقات‪ L‬تقريبًا ‪ ،‬واالستثناء هو أنه عند‬
‫‪.‬إرجاعها ‪ ،‬على التوالي"‪ "True‬أو"‪ "False‬التحويل إلى سلسلة ‪ ،‬يتم إرجاع‪ ‬السالسل‬

‫‪.‬تهدف قواعد تمثيل األعداد الصحيحة إلى تقديم التفسير األكثر جدوى لعمليات التحول والقناع التي تتضمن أعدا ًدا صحيحة سالبة‬

‫)‪numbers.Real (float‬‬

‫)‪ Java‬أو ‪ C‬وتنفيذ( تمثل هذه األرقام الفاصلة العائمة ذات الدقة المزدوجة على مستوى الماكينة‪ .‬أنت تحت رحمة بنية اآللة األساسية‪L‬‬
‫للنطاق المقبول والتعامل مع الفائض‪ .‬ال تدعم بايثون أرقام الفاصلة العائمة أحادية الدقة ؛‪ ‬يتضاءل التوفير في استخدام المعالج‬
‫لذلك ال يوجد سبب لتعقيد اللغة ‪ Python ،‬والذاكرة التي تكون عاد ًة سبب استخدامهما بسبب الحمل الزائد الستخدام الكائنات في‬
‫‪.‬بنوعين من أرقام الفاصلة العائمة‬

‫)‪numbers.Complex (complex‬‬

‫تمثل هذه األرقام المعقدة كزوج من أرقام الفاصلة العائمة ذات الدقة المزدوجة على مستوى اآللة‪ .‬تنطبق نفس التحذيرات على أرقام‬
‫‪ z.imag.‬و‪ z.real‬يمكن استرجاع‪ ‬األجزاء الحقيقية والخيالية لعدد مركب‪ ‬من خالل سمات القراءة فقط‪. z‬الفاصلة العائمة‬

‫المتتاليات‬

‫ترجع‪ ‬الدالة المضمنة‪ ‬عدد عناصر التسلسل‪ .‬عندما يكون طول )(‪. len‬هذه تمثل مجموعات مرتبة محدودة مفهرسة بأرقام غير سالبة‬
‫‪ a[i].‬يتم تحديد العنصر‪ ‬األول‪ ‬من التسلسل‪ ‬أ‪ ‬بواسطة‪ ، ... ، n -1. ‬فإن مجموعة الفهرس تحتوي على األرقام ‪ n ، 1 ، 0‬التسلسل‬

‫عند استخدامها كتعبير ‪ ،‬تكون ‪ i  <= k  < j . ‬بحيث يكون‪ k ‬يختار كل العناصر ذات الفهرس]‪: a[i:j‬تدعم التسلسالت أيضً ا التقطيع‬
‫‪.‬الشريحة عبارة عن سلسلة من نفس النوع‪  .‬هذا يعني أنه تمت إعادة ترقيم مجموعة الفهرس بحيث تبدأ من ‪0‬‬

‫مع ‪ a ‬يختار جميع عناصر]‪: a[i:j:k‬تدعم بعض التسلسالت أي ً‬


‫ضا "التقطيع الممتد" مع معلمة "خطوة" ثالثة‬
‫<‪ i  x  j .x = i + n*k >= 0 <= ‬و‪ ، n ‬حيث‪ x ‬الفهرس‬

‫‪:‬يتم تمييز التسلسالت حسب قابليتها للتغيير‬

‫متواليات ثابتة‬

‫‪Pg. 18‬‬
‫ال يمكن تغيير كائن من نوع التسلسل الثابت بمجرد إنشائه‪(  .‬إذا كان الكائن يحتوي على إشارات إلى كائنات أخرى ‪ ،‬فقد تكون هذه‬
‫الكائنات األخرى قابلة للتغيير ويمكن تغييرها ؛ ومع ذلك ‪ ،‬ال يمكن تغيير مجموعة الكائنات المشار إليها مباشرة بواسطة كائن غير‬
‫قابل للتغيير‪).‬‬

‫‪:‬األنواع التالية هي متواليات ثابتة‬

‫سالسل‬

‫يمكن تمثيل‪ ‬جميع نقاط الرمز في النطاق‪ ‬في سلسلة‪ .‬ال تحتوي ‪ Unicode. ‬السلسلة عبارة عن سلسلة من القيم التي تمثل نقاط رمز‬
‫؛‪ ‬بدالً من ذلك ‪ ،‬يتم تمثيل كل نقطة رمز في السلسلة ككائن سلسلة بطول‪ . ‬تعمل الوظيفة المضمنة ‪ char ‬بايثون على‪ ‬نوع‬
‫على‪ ‬تحويل نقطة رمز من شكل سلسلة إلى عدد صحيح في النطاق‪ ‬؛‪ ‬يحول عد ًدا صحيحً ا في النطاق‪ ‬إلى‪ ‬كائن سلسلة‪ ‬الطول‬
‫إلى‪ ‬استخدام ترميز النص المحدد ‪ ،‬ويمكن استخدامها لتحقيق ‪ a ‬المقابل‪ . ‬يمكن استخدامها لتحويل‬
‫)(‪.U+0000 - U+10FFFF1ord()0 - 10FFFFchr()0 - 10FFFF1str.encode()strbytesbytes.decode‬العكس‬

‫مجموعات‬
‫عناصر المجموعة هي كائنات بايثون عشوائية‪  .‬تتكون مجموعات العناصر المكونة من عنصرين أو أكثر من خالل قوائم التعبيرات‬
‫المفصولة بفواصل‪  .‬يمكن تشكيل مجموعة من عنصر واحد ("مفرد") عن طريق لصق فاصلة على تعبير (التعبير في حد ذاته ال‬
‫يُنشئ مجموعة ‪ ،‬ألن األقواس يجب أن تكون قابلة لالستخدام لتجميع التعبيرات)‪ .‬يمكن تشكيل بنية فارغة من خالل زوج فارغ من‬
‫‪.‬األقواس‬

‫بايت‬

‫يمكن استخدام وحدات ‪ <= x <256.‬كائن بايت هو صفيف ثابت‪ .‬العناصر هي ‪ 8‬بت بايت ‪ ،‬ممثلة بأعداد صحيحة في النطاق ‪0‬‬
‫إلنشاء‪ L‬كائنات بايت‪ .‬أيضً ا ‪ ،‬يمكن فك تشفير كائنات البايت إلى سالسل )(‪ bytes‬والمنشئ‪ ‬المضمن‪ b'abc') ‬مثل( البايت الحرفية‬
‫‪.‬الطريقة)(‪ decode‬عبر‬

‫متواليات متغيرة‬

‫‪).‬الحذف(‪ del ‬يمكن تغيير التسلسالت المتغيرة بعد إنشائها‪  .‬يمكن استخدام رموز االشتراك والتقطيع كهدف للتعيين و‬

‫‪:‬يوجد حاليًا نوعان من التسلسالت الجوهرية القابلة للتغيير‬

‫القوائم‬
‫عناصر القائمة هي كائنات بايثون عشوائية‪  .‬يتم تكوين القوائم بوضع قائمة من التعبيرات مفصولة بفواصل بين قوسين‬
‫مربعين‪( .‬الحظ أنه ال توجد حاالت خاصة مطلوبة لتشكيل قوائم بطول ‪ 0‬أو ‪).1‬‬
‫صفائف بايت‬

‫المُنشئ‪ ‬المدمج‪ . ‬بصرف النظر عن كونها قابلة )(‪ bytearray‬هو مصفوفة قابلة للتغيير‪ .‬تم إنشاؤها بواسطة ‪ bytearray‬كائن‬
‫الكائنات‪ ‬غير‪ ‬القابل‪ bytes‬للتغيير (وبالتالي غير قابلة للتغيير) ‪ ،‬فإن مصفوفات البايت توفر بخالف ذلك نفس الواجهة والوظائف مثل‬
‫‪ .‬ة‪ ‬للتغيير‬

‫‪.‬الوحدة‪ collections‬توفر‪ ‬وحدة االمتداد‪ ‬مثااًل إضافيًا لنوع التسلسل القابل للتغيير ‪ ،‬كما تفعل‪array‬‬

‫تعيين األنواع‬
‫هذه تمثل مجموعات غير مرتبة ومحدودة من األشياء الفريدة وغير القابلة للتغيير‪ .‬على هذا النحو ‪ ،‬ال يمكن فهرستها‪ L‬بأي خط‬
‫بإرجاع عدد العناصر في مجموعة‪ .‬االستخدامات‪ len() L‬منخفض‪ .‬ومع ذلك ‪ ،‬يمكن تكرارها مرة أخرى ‪ ،‬وتقوم الوظيفة المضمنة‬
‫الشائعة للمجموعات هي اختبار العضوية السريع ‪ ،‬وإزالة التكرارات من تسلسل ‪ ،‬وحساب‪ L‬العمليات الرياضية مثل التقاطع ‪،‬‬
‫‪.‬واالتحاد ‪ ،‬واالختالف ‪ ،‬واالختالف المتماثل‬

‫بالنسبة لعناصر المجموعة ‪ ،‬تنطبق نفس قواعد الثبات على مفاتيح القاموس‪  .‬الحظ أن األنواع الرقمية تخضع للقواعد العادية للمقارنة‬
‫‪ .‬الرقمية‪ :‬إذا تم مقارنة رقمين بالتساوي (على سبيل المثال ‪1 ،‬و‪ ، )1.0 ‬فيمكن احتواء رقم واحد فقط في مجموعة‬

‫‪:‬يوجد حاليًا نوعان من المجموعات الجوهرية‬

‫‪Pg. 19‬‬
‫مجموعات‬

‫‪ add().‬المُنشئ‪ ‬المدمج‪ ‬ويمكن تعديلها بعد ذلك بعدة طرق ‪ ،‬مثل‪ set() ‬هذه تمثل مجموعة قابلة للتغيير‪ .‬يتم إنشاؤها بواسطة‬

‫مجموعات مجمدة‬

‫غير قابل للتغيير‪ ‬وقابل للتجزئة‪ frozenset ، ‬المُنشئ‪ ‬المدمج‪ . ‬نظرً ا ألن)(‪ frozenset‬هذه تمثل مجموعة ثابتة‪ .‬تم إنشاؤها بواسطة‬
‫‪.‬فيمكن استخدامه مرة أخرى كعنصر في مجموعة أخرى ‪ ،‬أو كمفتاح قاموس‬

‫التعيينات‬

‫يحدد‪ ‬الترميز المنخفض‪ ‬العنصر ]‪. a[k‬تمثل هذه مجموعات محدودة من الكائنات المفهرسة بواسطة مجموعات فهرس عشوائية‬
‫ترجع‪ ‬الدالة )(‪. len‬العبارات‪ del‬؛‪ ‬يمكن استخدام هذا في التعبيرات وكهدف للتخصيصات أو‪ a‬من التعيين‪ k‬المفهرس بواسطة‬
‫‪.‬المضمنة‪ ‬عدد العناصر في التعيين‬

‫‪:‬يوجد حاليًا نوع تخطيط جوهري واحد‬

‫قواميس‬
‫تمثل هذه مجموعات محدودة من الكائنات المفهرسة بقيم عشوائية تقريبًا‪  .‬األنواع الوحيدة من القيم غير المقبولة كمفاتيح هي القيم التي‬
‫تحتوي على قوائم أو قواميس أو أنواع أخرى قابلة للتغيير تتم مقارنتها بالقيمة بدالً من هوية الكائن ‪ ،‬والسبب هو أن التنفيذ الفعال‬
‫للقواميس يتطلب أن تظل قيمة تجزئة المفتاح ثابتة‪  .‬تخضع األنواع الرقمية المستخدمة للمفاتيح للقواعد العادية للمقارنة الرقمية‪ :‬إذا تم‬
‫‪.‬مقارنة رقمين بالتساوي (على سبيل المثال ‪1 ،‬و‪ )1.0 ‬فيمكن استخدامهما‪ L‬بالتبادل لفهرسة إدخال القاموس نفسه‬

‫تحتفظ القواميس بترتيب اإلدراج ‪ ،‬مما يعني أنه سيتم إنتاج المفاتيح بنفس ترتيب إضافتها بالتتابع على القاموس‪ .‬ال يؤدي استبدال‬
‫‪.‬مفتاح موجود إلى تغيير الترتيب ‪ ،‬ولكن إزالة مفتاح وإعادة إدخاله سيضيفه إلى النهاية بدالً من االحتفاظ بمكانه القديم‬

‫‪.‬القواميس قابلة للتغيير‪ .‬يمكن إنشاؤها بواسطة‪}...{ ‬التدوين (انظر قسم‪ ‬يعرض القاموس‪) ‬‬

‫‪.‬وحدة‪ collections ‬تقديم أمثلة إضافية من أنواع الخرائط‪ ،‬وكذلك‪ dbm.gnu‬و‪ dbm.ndbm‬وحدات اإلرشاد‬

‫تم ‪ CPython 3.6 ،‬قبل ‪ .3.6‬في ‪ Python‬تم التغيير في اإلصدار ‪ :3.7‬لم تحتفظ القواميس بترتيب اإلدراج في إصدارات‬
‫‪.‬االحتفاظ بأمر اإلدراج ‪ ،‬ولكن تم اعتباره تفاصيل تنفيذ في ذلك الوقت بدالً من ضمان اللغة‬

‫أنواع قابلة لالستدعاء‬

‫‪:‬هذه هي األنواع التي‪ ‬يمكن تطبيق‪ ‬عملية استدعاء الوظيفة عليها (انظر قسم‪ ‬المكالمات‪) L‬‬

‫وظائف محددة من قبل المستخدم‬


‫يتم إنشاء كائن دالة معرّ فة من قبل المستخدم بواسطة تعريف دالة (راجع قسم‪ ‬تعريفات الوظيفة‪ .) ‬يجب أن يتم استدعاؤها بقائمة‬
‫‪.‬وسائط تحتوي على نفس عدد العناصر مثل قائمة المعلمات‪ L‬الرسمية للوظيفة‬

‫‪:‬السمات‪ L‬الخاصة‬

‫يصف‬ ‫المعنى‬

‫قابل‬
‫__‪__doc‬‬ ‫‪.‬حالة عدم توفرها ؛‪ ‬ال ترثها الفئات الفرعية‪ None‬سلسلة وثائق الوظيفة ‪ ،‬أو في‬
‫للكتابة‬

‫قابل‬
‫__‪__name‬‬ ‫‪.‬اسم الوظيفة‬
‫للكتابة‬

‫‪ .‬االسم المؤهل‪ ‬للوظيفة‬ ‫قابل‬


‫__‪__qualname‬‬
‫الجديد في اإلصدار ‪3.3.1‬‬ ‫للكتابة‬

‫‪Pg. 20‬‬
‫يصف‬ ‫المعنى‬

‫قابل‬
‫__‪__module‬‬ ‫‪.‬إذا لم تكن متاحة‪ None‬اسم الوحدة التي تم تحديد الوظيفة فيها ‪ ،‬أو‬
‫للكتابة‬

‫مجموعة تحتوي على قيم وسيطة افتراضية لتلك الوسائط التي تحتوي على قيم‬ ‫قابل‬
‫__‪__defaults‬‬
‫‪.‬إذا لم يكن هناك وسيطات لها قيمة افتراضية‪ None‬افتراضية ‪ ،‬أو‬ ‫للكتابة‬

‫قابل‬
‫__‪__code‬‬ ‫‪.‬كائن الكود الذي يمثل جسم الوظيفة المترجمة‬
‫للكتابة‬

‫مرجع إلى القاموس الذي يحتوي على المتغيرات العامة للدالة ‪ -‬مساحة‪ L‬االسم‬ ‫يقرأ‬
‫__‪__globals‬‬
‫‪.‬العامة للوحدة النمطية التي تم فيها تعريف الوظيفة‬ ‫فقط‬

‫قابل‬
‫__‪__dict‬‬ ‫‪.‬مساحة‪ L‬االسم التي تدعم سمات‪ L‬الوظيفة التعسفية‬
‫للكتابة‬

‫أو مجموعة خاليا تحتوي على روابط للمتغيرات الحرة للوظيفة‪ .‬انظر ‪None‬‬ ‫يقرأ‬
‫__‪__closure‬‬
‫‪.‬السمة‪ cell_contents ‬أدناه للحصول على معلومات حول‬ ‫فقط‬

‫هي أسماء ‪ dt‬إمالء يحتوي على تعليقات توضيحية للمعلمات‪ .‬مفاتيح‬


‫وللتعليق التوضيحي للعودة ‪ ،‬إذا تم توفيره‪ .‬لمزيد من '‪ ، 'return‬المعلمات‬ ‫قابل‬
‫__‪__annotations‬‬
‫المعلومات حول استخدام هذه السمة ‪ ،‬راجع‪ ‬أفضل ممارسات التعليقات‬ ‫للكتابة‬
‫‪ .‬التوضيحية‬

‫قابل‬
‫__‪__kwdefaults‬‬ ‫‪.‬إمالء يحتوي على قيم افتراضية لمعلمات الكلمات الرئيسية فقط‬
‫للكتابة‬

‫‪.‬تتحقق معظم السمات‪ L‬المسماة "قابلة للكتابة" من نوع القيمة المخصصة‬

‫ضا الحصول على السمات‪ L‬التعسفية وتعيينها ‪ ،‬والتي يمكن استخدامها ‪ ،‬على سبيل المثال ‪ ،‬إلرفاق البيانات‬‫تدعم كائنات الوظائف أي ً‬
‫الوصفية بالوظائف‪ .‬يتم استخدام تدوين نقطة السمة العادية للحصول على هذه السمات‪ L‬وتعيينها‪ .‬الحظ أن التنفيذ الحالي يدعم فقط‬
‫‪.‬سمات الوظيفة في الوظائف المعرفة من قبل المستخدم‪  .‬قد يتم دعم سمات‪ L‬الوظائف في الوظائف المضمنة في المستقبل‬

‫‪.‬يمكن استخدام هذا للحصول على قيمة الخلية ‪ ،‬وكذلك لتعيين القيمة‪ cell_contents. ‬كائن الخلية له السمة‬

‫يمكن استرجاع معلومات إضافية حول تعريف الوظيفة من كائن التعليمات البرمجية الخاص بها ؛‪ ‬راجع وصف األنواع الداخلية‬
‫‪.‬وحدة نمطية‪ types ‬نوع يمكن الوصول إليها في‪ cell‬أدناه‪ .‬و‬

‫طرق المثيل‬

‫‪.‬يجمع كائن أسلوب المثيل بين فئة ومثيل فئة وأي كائن قابل لالستدعاء (عاد ًة وظيفة محددة من قبل المستخدم)‬

‫( هي وثائق الطريقة__‪ __doc‬وهو كائن الوظيفة ؛__‪ ، __func‬هو كائن مثيل الفئة__‪: __self‬السمات‪ L‬الخاصة للقراءة فقط‬
‫هو اسم الوحدة __‪ __module‬؛ )__‪ __func__.__name‬مثل( هو اسم الطريقة__‪ __name‬؛ )__‪ __func__.__doc‬مثل‬
‫‪.‬إذا لم تكن متاحة‪ None‬النمطية التي تم تعريف الطريقة بها ‪ ،‬أو‬

‫‪.‬تدعم األساليب أي ً‬
‫ض ا الوصول (وليس اإلعداد) إلى سمات الوظيفة التعسفية على كائن الوظيفة األساسي‬

‫يمكن إنشاء كائنات الطريقة المعرفة من قبل المستخدم عند الحصول على سمة لفئة (ربما عبر مثيل من تلك الفئة) ‪ ،‬إذا كانت هذه‬
‫‪.‬السمة عبارة عن كائن دالة محدد بواسطة المستخدم أو كائن أسلوب فئة‬

‫‪Pg. 21‬‬
‫عندما يتم إنشاء كائن أسلوب المثيل عن طريق استرداد كائن دالة معرف من قبل المستخدم من فئة عبر إحدى مثيالته ‪،‬‬
‫سمة‪ ‬األسلوب الجديد‪ ‬هي كائن الوظيفة __‪. __func‬السمة‪ ‬الخاصة به‪  ‬هي المثيل ‪ ،‬ويقال أن كائن األسلوب مرتبط__‪ __self‬فإن‬
‫‪.‬األصلي‬

‫السمة‪ ‬الخاصة به‪ ‬هي الفئة __‪ __self‬عندما يتم إنشاء كائن أسلوب مثيل عن طريق استرداد كائن أسلوب فئة من فئة أو مثيل ‪ ،‬فإن‬
‫‪.‬والسمة‪ ‬الخاصة به‪ ‬هي كائن الوظيفة الذي يقوم عليه أسلوب الفئة__‪ ، __func‬نفسها‬

‫أمام قائمة )__‪ ( __self‬وإدراج مثيل الفئة ‪ ( __func__) ،‬عندما يتم استدعاء كائن أسلوب المثيل ‪ ،‬يتم استدعاء الوظيفة األساسية‬
‫يعادل )‪ x.f(1‬فإن االتصال ‪ C،‬وهي مثيل لـ‪ f()، x‬تكون فئة تحتوي على تعريف لوظيفة‪ C‬الوسائط‪ .‬على سبيل المثال ‪ ،‬عندما‬
‫)‪ .C.f(x, 1‬االستدعاء‬

‫سيكون‪ ‬في‪ ‬الواقع الفئة نفسها ‪ __self__ ،‬عندما يتم اشتقاق كائن أسلوب المثيل من كائن أسلوب الفئة ‪ ،‬فإن "مثيل الفئة" المخزن فيه‬
‫‪.‬تكون الوظيفة األساسية‪ f‬حيث)‪ f(C,1‬مكاف ًئا‪ L‬الستدعاء)‪ C.f(1‬أو)‪ x.f(1‬بحيث يكون استدعاء إما‬

‫الحظ أن التحويل من كائن دالة إلى كائن أسلوب مثيل يحدث في كل مرة يتم فيها استرداد السمة من المثيل‪ .‬في بعض الحاالت ‪،‬‬
‫ضا أن هذا التحويل يحدث فقط للوظائف‬ ‫يكون التحسين المثمر هو تعيين السمة لمتغير محلي واستدعاء ذلك المتغير المحلي‪ .‬الحظ أي ً‬
‫المعرفة من قبل المستخدم ؛‪  ‬يتم استرداد الكائنات األخرى القابلة لالستدعاء (وجميع الكائنات غير القابلة لالستدعاء) بدون تحويل‪ .‬من‬
‫المهم أيضً ا مالحظة أن الوظائف المعرفة من قبل المستخدم والتي هي سمات‪ L‬لمثيل فئة ال يتم تحويلها إلى طرق‬
‫‪.‬مرتبطة ؛‪ ‬يحدث‪ ‬هذا‪ ‬فقط‪ ‬عندما تكون الوظيفة سمة من سمات‪ L‬الفئة‬

‫وظائف المولد‬

‫العبارة (انظر قسم‪ ‬بيان العائد‪ ) ‬تسمى‪ ‬وظيفة المولد‪ . ‬مثل هذه الوظيفة ‪ ،‬عند استدعائها ‪ yield ،‬الوظيفة أو الطريقة التي تستخدم‬
‫سيؤدي‪ ‬استدعاء‪ ‬طريقة‪ ‬المكرر‪ ‬إلى تنفيذ‪: iterator.__next__() ‬تقوم دائ ًما بإرجاع كائن مكرر يمكن استخدامه لتنفيذ جسم الوظيفة‬
‫يتم رفع ‪ ، StopIteration ‬عبارة أو تقع في النهاية‪ return‬العبارة‪ .‬عندما تقوم الدالة بتنفيذ‪ yield‬الوظيفة حتى توفر قيمة باستخدام‬
‫‪.‬استثناء وسيصل المكرر إلى نهاية مجموعة القيم المراد إرجاعها‬

‫‪ Coroutine‬وظائف‬

‫مثل هذه الوظيفة ‪ ،‬عند استدعائها ‪ coroutine .  ،‬تسمى‪ ‬الوظيفة أو الطريقة التي يتم تحديدها باستخدام‪ ‬وظيفة‬
‫أنها قد تحتوي على‪ ‬عبارات‪ ،‬وكذلك‪ ‬و‪ ‬البيانات‪ .‬راجع أيضًا‪ ‬قسم‪ ‬كائنات‪ coroutine . ‬ترجع‪ ‬كائن‬
‫‪Coroutine .async defawaitasync withasync for‬‬

‫وظائف المولد غير المتزامن‬


‫تسمى‪ ‬الوظيفة أو الطريقة التي يتم تحديدها باستخدام‪ ‬العبارة‪ ‬والتي تستخدم‪ ‬العبارة‪ ‬وظيفة المولد غير المتزامن‪ . ‬مثل هذه الوظيفة ‪،‬‬
‫‪.async defyieldasync for‬عند استدعائها ‪ ،‬ترجع كائن مكرر غير متزامن يمكن استخدامه في‪ ‬عبارة لتنفيذ جسم الوظيفة‬

‫سيؤدي‪ ‬استدعاء‪ ‬طريقة‪ ‬المكرر‪ ‬غير المتزامن إلى‪ ‬إرجاع أمر‪ ‬منتظر‪ ‬والذي سيتم تنفيذه عند انتظاره حتى)(__‪aiterator.__anext‬‬


‫يتم رفع ‪ ، StopAsyncIteration‬بيا ًنا‪ً  ‬‬
‫فارغا‪ ‬أو تسقط من النهاية‪ return ‬التعبير‪ .‬عندما تنفذ الدالة‪ yield ‬يوفر قيمة باستخدام‬
‫‪.‬استثناء وسيصل المكرر غير المتزامن إلى نهاية مجموعة القيم التي سيتم إنتاجها‬

‫وظائف مدمجة‬

‫هي وحدة ‪ math.sin()( math‬و)(‪ len‬أمثلة على الوظائف المضمنة هي‪ C. ‬كائن الوظيفة المضمنة عبارة عن غالف حول دالة‬
‫هي سلسلة وثائق __‪: __doc‬السمات الخاصة للقراءة فقط‪ C. ‬يتم تحديد عدد ونوع الوسيطات بواسطة الدالة‪). ‬نمطية‪ ‬مضمنة‪ ‬قياسية‬
‫لكن انظر إلى العنصر (‪ None‬مضبوط على__‪ __self‬هو اسم الوظيفة ؛__‪ __name‬إذا كانت غير متوفرة ؛‪ None‬الوظيفة ‪ ،‬أو‬
‫‪.‬إذا لم تكن متاحة‪ None‬هو اسم الوحدة النمطية التي تم تعريف الوظيفة فيها أو__‪ __module‬؛ )التالي‬

‫طرق مدمجة‬

‫كوسيطة ضمنية إضافية‪ .‬مثال ‪ C‬هذا في الحقيقة تمويه مختلف لوظيفة مضمنة ‪ ،‬هذه المرة تحتوي على كائن تم تمريره إلى وظيفة‬
‫يتم تعيين‪ ‬السمة __‪ ، __self‬هو كائن القائمة‪ .‬في هذه الحالة‪ alist ‬على افتراض ‪ alist.append()،‬على المدمج في الطريقة‬
‫‪ alist .‬الخاصة للقراءة فقط‪ ‬على الكائن الذي يشير إليه‬

‫الطبقات‬

‫‪Pg. 22‬‬
‫الفئات قابلة لالستدعاء‪ .‬تعمل هذه الكائنات عاد ًة كمصانع لحاالت جديدة من نفسها ‪ ،‬لكن االختالفات ممكنة‪ L‬ألنواع الفئات التي‬
‫‪.‬لتهيئة المثيل الجديد)(__‪ ، __init‬وفي الحالة النموذجية ‪ __new__()،‬يتم تمرير وسيطات االستدعاء إلى‪ __new__(). ‬تتجاوز‬

‫مثيالت الفصل‬

‫‪.‬طريقة في فئتها)(__‪ __call‬يمكن جعل مثيالت الفئات التعسفية قابلة لالستدعاء من خالل تحديد‬

‫الوحدات‬
‫وحدات هي وحدة تنظيمية أساسية من التعليمات البرمجية بايثون‪ ،‬ويتم إنشاؤها من قبل‪ ‬نظام استيراد‪ ‬كما يحتج إما عن‬
‫يحتوي‪ __import__(). ‬والمدمج في)(‪ importlib.import_module‬بيان‪ ،‬أو عن طريق استدعاء الوظائف مثل‪ import‬طريق‬
‫سمة ‪ __globals__ ‬هذا هو القاموس المشار إليه بواسطة( كائن الوحدة النمطية على مساحة‪ L‬اسم يتم تنفيذها بواسطة كائن قاموس‬
‫‪ ، m.x‬تتم ترجمة مراجع السمات‪ L‬إلى عمليات البحث في هذا القاموس ‪ ،‬على سبيل المثال‪). ‬الوظائف المحددة في الوحدة النمطية‬
‫ال يحتوي كائن الوحدة النمطية على كائن التعليمات البرمجية المستخدم لتهيئة الوحدة النمطية (نظرً ا ‪ m.__dict__["x"]. ‬مكافئ لـ‬
‫‪.‬ألنه ال يلزمه بمجرد االنتهاء من التهيئة)‬

‫‪  .m.x = 1m.__dict__["x"] = 1‬يقوم تخصيص السمة بتحديث قاموس مساحة اسم الوحدة النمطية ‪ ،‬على سبيل المثال ‪ ،‬يعادل‬

‫‪:‬السمات المحددة مسب ًقا (القابلة للكتابة)‬

‫__‪__name‬‬

‫‪.‬اسم الوحدة‬

‫__‪__doc‬‬

‫‪.‬حالة عدم توفرها‪ None‬سلسلة وثائق الوحدة ‪ ،‬أو في‬

‫__‪__file‬‬

‫يمكن أن السمة مفقودة ألنواع معينة من وحدات‪ __file__  ،‬اسم مسار الملف الذي تم تحميل الوحدة منه ‪ ،‬إذا تم تحميله من ملف‪ .‬و‬
‫التي ترتبط بشكل ثابت إلى مترجم‪  .‬بالنسبة لوحدات االمتداد التي يتم تحميلها ديناميكيًا من مكتبة مشتركة ‪ ،‬فهي اسم ‪ C‬مثل وحدات‬
‫‪.‬مسار ملف المكتبة المشتركة‬

‫__‪__annotations‬‬

‫قاموس يحتوي على‪ ‬شروح متغيرة‪ ‬تم جمعها أثناء تنفيذ جسم الوحدة النمطية‪ .‬للحصول على أفضل ممارسات‪ L‬العمل‬
‫‪ .‬يرجى االطالع على‪ ‬أفضل ممارسات‪ L‬التعليقات التوضيحية ‪ __annotations__،‬مع‬

‫‪.‬هي مساحة‪ L‬اسم الوحدة النمطية ككائن قاموس__‪: __dict‬السمة الخاصة للقراءة فقط‬

‫قواميس الوحدة النمطية ‪ ،‬سيتم مسح قاموس الوحدة عندما تقع ‪ CPython‬بسبب الطريقة التي يمسح بها‪ CPython: ‬تفاصيل تنفيذ‬
‫الوحدة خارج النطاق حتى إذا كان القاموس ال يزال يحتوي على مراجع حية‪  .‬لتجنب ذلك ‪ ،‬انسخ القاموس أو احتفظ بالوحدة النمطية‬
‫‪.‬أثناء استخدام قاموسها مباشرة‬

‫فئات مخصصة‬
‫عاد ًة ما يتم إنشاء أنواع الفئات المخصصة بواسطة تعريفات الفئات (راجع قسم‪ ‬تعريفات الفئات‪ .) ‬تحتوي الفئة على مساحة‪ L‬اسم يتم‬
‫يتم ‪ ، C.x‬تنفيذها بواسطة كائن قاموس‪ .‬تتم ترجمة مراجع سمات‪ L‬الفئة إلى عمليات البحث في هذا القاموس ‪ ،‬على سبيل المثال‬
‫عندما ال يتم ‪). ‬على الرغم من وجود عدد من الروابط التي تسمح بوسائل أخرى لتحديد السمات(]"‪ C.__dict__["x‬ترجمتها إلى‬
‫‪ C3‬العثور على اسم السمة هناك ‪ ،‬يستمر بحث السمة في الفئات األساسية‪ .‬يستخدم هذا البحث عن الفئات األساسية‪ L‬ترتيب دقة طريقة‬
‫الذي يتصرف بشكل صحيح حتى في وجود هياكل وراثة "الماس" حيث توجد مسارات وراثية متعددة تؤدي إلى سلف مشترك‪ .‬يمكن‬
‫في الوثائق المصاحبة لإلصدار ‪ Python 2.3‬المستخدم بواسطة ‪ C3 MRO‬العثور على تفاصيل إضافية حول‬
‫‪ https://www.python.org/download/releases/2.3/mro/.‬في‬

‫‪Pg. 23‬‬
‫__‪ __self‬ينتج‪ ‬عن مرجع سمة الفئة (للفئة‪ ،  ‬على سبيل المثال) كائن أسلوب فئة ‪ ،‬يتم تحويله إلى كائن أسلوب مثيل له‪ C‬عندما‬
‫عندما ينتج عن كائن أسلوب ثابت ‪ ،‬يتم تحويله إلى كائن ملفوف بواسطة كائن األسلوب الثابت‪ .‬راجع قسم "‪ ‬تنفيذ ‪ C. ‬السمة‬
‫‪ __dict__.‬الواصفات"‪  ‬لمعرفة طريقة أخرى قد تختلف فيها السمات المسترجعة من فئة عن تلك الموجودة بالفعل في صفها‬

‫‪.‬تقوم تعيينات سمات‪ L‬الفئة بتحديث قاموس الفئة ‪ ،‬وليس قاموس الفئة األساسية مطل ًقا‬

‫‪.‬يمكن استدعاء كائن فئة (انظر أعاله) للحصول على مثيل فئة (انظر أدناه)‬

‫‪:‬السمات‪ L‬الخاصة‬

‫__‪__name‬‬

‫‪.‬اسم الفصل‬

‫__‪__module‬‬

‫‪.‬اسم الوحدة النمطية التي تم تعريف الفئة فيها‬

‫__‪__dict‬‬

‫‪.‬القاموس الذي يحتوي على مساحة اسم الفصل‬

‫__‪__bases‬‬

‫‪.‬مجموعة تحتوي على الفئات األساسية ‪ ،‬بترتيب تواجدها في قائمة الفئات األساسية‬

‫__‪__doc‬‬

‫‪.‬إذا لم يتم تحديدها‪ None‬سلسلة وثائق الفصل الدراسي ‪ ،‬أو‬

‫__‪__annotations‬‬

‫قاموس يحتوي على‪ ‬شروح متغيرة‪ ‬تم جمعها‪ L‬أثناء تنفيذ جسم الفصل‪ .‬للحصول على أفضل ممارسات‪ L‬العمل‬
‫‪ .‬يرجى االطالع على‪ ‬أفضل ممارسات‪ L‬التعليقات التوضيحية ‪ __annotations__،‬مع‬

‫حاالت الطبقة‬
‫يتم إنشاء مثيل فئة عن طريق استدعاء كائن فئة (انظر أعاله)‪ .‬مثيل فئة له مساحة اسم مطبقة كقاموس وهو المكان األول الذي يتم‬
‫فيه البحث في مراجع السمات‪  .‬عندما ال يتم العثور على سمة هناك ‪ ،‬وكان لفئة المثيل سمة بهذا االسم ‪ ،‬يستمر البحث بسمات‬
‫__‪ __self‬الفئة‪ .‬إذا تم العثور على سمة فئة هي كائن دالة مع ّر ف من قبل المستخدم ‪ ،‬يتم تحويلها إلى كائن أسلوب مثيل الذي تكون‬
‫ضا تحويل كائنات الطريقة الثابتة وطريقة الصنف ؛‪ ‬انظر أعاله تحت "الفئات"‪ .‬راجع قسم‪ ‬تنفيذ‬‫السمة الخاصة به هي المثيل‪ .‬يتم أي ً‬
‫الواصفات‪ ‬لمعرفة طريقة أخرى قد تختلف فيها سمات‪ L‬الفصل المسترجع عبر مثيالته عن الكائنات المخزنة بالفعل في‬
‫‪.‬طريقة ‪ ،‬يتم استدعاؤها لتلبية البحث)(__‪ __getattr‬إذا لم يتم العثور على سمة للفئة ‪ ،‬وكان لفئة الكائن‪__dict__. ‬الفصل‬

‫تقوم عمليات حذف وتخصيصات السمات‪ L‬بتحديث قاموس المثيل ‪ ،‬وليس قاموس الفصل مطل ًقا‪ .‬إذا كانت الفئة تحتوي‬
‫‪.‬فسيتم استدعاؤها بدالً من تحديث قاموس المثيل مباشر ًة ‪ __delattr__()،‬أو)(__‪ __setattr‬على‪ ‬طريقة‬

‫يمكن أن تتظاهر مثيالت الفئة بأنها أرقام أو تسلسالت أو تعيينات إذا كانت لديها طرق بأسماء خاصة معينة‪ .‬انظر قسم‪ ‬أسماء الطرق‬
‫‪ .‬الخاصة‬

‫‪.‬هي فئة المثيل__‪ __class‬هو قاموس السمات ؛__‪: __dict‬السمات‪ L‬الخاصة‬

‫كائنات اإلدخال ‪ /‬اإلخراج (المعروفة أيضً ا باسم كائنات الملفات)‬

‫المدمج في وظيفة‪ open() ،‬كائن ملف‪ ‬يمثل ملف مفتوح‪ .‬اختصارات المختلفة المتاحة إلنشاء كائنات ملف‪ :‬ل‪A ‬‬
‫طريقة مأخذ الكائنات (وربما عن طريق وظائف أو األساليب األخرى المقدمة )(‪ makefile‬و)(‪ os.popen()، os.fdopen‬وأيضا‬
‫‪.‬من قبل وحدات التمديد)‬

‫‪Pg. 24‬‬
‫يتم تهيئة إلى ملف كائنات الموافق المترجم المدخالت والمخرجات والخطأ تيارات ‪ sys.stderr‬و‪ sys.stdin، sys.stdout‬الكائنات‬
‫‪.‬فئة الملخص‪ io.TextIOBase ‬القياسية؛‪  ‬كلها مفتوحة في وضع النص ‪ ،‬وبالتالي تتبع الواجهة المحددة بواسطة‬

‫األنواع الداخلية‬
‫يتم عرض بعض األنواع المستخدمة داخليًا بواسطة المترجم الفوري للمستخدم‪ .‬قد تتغير تعريفاتهم مع اإلصدارات المستقبلية من‬
‫‪.‬المترجم الشفهي ‪ ،‬ولكن تم ذكرها هنا للتأكد من اكتمالها‬

‫كائنات التعليمات البرمجية‬

‫القابل للتنفيذ المترجم‪ ‬بالبايت‪ ، ‬أو رمز‪ ‬بايت‪ . ‬الفرق بين كائن التعليمات البرمجية ‪ Python‬تمثل كائنات‪ ‬التعليمات البرمجية كود‬
‫للوظيفة (الوحدة النمطية التي تم تعريفها فيها) ‪ ،‬بينما ال ‪ globals‬وكائن الوظيفة هو أن كائن الوظيفة يحتوي على مرجع صريح إلى‬
‫يحتوي كائن التعليمات البرمجية على سياق ؛‪ ‬يتم أيضً ا تخزين قيم الوسيطة االفتراضية في كائن الوظيفة ‪ ،‬وليس في كائن التعليمات‬
‫البرمجية (ألنها تمثل القيم المحسوبة في وقت التشغيل)‪  .‬على عكس كائنات الوظيفة ‪ ،‬فإن كائنات التعليمات البرمجية غير قابلة‬
‫‪.‬للتغيير وال تحتوي على مراجع (بشكل مباشر أو غير مباشر) للكائنات القابلة للتغيير‬

‫هو العدد اإلجمالي للحجج الموضعية (بما في ذلك ‪ co_argcount‬تعطي اسم الوظيفة ؛‪: co_name‬سمات خاصة للقراءة فقط‬
‫هو عدد الوسائط الموضعية فقط (بما في ذلك ‪ co_posonlyargcount‬الحجج والوسيطات الموضعية فقط ذات القيم االفتراضية) ؛‬
‫هو عدد وسيطات الكلمات الرئيسية فقط (بما في ذلك الوسائط ذات القيم ‪ co_kwonlyargcount‬الوسائط ذات القيم االفتراضية) ؛‬
‫هي ‪ co_varnames‬هو عدد المتغيرات المحلية التي تستخدمها الوظيفة (بما في ذلك الوسائط) ؛‪ co_nlocals‬االفتراضية) ؛‬
‫هي مجموعة تحتوي على أسماء المتغيرات ‪ co_cellvars‬مجموعة تحتوي على أسماء المتغيرات المحلية (تبدأ بأسماء‪ L‬الوسيطات) ؛‬
‫هي مجموعة تحتوي على أسماء المتغيرات ‪ co_freevars‬المحلية التي يتم الرجوع إليها بواسطة وظائف متداخلة ؛‬
‫هي مجموعة تحتوي على القيم الحرفية ‪co_consts‬عبارة عن سلسلة تمثل تسلسل تعليمات الرمز الثانوي ؛‪ co_code‬الحرة ؛‬
‫‪ co_filename‬هي مجموعة تحتوي على األسماء التي يستخدمها الرمز الثانوي ؛‪ co_names‬المستخدمة بواسطة الرمز الثانوي ؛‬
‫عبارة عن سلسلة ترميز ‪ co_lnotab‬هو رقم السطر األول للوظيفة ؛‪ co_firstlineno‬هو اسم الملف الذي تم تجميع الكود منه ؛‬
‫هو ‪ co_stacksize‬التعيين من إزاحة الرمز الثانوي إلى أرقام األسطر (لمزيد من التفاصيل ‪ ،‬راجع الكود المصدري للمترجم) ؛‬
‫‪.‬هو عدد صحيح يقوم بترميز عدد من األعالم للمترجم‪ co_flags‬حجم المكدس المطلوب ؛‬

‫بناء الجملة لقبول ‪ *arguments‬يتم تعيين‪ ‬البت‪ ‬إذا كانت الوظيفة تستخدم‪ co_flags: 0x04‬يتم تعريف بتات العلم التالية من أجل‬
‫بناء الجملة لقبول وسيطات ‪ **keywords‬يتم تعيين‪ ‬البت‪ ‬إذا كانت الوظيفة تستخدم‪x08‬عدد عشوائي من الوسائط الموضعية ؛‪0 ‬‬
‫‪.‬يتم تعيين‪ ‬البت‪ ‬إذا كانت الوظيفة عبارة عن مولد‪x20‬الكلمات األساسية التعسفية ؛‪0 ‬‬

‫تستخدم إعالنات الميزات المستقبلية (‪ ) ‬أيضً ا بتات‪  ‬لإلشارة إلى ما إذا كان قد تم تجميع كائن التعليمات البرمجية مع تمكين ميزة‬
‫معينة‪ :‬يتم تعيين‪ ‬البت‪  ‬إذا تم تجميع الوظيفة مع تمكين التقسيم المستقبلي ؛‪ ‬بت‪ ‬و‪ ‬كانت تستخدم في اإلصدارات السابقة من‬
‫‪.from __future__ import divisionco_flags0x20000x100x1000‬بيثون‬

‫‪.‬محجوزة لالستخدام الداخلي‪ co_flags‬وحدات البت األخرى‬

‫إذا كان غير ‪ None‬هو سلسلة وثائق الوظيفة ‪ ،‬أو‪ co_consts‬إذا كان كائن التعليمات البرمجية يمثل دالة ‪ ،‬فإن العنصر األول في‬
‫‪.‬معرف‬

‫كائنات اإلطار‬
‫‪.‬ويتم تمريرها أي ً‬
‫ضا إلى وظائف التتبع المسجلة ‪) ،‬انظر أدناه( ‪ traceback‬تمثل كائنات اإلطار إطارات التنفيذ‪ .‬قد تحدث في كائنات‬

‫إذا كان هذا هو إطار المكدس ‪ None‬هي إلطار المكدس السابق (باتجاه المتصل) ‪ ،‬أو‪: f_back‬سمات خاصة للقراءة فقط‬
‫هو القاموس المستخدم للبحث عن المتغيرات ‪ f_locals ‬هو كائن الكود الذي يتم تنفيذه في هذا اإلطار ؛‪ f_code‬السفلي ؛‬
‫يعطي تعليمات دقيقة ‪ f_lasti‬يستخدم لألسماء المضمنة (الجوهرية) ؛‪ f_builtins‬يستخدم للمتغيرات العالمية ؛‪ f_globals‬المحلية ؛‬
‫‪(.‬هذا فهرس في سلسلة بايت كود كائن التعليمات البرمجية)‬

‫‪ "f_code".‬و‪ obj‬بحجج‪ object.__getattr__ ‬يثير‪ ‬الحدث التدقيق‪ f_code‬الوصول إلى‬

‫فهي دالة يتم استدعاؤها ألحداث مختلفة أثناء تنفيذ التعليمات البرمجية ‪ None،‬إذا لم يكن األمر كذلك‪: f_trace‬سمات‪ L‬خاصة للكتابة‬
‫‪( f_trace_lines‬يستخدمها مصحح األخطاء)‪ .‬عاد ًة ما يتم تشغيل حدث لكل سطر مصدر جديد ‪ -‬يمكن تعطيل هذا من خالل الضبط‬
‫‪ False.‬على‬

‫‪Pg. 25‬‬
‫الحظ أن هذا قد يؤدي ‪ True. ‬ل‪ f_trace_opcodes‬تطبيقات‪ ‬قد‪  ‬تسمح األحداث لكل شفرة تشغيل إلى أن يطلب من خالل وضع‬
‫‪.‬إلى سلوك مترجم غير محدد إذا تهربت االستثناءات التي أثيرت بواسطة وظيفة التتبع من الوظيفة التي يتم تتبعها‬

‫هو رقم السطر الحالي لإلطار ‪ -‬الكتابة إلى هذا من داخل دالة التتبع تنتقل إلى السطر المحدد (فقط لإلطار السفلي)‪ .‬يمكن ‪f_lineno‬‬
‫ضا باسم( ‪ Jump‬لمصحح األخطاء تنفيذ أمر‬‫‪ f_lineno.‬عن طريق الكتابة إلى )‪ Set Next Statement‬المعروف أي ً‬

‫‪:‬تدعم كائنات اإلطار طريقة واحدة‬

‫)(‪frame.clear‬‬
‫ً‬
‫مولدا ‪ ،‬يتم االنتهاء‬ ‫تمسح هذه الطريقة جميع اإلشارات إلى المتغيرات المحلية التي يحتفظ بها اإلطار‪ .‬أي ً‬
‫ضا ‪ ،‬إذا كان اإلطار يخص‬
‫من المولد‪  .‬يساعد هذا في كسر الدورات المرجعية التي تتضمن كائنات اإلطار (على سبيل المثال عند اصطياد استثناء وتخزين التتبع‬
‫‪.‬الخاص به الستخدامه الح ًقا)‬

‫‪.‬يتم رفعه إذا كان اإلطار قيد التنفيذ حاليًا‪RuntimeError ‬‬

‫الجديد في اإلصدار ‪3.4.1‬‬


‫كائنات التتبع‬

‫ضمنيًا عند حدوث استثناء ‪ ،‬ويمكن أيضً ا إنشاؤه بشكل ‪ traceback‬تتبع مكدس استثناء‪ .‬يتم إنشاء كائن ‪ Traceback‬تمثل كائنات‬
‫‪ types.TracebackType.‬صريح عن طريق االستدعاء‬

‫بالنسبة لعمليات التتبع التي تم إنشاؤها ضمنيًا ‪ ،‬عندما يؤدي البحث عن معالج االستثناء إلى فك حزمة التنفيذ ‪ ،‬يتم إدراج كائن‬
‫(‪. ‬الحالي‪ .‬عند إدخال معالج استثناء ‪ ،‬يتم توفير تتبع المكدس للبرنامج ‪ traceback‬في كل مستوى غير مناسب‪ L‬أمام ‪traceback‬‬
‫يمكن الوصول إليها كعنصر ثالث من المجموعة التي يتم إرجاعها )‪ try .‬راجع قسم‪ ‬عبارة‬
‫‪.‬وكسمة لالستثناء الذي تم اكتشافه__‪ sys.exc_info()، __traceback‬بواسطة‬

‫عندما ال يحتوي البرنامج على معالج مناسب‪ ، L‬تتم كتابة تتبع المكدس (منسق بشكل جيد) إلى تدفق الخطأ القياسي ؛‪ ‬إذا كان المترجم‬
‫ضا للمستخدم على شكل‬ ‫‪ sys.last_traceback.‬تفاعليًا ‪ ،‬فسيتم إتاحته أي ً‬

‫ربط السمات‪ L‬لتشكيل ‪ tb_next‬بالنسبة لعمليات التتبع التي تم إنشاؤها بشكل صريح ‪ ،‬فإن األمر متروك لمنشئ التتبع لتحديد كيفية‬
‫‪.‬تتبع مكدس كامل‬

‫يعطي رقم السطر حيث حدث ‪ tb_lineno‬يشير إلى إطار التنفيذ للمستوى الحالي ؛‪: tb_frame‬سمات خاصة للقراءة فقط‬
‫عن رقم السطر الخاص ‪ traceback‬يشير إلى التعليمات الدقيقة‪ .‬قد يختلف رقم السطر والتعليمات األخيرة في‪ tb_lasti‬االستثناء ؛‬
‫‪.‬عبارة ال تحتوي على مطابقة باستثناء عبارة أو مع عبارة أخيرة‪ try‬بكائن اإلطار الخاص به إذا حدث االستثناء في‬

‫‪ "tb_frame".‬و‪ obj‬بحجج‪ object.__getattr__ ‬يثير‪ ‬الحدث التدقيق‪ tb_frame‬الوصول إلى‬

‫إذا لم يكن ‪ None‬هي المستوى التالي في تتبع المكدس‪( L‬باتجاه اإلطار الذي حدث فيه االستثناء) ‪ ،‬أو‪: tb_next‬سمة الكتابة الخاصة‬
‫تال‬
‫‪.‬هناك مستوى ٍ‬
‫ويمكن ‪ Python ، tb_next‬بشكل صريح من كود ‪ Traceback‬تم التغيير في اإلصدار ‪ :3.7‬يمكن اآلن إنشاء مثيل لكائنات‬
‫‪.‬تحديث سمة المثيالت الموجودة‬

‫قطع األشياء إلى شرائح‬

‫‪.‬الوظيفة المضمنة)(‪ slice‬للطرق‪ .‬يتم إنشاؤها أيضً ا بواسطة‪ُ  __getitem__() ‬تستخدم كائنات الشرائح لتمثيل الشرائح‬

‫إذا تم حذفها‪ None.‬هي قيمة الخطوة ؛‪ ‬كل منها ‪. step‬هو الحد األعلى‪ stop‬هي الحد األدنى ؛‪: start‬سمات خاصة للقراءة فقط‬
‫‪ .‬يمكن أن يكون لهذه السمات أي نوع‬

‫‪:‬تدعم كائنات الشرائح طريقة واحدة‬

‫‪ ) ‬ذاتي‪ ، ‬طول ‪slice.indices( ‬‬

‫‪Pg. 26‬‬
‫تأخذ هذه الطريقة‪ ‬طول‪ ‬وسيطة عدد صحيح واحد‪  ‬وتحسب المعلومات حول الشريحة التي سيصفها كائن الشريحة إذا تم تطبيقها على‬
‫سلسلة من‪ ‬عناصر‪ ‬الطول‪ . ‬تقوم بإرجاع مجموعة مكونة من ثالثة أعداد صحيحة ؛‪ ‬على التوالي وهذه هي‪ ‬البداية‪ ‬و‪ ‬توقف‪ ‬المؤشرات‬
‫‪.‬و‪ ‬خطوة‪ ‬أو خطوة طول شريحة‪  .‬يتم التعامل مع الفهارس المفقودة أو الخارجة عن الحدود بطريقة تتفق مع الشرائح العادية‬

‫كائنات الطريقة الثابتة‬


‫توفر كائنات الطريقة الثابتة طريقة للتغلب على تحويل كائنات الوظيفة إلى كائنات الطريقة الموضحة أعاله‪ .‬كائن األسلوب الثابت‬
‫عبارة عن غالف حول أي كائن آخر ‪ ،‬وعادة ما يكون كائن أسلوب محدد بواسطة المستخدم‪ .‬عندما يتم استرداد كائن األسلوب الثابت‬
‫من فئة أو مثيل فئة ‪ ،‬فإن الكائن الذي تم إرجاعه بالفعل هو الكائن الملتف ‪ ،‬والذي ال يخضع ألي تحويل إضافي‪ .‬كائنات الطريقة‬
‫‪ .‬المُنشئ‪ ‬المدمج )(‪ staticmethod‬الثابتة قابلة لالستدعاء أيضًا‪ .‬يتم إنشاء كائنات الطريقة الثابتة بواسطة‬

‫كائنات طريقة الفئة‬


‫كائن طريقة الفئة ‪ ،‬مثل كائن األسلوب الثابت ‪ ،‬عبارة عن غالف حول كائن آخر يغير الطريقة التي يتم بها استرداد هذا الكائن من‬
‫الفئات ومثيالت الفئة‪  .‬تم وصف سلوك كائنات طريقة الفئة عند هذا االسترجاع أعاله ‪ ،‬تحت عنوان "طرق معرّ فة من قبل‬
‫‪ .‬المُنشئ‪ ‬المدمج )(‪ classmethod‬المستخدم"‪ .‬يتم إنشاء كائنات أسلوب الفئة بواسطة‬

‫‪ ‬أسماء الطرق الخاصة‪3.3 ‬‬

‫يمكن للفئة تنفيذ عمليات معينة يتم استدعاؤها بواسطة بناء جملة خاص (مثل العمليات الحسابية أو االشتراك والتقسيم إلى شرائح)‬
‫في‪ ‬التحميل الزائد للمشغل‪ ، ‬مما يسمح للفئات بتحديد سلوكها فيما ‪ Python‬عن طريق تعريف األساليب بأسماء‪ L‬خاصة‪ .‬هذا هو نهج‬
‫تكون ]‪ x[i‬مثياًل لهذه الفئة ‪ ،‬فعندئذٍ‪ x‬وكانت ‪ __getitem__()،‬يتعلق بمشغلي اللغة‪ .‬على سبيل المثال ‪ ،‬إذا حددت فئة طريقة مسماة‪L‬‬
‫مكافئة‪ L‬تقريبًا لـ‪  . ‬باستثناء ما تم ذكره ‪ ،‬تثير محاوالت تنفيذ عملية استثنا ًء عندما ال يتم تحديد طريقة مناسبة‬
‫‪(.type(x).__getitem__(x, i)AttributeErrorTypeError‬عاد ًة‪ ‬أو‪) ‬‬

‫‪ None،‬إلى)(__‪ __iter‬لإلشارة إلى أن العملية المقابلة غير متاحة‪ .‬على سبيل المثال ‪ ،‬إذا تم تعيين فئة‪ None‬تعيين طريقة خاصة‬
‫دون الرجوع (‪ a TypeError‬سيؤدي إلى رفع)(‪ iter‬فلن يكون الفصل قابالً للتكرار ‪ ،‬لذا فإن استدعاء مثيالته‬
‫‪ __getitem__()). 2‬إليه‬

‫عند تنفيذ فئة تحاكي أي نوع مضمن ‪ ،‬من المهم أال يتم تنفيذ المحاكاة‪ L‬إال بالقدر الذي يكون منطقيًا بالنسبة للكائن الذي يتم‬
‫نمذجته‪  .‬على سبيل المثال ‪ ،‬قد تعمل بعض التسلسالت بشكل جيد مع استرجاع العناصر الفردية ‪ ،‬ولكن استخراج شريحة قد ال يكون‬
‫)‪ W3C.‬الواجهة في نموذج كائن مستند‪ NodeList‬أحد األمثلة على ذلك هو(‪. ‬له معنى‬

‫‪ ‬التخصيص األساسي‪3.3.1. ‬‬

‫‪object.__new__( cls  [ ، ...  ] ) ‬‬

‫هي طريقة ثابتة (ذات غالف خاص لذلك ال تحتاج إلى التصريح عنها على )(__‪ cls . __new‬تم استدعاؤه إلنشاء مثيل جديد للفئة‬
‫هذا النحو) تأخذ الفئة التي تم طلب مثيل لها كوسيطة أولى لها‪  .‬الوسيطات المتبقية هي تلك التي تم تمريرها إلى تعبير مُنشئ الكائن‬
‫‪ cls ).‬عاد ًة مثيل( يجب أن تكون‪ ‬قيمة اإلرجاع‪ ‬هي مثيل الكائن الجديد)(__‪(. __new‬استدعاء الفئة)‬
‫ً‬
‫جديدا للفئة عن طريق استدعاء‬ ‫طريقة‪ ‬الطبقة الفائقة‪ ‬باستخدام‪ ‬الوسيطات المناسبة ثم )(__‪ُ  __new‬تنشئ التطبيقات النموذجية مثياًل‬
‫ً‬
‫)]‪.super().__new__(cls[, ...‬تعديل المثيل الذي تم إنشاؤه حديثا حسب الضرورة قبل إعادته‬

‫فسيتم استدعاء طريقة‪ ‬المثيل الجديد‪ ‬مثل‪ ، ‬حيث )(__‪ cls ، __init‬تم استدعاءه أثناء بناء الكائن‪ ‬وأعاد مثياًل ‪ ‬لـ)(__‪ __new‬إذا‬
‫)]‪.__init__(self[, ...‬هي المثيل الجديد والوسيطات المتبقية هي نفسها التي تم تمريرها إلى مُنشئ الكائن‪ self ‬تكون‬

‫‪ .‬فلن يتم استدعاء طريقة‪ ‬المثيل الجديد)(__‪ cls ، __init‬مثيل)(__‪ __new‬إذا‪ ‬لم يُرجع‬

‫لتخصيص )‪ tuple‬أو ‪ str‬أو ‪ int‬مثل( الغرض األساسي منه هو السماح للفئات الفرعية لألنواع غير القابلة للتغيير)(__‪__new‬‬
‫‪.‬إنشاء المثيل‪ .‬يتم أيضً ا تجاوزه بشكل شائع في الفئات الوصفية المخصصة من أجل تخصيص إنشاء الفصل‬

‫‪ [ ، ...  ] ) ‬النفس ‪object.__init__( ‬‬

‫‪Pg. 27‬‬
‫ولكن قبل إعادته إلى المتصل‪ .‬الوسيطات هي تلك التي تم تمريرها إلى ‪ __new__()) ،‬بواسطة( يتم استدعاؤه بعد إنشاء المثيل‬
‫إن وجدت ‪ ،‬يجب أن ‪ __init__()،‬طريقة ‪ ،‬فإن طريقة الفئة المشتقة‪ __init__() ‬تعبير مُنشئ الفئة‪ .‬إذا كان للفئة األساسية‬
‫ً‬
‫صراحة لضمان التهيئة الصحيحة لجزء الفئة األساسية من المثيل ؛‪ ‬على سبيل المثال‬ ‫‪: super().__init__([args...]).‬تستدعيها‬

‫‪ None‬ال غير ‪)،‬تخصيص ذلك)(__‪ __init‬إلنشائه‪ ،‬و)(__‪ ( __new‬معا العمل في بناء األجسام‪ __init__()L‬و)(__‪ __new‬ألن‬


‫‪.‬في وقت التشغيل ‪ a‬إلى رفع‪ TypeError‬سيؤدي القيام بذلك‪ __init__(). ‬قد يتم إرجاع القيمة‬

‫‪ ) ‬ذاتي ‪object.__del__( ‬‬

‫ضا أداة التدمير أو (بشكل غير صحيح) المدمر‪ .‬إذا كان‬‫تم استدعاؤه عندما يكون المثيل على وشك أن يتم إتالفه‪ .‬وهذا ما يسمى أي ً‬
‫صراحة لضمان الحذف ‪ __del__()،‬طريقة ‪ ،‬فإن طريقة الفئة المشتقة)(__‪ __del‬للفئة األساسية‪L‬‬ ‫ً‬ ‫إن وجدت ‪ ،‬يجب أن تستدعيها‬
‫‪.‬المناسب لجزء الفئة األساسية من المثيل‬

‫لألسلوب أن يؤجل تدمير المثيل عن طريق إنشاء مرجع جديد له‪ .‬هذا )(__‪ __del‬من الممكن (وإن لم يكن موصى به!)‬
‫يتم استدعاؤه مرة ثانية عندما يكون الكائن الذي تم إحيائه على وشك )(__‪ __del‬يسمى‪ ‬قيامة‪ ‬الكائن‪ . ‬يعتمد على التنفيذ ما إذا كان‬
‫‪.‬الحالي‪ ‬يدعو مرة واحدة فقط‪ CPython ‬تدميره ؛‪ ‬تطبيق‬

‫‪.‬يتم استدعاء األساليب لألشياء التي ال تزال موجودة عند خروج المترجم)(__‪ __del‬ليس مضمو ًنا أن‬

‫ملحوظة‬

‫‪ ‬‬

‫يصل ‪ x‬بمقدار واحد ‪ ،‬ويتم استدعاء األخير فقط عندما‪ x‬األول يقلل من عدد المراجع ‪ x.__del__()-‬ال يستدعي بشكل مباشر‪del x‬‬
‫‪.‬عدد المرجع إلى الصفر‬

‫من‪  ‬الممكن لدورة مرجعية أن تمنع العد المرجعي لكائن ما من الذهاب إلى الصفر‪ .‬في هذه الحالة ‪ ،‬سيتم ‪ CPython:‬تفاصيل تطبيق‬
‫اكتشاف الدورة الح ًقا وحذفها بواسطة‪ ‬جامع القمامة الدوري‪ . ‬السبب الشائع للدورات المرجعية هو عندما يتم اكتشاف استثناء في‬
‫الخاص به ‪ ،‬والذي يشير إلى السكان ‪ traceback‬متغير محلي‪  .‬ثم يشير السكان المحليون لإلطار إلى االستثناء ‪ ،‬الذي يشير إلى‬
‫‪ traceback.‬المحليين لجميع اإلطارات التي تم التقاطها في‬

‫أنظر أيضا‬

‫‪ ‬‬

‫‪.‬للوحدة‪ gc‬التوثيق‬

‫تحذير‬

‫‪ ‬‬

‫يتم‪ ‬بموجبها‪  ‬استدعاء الطرق ‪ ،‬يتم تجاهل االستثناءات التي تحدث أثناء تنفيذها ‪ ،‬ويتم )(__‪ __del‬نظرً ا للظروف غير المستقرة التي‬
‫‪:‬بدالً من ذلك‪ .‬خاصه‪ sys.stderr‬طباعة تحذير‬

‫‪‬‬ ‫يمكن استدعاءها عند تنفيذ تعليمات برمجية عشوائية ‪ ،‬بما في ذلك من أي مؤشر ترابط )(__‪__del‬‬
‫احتاج األمر إلى قفل أو استدعاء أي مورد حظر آخر ‪ ،‬فقد يؤدي ذلك إلى طريق مسدود حيث قد)(__‪ __del‬عشوائي‪ .‬إذا‬
‫‪ __del__().‬يتم أخذ المورد بالفعل بواسطة الكود الذي تمت مقاطعته للتنفيذ‬

‫‪‬‬ ‫يمكن تنفيذها أثناء إيقاف تشغيل المترجم‪  .‬نتيجة لذلك ‪ ،‬قد تكون المتغيرات العالمية التي يحتاجها للوصول (بما)(__‪__del‬‬
‫حذف الكرات األرضية ‪ Python‬تضمن‪ None. ‬في ذلك الوحدات النمطية األخرى) قد تم حذفها بالفعل أو ضبطها عليها‬
‫التي يبدأ اسمها بشرطة سفلية واحدة من الوحدة النمطية الخاصة بها قبل حذف الكرات األرضية األخرى ؛‪ ‬في حالة عدم‬
‫وجود مراجع أخرى لمثل هذه الكرات األرضية ‪ ،‬فقد يساعد ذلك في ضمان استمرار توفر الوحدات النمطية المستوردة في‬
‫‪.‬يتم فيه استدعاء الطريقة)(__‪ __del‬الوقت الذي‬

‫‪ ) ‬ذاتي ‪object.__repr__( ‬‬

‫‪Pg. 28‬‬
‫الوظيفة المضمنة لحساب تمثيل السلسلة "الرسمي" للكائن‪ .‬إذا كان ذلك ممك ًنا‪ ، L‬فيجب أن يبدو هذا )(‪ repr‬يتم استدعاؤها بواسطة‬
‫يمكن استخدامه إلعادة إنشاء كائن بنفس القيمة (مع توفير بيئة مناسبة)‪ .‬إذا لم يكن ذلك ممك ًنا ‪ ،‬فيجب ‪ Python‬تعبيرً ا صالحً ا في‬
‫إرجاع‪ ‬سلسلة من النموذج‪ . ‬يجب أن تكون القيمة المعادة كائن سلسلة‪ .‬إذا تم تعريف الفئة‪ ‬ولكن لم يتم‪ ‬تعريفها‪ ، ‬فسيتم‪ ‬استخدامها‬
‫ض ا عندما يكون تمثيل سلسلة "غير رسمي" لمثيالت تلك الفئة‬ ‫أي ً‬
‫)(__‪.<...some useful description...>__repr__()__str__()__repr‬مطلوبًا‬

‫‪.‬يستخدم هذا عاد ًة لتصحيح األخطاء ‪ ،‬لذلك من المهم أن يكون التمثيل غنيًا بالمعلومات وال لبس فيه‬

‫‪ ) ‬ذاتي ‪object.__str__( ‬‬

‫لحساب "غير الرسمي" أو طبع لطيف تمثيل سلسلة كائن‪ .‬يجب )(‪ print‬و)(‪ format‬وظائف المدمج في)‪ str(object‬ودعا من قبل‬
‫‪ .‬أن تكون القيمة‪ ‬المعادة‪ ‬كائن‪ ‬سلسلة‬

‫بإرجاع تعبير بايثون صالح‪ :‬يمكن استخدام تمثيل أكثر )(__‪ __str‬عدم وجود توقع)(__‪ object.__repr‬تختلف هذه الطريقة عن‬
‫ً‬
‫إيجازا‬ ‫‪.‬مالءمة‪ L‬أو‬

‫‪ object.__repr__().‬مكالمات‪ L‬النوع المضمنة‪ object ‬التطبيق االفتراضي المحدد بواسطة‬

‫‪ ) ‬ذاتي ‪object.__bytes__( ‬‬

‫‪.‬كائن‪ bytes‬تم استدعاؤه بواسطة‪ ‬بايت‪ ‬لحساب تمثيل سلسلة بايت لكائن‪ .‬هذا يجب أن يعيد‬

‫‪ ، format_spec ) ‬ذاتي ‪object.__format__( ‬‬

‫األسلوب‪ ،‬إلنتاج "تنسيق" تمثيل )(‪ str.format‬المدمج في وظيفة‪ ،‬وبالتبعية‪ ،‬وتقييم‪ ‬سلسلة حرفية تنسيق‪ ‬و)(‪ format‬ودعا من قبل‬
‫الحجة هي سلسلة تحتوي على وصف لخيارات التنسيق المطلوب‪ .‬يرجع ‪ format_spec ‬سلسلة كائن‪ .‬و‬
‫إال أن معظم الفئات إما ستفوض التنسيق إلى أحد ‪ __format__()،‬إلى النوع الذي يتم تطبيقه‪ format_spec ‬تفسير‪ ‬وسيطة‬
‫‪.‬األنواع المضمنة ‪ ،‬أو تستخدم بنية خيار تنسيق مماثلة‬

‫‪.‬راجع‪ ‬اللغة المصغرة لمواصفات التنسيق‪ ‬للحصول على وصف لبناء جملة التنسيق القياسي‬

‫‪.‬يجب أن تكون القيمة المعادة كائن سلسلة‬

‫تمرير أي سلسلة غير ‪ TypeError if‬بحد ذاتها برفع سلسلة‪ __format__ object‬تم التغيير في اإلصدار ‪ :3.4‬تقوم طريقة‬
‫‪.‬فارغة‬

‫)''‪ .object.__format__(x, '')str(x)format(str(x), ‬تغير في اإلصدار ‪ :3.7‬ما يعادل اآلن‪ ‬بدال من‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__lt__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__le__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__eq__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__ne__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__gt__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__ge__( ‬‬

‫‪: x<y‬هذه هي ما يسمى بأساليب "المقارنة الغنية"‪ .‬المراسالت بين رموز المشغل وأسماء الطريقة هي كما يلي‬
‫‪ x.__ne__(y)، x>y‬المكالمات‪ x.__eq__(y)، x!=yL‬المكالمات‪ x.__le__(y)، x==yL‬المكالمات‪ x.__lt__(y)، x<=y‬المكالمات‪L‬‬
‫‪ x.__ge__(y).‬المكالمات‪ x>=yL‬و ‪ x.__gt__(y)،‬المكالمات‪L‬‬

‫‪ True‬و‪، False‬إذا لم تنفذ العملية لزوج معين من الوسائط‪ .‬من االتفاقية ‪ NotImplemented‬قد تعيد طريقة المقارنة الثرية المفردة‬
‫( يتم إرجاعها لمقارنة ناجحة‪  .‬ومع ذلك ‪ ،‬يمكن لهذه الطرق إرجاع أي قيمة ‪ ،‬لذلك إذا تم استخدام عامل المقارنة في سياق منطقي‬
‫‪.‬القيمة لتحديد ما إذا كانت النتيجة صحيحة أم خاطئة)(‪ bool‬ستستدعي ‪ Python‬فإن ‪) ،‬العبارة‪ if‬على سبيل المثال ‪ ،‬في حالة‬

‫‪Pg. 29‬‬
‫في حالة المقارنة خاطئة‪ . :‬ألنه‪ ، ‬بشكل ‪ NotImplemented‬والعودة ‪ is،‬التي تستخدم)(__‪ __eq‬األدوات‪، object‬افتراضيا‬
‫افتراضي ‪ ،‬يقوم بتفويض‪ ‬النتيجة وعكسها‪ L‬ما لم تكن كذلك‪  . ‬ال توجد عالقات ضمنية أخرى بين عوامل المقارنة أو عمليات التنفيذ‬
‫االفتراضية ؛‪ ‬على سبيل المثال ‪ ،‬حقيقة‪ ‬ال تعني‪ . ‬إلنشاء‪ L‬عمليات ترتيب تلقائيًا من عملية جذر واحدة ‪،‬‬
‫‪ .True if x is y else NotImplemented__ne__()__eq__()NotImplemented(x<y or x==y)x<=yfunctools‬راجع‬
‫)(‪.total_ordering‬‬

‫للحصول‪ ‬على‪ ‬بعض المالحظات‪ L‬المهمة حول إنشاء‪ ‬كائنات‪ ‬قابلة للتجزئة‪ ‬تدعم عمليات )(__‪ __hash‬راجع الفقرة الموجودة في‬
‫‪.‬المقارنة المخصصة ويمكن استخدامها كمفاتيح قاموس‬

‫الوسيطة لهذه األساليب ( ُت ستخدم عندما ال تدعم الوسيطة اليسرى العملية بينما تدعم الوسيطة ‪ swapped-‬ال توجد إصدارات‬
‫هناك تفكير كل منهما‪ __ge__() ،‬و)(__‪، __le‬هي انعكاس بعضهم البعض)(__‪ __gt‬و)(__‪، __lt‬الصحيحة) ؛‪ ‬بدال من ذلك‬
‫هي انعكاس الخاصة بهم‪  .‬إذا كانت المعامالت من أنواع مختلفة ‪ ،‬وكان نوع المعامل األيمن فئة فرعية )(__‪ __ne‬و)(__‪ __eq‬و‬
‫مباشرة أو غير مباشرة من نوع المعامل األيسر ‪ ،‬فإن الطريقة المنعكسة للمعامل األيمن لها األولوية ‪ ،‬وإال فإن طريقة المعامل‬
‫‪.‬األيسر لها األولوية‪ .‬ال يتم اعتبار التصنيف الفرعي الظاهري‬

‫‪ ) ‬ذاتي ‪object.__hash__( ‬‬

‫‪ set، frozenset‬والعمليات على أعضاء مجموعات المجزأة بما في ذلك)(‪ hash‬ودعا من قبل المدمج في وظيفة‬
‫يجب أن ترجع ً‬
‫عددا صحيحً ا‪  .‬الخاصية الوحيدة المطلوبة هي أن الكائنات التي تقارن متساوية لها نفس قيمة )(__‪ dict. __hash‬و‬
‫ا في مقارنة الكائنات عن طريق تجميعها في مجموعة‬ ‫دورً‬ ‫ا‬ ‫أيضً‬ ‫التجزئة ؛‪  ‬يُنصح بمزج قيم التجزئة لمكونات الكائن التي تلعب‬
‫‪:‬وتجزئة المجموعة‪ .‬مثال‬

‫‪def __hash__(self):‬‬

‫))‪return hash((self.name, self.nick, self.color‬‬

‫ملحوظة‬

‫‪ ‬‬

‫عاد ًة ما يكون ‪ Py_ssize_t. ‬األسلوب‪ ‬المخصص لكائن ما‪ ‬إلى حجم ملف)(__‪ __hash‬اقتطاع القيمة التي يتم إرجاعها من)(‪hash‬‬
‫يجب أن يتفاعل‪ ‬كائن مع‪ ‬بنى ذات )(__‪ __hash‬هذا ‪ 8‬بايت على إصدارات ‪ 64‬بت و ‪ 4‬بايت على إصدارات ‪ 32‬بت‪ .‬إذا كان‬
‫‪  .python -‬أحجام بت مختلفة ‪ ،‬فتأكد من التحقق من العرض في جميع البنيات المدعومة‪ .‬طريقة سهلة للقيام بذلك هي باستخدام‬
‫")‪c "import sys; print(sys.hash_info.width‬‬

‫ولكن )(__‪ __eq‬العملية أيضًا ؛‪ ‬إذا تم‪ ‬تعريفها)(__‪ __hash‬طريقة ‪ ،‬فال يجب أن تحدد)(__‪ __eq‬إذا لم تحدد الفئة‬
‫يتم تعريفها ‪ ،‬فلن تكون مثيالتها قابلة لالستخدام كعناصر في مجموعات قابلة للتجزئة‪ .‬إذا‪ ‬حددت‪ ‬فئة كائنات قابلة )(__‪ __hash‬لم‬
‫ألن تنفيذ المجموعات القابلة للتجزئة يتطلب أن تكون قيمة تجزئة ‪ __hash__()،‬طريقة ‪ ،‬فال ينبغي تنفيذها)(__‪ __eq‬للتغيير وتنفذ‬
‫‪.‬المفتاح غير قابلة للتغيير (إذا تغيرت قيمة تجزئة الكائن ‪ ،‬فستكون في دلو التجزئة الخطأ)‬

‫طرق افتراضيا‪ .‬معهم ‪ ،‬تقارن جميع الكائنات غير المتكافئة )(__‪ __hash‬و)(__‪ __eq‬فصول المعرفة من قبل المستخدم لها‬
‫)‪ .x == yx is yhash(x) == hash(y‬وتعيد قيمة مناسبة مثل التي‪ ‬تشير إلى ذلك‪ ‬و)(__‪( x.__hash‬باستثناء نفسها)‬

‫)(__‪ __hash‬عندما تكون‪ None. ‬تعيينها ضمنيًا إلى)(__‪ __hash‬سيتم‪ __hash__() ‬وال تعرف)(__‪ __eq‬الفئة التي تتجاوز‬


‫عندما يحاول البرنامج استرداد قيمة التجزئة الخاصة به ‪ ،‬وسيتم ‪ TypeError‬سترفع مثيالت الفئة المناسبة ‪ None،‬طريقة الفصل‬
‫)‪ .isinstance(obj, collections.abc.Hashable‬أيضً ا تحديدها بشكل صحيح على أنها غير قابلة للتجزئة عند التحقق‬

‫من فئة رئيسية ‪ ،‬فيجب إخبار المترجم بذلك صراحة )(__‪ __hash‬احتاج‪ ‬الفصل الذي يتخطى‪ ‬إلى االحتفاظ بالتنفيذ)(__‪ __eq‬إذا‬
‫__‪ .__hash__ = <ParentClass>.__hash‬عن طريق اإلعداد‬

‫ترغب في منع دعم التجزئة ‪ ،‬فيجب تضمينها‪ ‬في تعريف الفئة‪ .‬الفئة التي تحدد‪ ‬صفتها )(__‪ __eq‬إذا كانت الفئة التي ال تتخطى‬
‫ً‬
‫صراحة‪ ‬سيتم تعريفها بشكل غير صحيح على أنها قابلة للتجزئة‬ ‫التي‪ ‬تثير‬
‫)‪.__hash__ = None__hash__()TypeErrorisinstance(obj, collections.abc.Hashable‬بواسطة‪ ‬مكالمة‪L‬‬

‫ملحوظة‬

‫‪Pg. 30‬‬
‫‪ ‬‬

‫مملحة" بقيمة عشوائية غير متوقعة‪ .‬على الرغم من أنها تظل ثابتة " ‪ bytes‬و ‪ str‬قيم كائنات)(__‪ __hash‬بشكل افتراضي ‪ ،‬تكون‬
‫‪.‬داخل عملية بايثون الفردية ‪ ،‬إال أنها ال يمكن التنبؤ بها بين االستدعاءات المتكررة لبايثون‬

‫يهدف هذا إلى توفير الحماية ضد رفض الخدمة الناتج عن المدخالت المختارة بعناية والتي تستغل أداء الحالة األسوأ إلدخال‬
‫‪.‬للحصول على التفاصيل‪ http://www.ocert.org/advisories/ocert-2011-003.html ‬التعقيد‪ .‬راجع )‪ ، O (n 2 ‬اإلمالء‬
‫ً‬
‫أبد ا ضمانات بشأن هذا الترتيب (وعادة ما تختلف بين ‪ Python‬يؤثر تغيير قيم التجزئة على ترتيب التكرار للمجموعات‪ .‬لم تقدم‬
‫‪.‬إصدارات ‪ 32‬بت و ‪ 64‬بت)‬

‫‪ PYTHONHASHSEED.‬أنظر أيضا‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.3‬يتم تمكين عشوائية التجزئة بشكل افتراضي‬

‫‪ ) ‬ذاتي ‪object.__bool__( ‬‬

‫عندما ال يتم تعريف هذه ‪ True. ‬أو‪ False‬؛‪ ‬يجب أن يعود)(‪ bool‬دعا إلى تنفيذ اختبار قيمة الحقيقة والعملية المدمجة‪L‬‬
‫يتم استدعاؤها ‪ ،‬إذا تم تعريفها ‪ ،‬ويعتبر الكائن صحيحً ا إذا كانت نتيجته غير صفرية‪ .‬إذا لم تحدد الفئة )(__‪ ، __len‬الطريقة‬
‫‪.‬فإن جميع مثيالتها تعتبر صحيحة ‪ __bool__()،‬وال)(__‪ __len‬ال‬

‫‪ ‬تخصيص الوصول إلى السمات‪3.3.2. ‬‬

‫‪.‬لمثيالت الفئة )‪ x.name‬استخدام أو تخصيص أو حذف( يمكن تعريف الطرق التالية لتخصيص معنى الوصول إلى السمة‬

‫‪ ) ‬النفس‪ ، ‬االسم ‪object.__getattr__( ‬‬

‫يرفع‪ ‬اس )(__‪ __getattribute‬إما أن(‪ AttributeError ‬يتم استدعاؤها عندما يفشل الوصول إلى السمة االفتراضية مع‬
‫يجب أن ُترجع هذه الطريقة‪ ). ‬ألن‪ ‬ليس سمة مثيل أو سمة في شجرة الفئة لـ‪ ‬؛ أو‪ ‬من عمليات‪ ‬رفع خاصية‪ ‬االسم ‪AttributeError ‬م‬
‫‪.self__get__()AttributeErrorAttributeError‬قيمة السمة (المحسوبة) أو تثير‪ ‬استثنا ًء‬

‫هذا عدم تناسق مقصود (‪. ‬فلن يتم استدعاءها)(__‪ ، __getattr‬الحظ أنه إذا تم العثور على السمة من خالل اآللية العادية‬
‫لن يكون هناك طريقة )(__‪ __getattr‬ويتم ذلك ألسباب تتعلق بالكفاءة وبخالف ذلك )‪ __setattr__().‬و)(__‪ __getattr‬بين‬
‫للوصول إلى سمات أخرى للمثال‪  .‬الحظ أنه على األقل بالنسبة لمتغيرات المثيل ‪ ،‬يمكنك تزييف التحكم الكامل بعدم إدراج أي قيم في‬
‫الطريقة أدناه للحصول على طريقة )(__‪ __getattribute‬قاموس سمات‪ L‬المثيل (ولكن بدالً من ذلك إدراجها في كائن آخر)‪ .‬راجع‬
‫‪.‬للحصول فعليًا على تحكم كامل في الوصول إلى السمات‪L‬‬

‫‪ ) ‬النفس‪ ، ‬االسم ‪object.__getattribute__( ‬‬

‫فلن يتم ‪  __getattr__()،‬تم استدعاؤه دون قيد أو شرط لتنفيذ عمليات الوصول إلى السمة لمثيالت الفئة‪ .‬إذا تم تعريف الفئة أيضًا‬
‫ً‬
‫‪ AttributeError. ‬صراحة أو رفع)(__‪ __getattribute‬استدعاء األخير ما لم يتم استدعاءه‬ ‫يجب أن ُترجع هذه الطريقة قيمة‬
‫استثناءً‪  .‬من أجل تجنب العودية الالنهائية في هذه الطريقة ‪ ،‬يجب أن يقوم تنفيذها دائمًا ‪ AttributeError‬السمة (المحسوبة) أو تثير‬
‫باستدعاء طريقة الفئة األساسية بنفس االسم للوصول إلى أي سمات تحتاجها ‪ ،‬على سبيل‬
‫)‪ ، .object.__getattribute__(self, name‬المثال‬

‫ملحوظة‬

‫‪ ‬‬

‫قد يتم تجاوز هذه الطريقة عند البحث عن طرق خاصة كنتيجة لالستدعاء الضمني عبر بناء جملة اللغة أو الوظائف‬
‫‪ .‬المضمنة‪ .‬انظر‪ ‬طريقة البحث الخاصة‬

‫‪ name.‬و‪ obj‬باستخدام الوسائط‪ object.__getattr__ ‬بالنسبة إلى بعض عمليات الوصول إلى سمات حساسة ‪ ،‬يثير‪ ‬حدث تدقيق‬

‫‪ ) ‬ذاتي‪ ، ‬اسم‪ ، ‬قيمة ‪object.__setattr__( ‬‬

‫‪Pg. 31‬‬
‫يتم استدعاؤه عند محاولة تعيين سمة‪ .‬يتم استدعاء هذا بدالً من اآللية العادية (أي تخزين القيمة في قاموس‬
‫‪.‬المثيل)‪ .‬االسم‪ ‬هو‪ ‬اسم‪ ‬السمة ‪ ،‬والقيمة‪ ‬هي القيمة التي سيتم تعيينها لها‬

‫تريد التعيين إلى سمة مثيل ‪ ،‬فيجب أن تستدعي طريقة الفئة األساسية بنفس االسم ‪ ،‬على سبيل )(__‪ __setattr‬إذا كنت‬
‫)‪ ، .object.__setattr__(self, name, value‬المثال‬

‫‪ obj، name، value.‬باستخدام الوسائط‪ object.__setattr__ ‬بالنسبة إلى تعيينات سمات‪ L‬حساسة معينة ‪ ،‬يثير‪ ‬حدث تدقيق‬

‫‪ ) ‬النفس‪ ، ‬االسم ‪object.__delattr__( ‬‬

‫‪.del obj.name‬ولكن لحذف السمة بدالً من التنازل‪ .‬يجب تنفيذ هذا فقط إذا كان له‪ ‬معنى بالنسبة للكائن)(__‪ __setattr‬مثل‬

‫‪ name.‬و‪ obj‬بالوسيطات‪ object.__delattr__ ‬بالنسبة لحذف سمات‪ L‬حساسة معينة ‪ ،‬يثير‪ ‬حدث تدقيق‬

‫‪ ) ‬ذاتي ‪object.__dir__( ‬‬

‫‪.‬يحول التسلسل المرتجع إلى قائمة ويفرزها)(‪. dir‬يتم استدعاؤها على الكائن‪ .‬يجب إرجاع التسلسل)(‪ dir‬يتم استدعاؤها عندما‬

‫‪ ‬تخصيص الوصول إلى سمة الوحدة‪3.3.2.1. ‬‬

‫ظيفة على __‪ __getattr‬يمكن أن تستخدم أيضا لتخصيص الوصول إلى سمات‪ L‬الوحدة‪ .‬و__‪ __dir‬و__‪ __getattr‬أسماء خاصة‬
‫إذا لم يتم العثور على ‪ AttributeError. ‬مستوى الوحدة‪ ،‬ينبغي قبول وسيطة واحدة وهو اسم سمة وإرجاع القيمة المحسوبة أو تثير‬
‫يتم البحث في __‪ __getattr‬ثم ‪ object.__getattribute__()،‬السمة على كائن وحدة من خالل البحث العادي‪ ،‬أي‬
‫‪.‬إذا تم العثور عليها ‪ ،‬يتم استدعاؤها باسم السمة ويتم إرجاع النتيجة‪ AttributeError. ‬قبل رفع أحد__‪ __dict‬وحدة‬

‫ظيفة يجب أن يقبل بدون وسائط‪ ،‬وتعود سلسلة من السالسل التي تمثل أسماء الوصول إليها على حدة‪ .‬في حالة __‪ __dir‬و‬
‫‪.‬البحث‪ ‬القياسي‪ ‬في الوحدة النمطية)(‪ dir‬وجودها ‪ ،‬تتجاوز هذه الوظيفة‬

‫سمة كائن __‪ __class‬للحصول على تخصيص أكثر دقة لسلوك الوحدة (سمات اإلعداد ‪ ،‬الخصائص ‪ ،‬إلخ) ‪ ،‬يمكن للمرء تعيين‬
‫‪:‬على سبيل المثال‪ types.ModuleType. ‬الوحدة النمطية إلى فئة فرعية من‬

‫‪import sys‬‬

‫‪from types import ModuleType‬‬

‫‪class VerboseModule(ModuleType):‬‬

‫‪def __repr__(self):‬‬

‫'}__‪return f'Verbose {self.__name‬‬

‫‪def __setattr__(self, attr, value):‬‬

‫)'‪print(f'Setting {attr}...‬‬

‫)‪super().__setattr__(attr, value‬‬

‫‪sys.modules[__name__].__class__ = VerboseModule‬‬

‫ملحوظة‬

‫‪ ‬‬

‫‪Pg. 32‬‬
‫إال على عمليات البحث التي يتم إجراؤها باستخدام بناء __‪ __class‬اإلعداد__‪ __getattr‬ال يؤثر‪ ‬تحديد الوحدة النمطية ووحدة‬
‫سواء عن طريق رمز داخل الوحدة ( جملة الوصول إلى السمة ‪ -‬وال يتأثر الوصول المباشر إلى وحدات الكرة األرضية للوحدة‬
‫‪).‬للوحدة النمطية ‪ globals‬النمطية ‪ ،‬أو عبر مرجع إلى قاموس‬

‫‪.‬سمة الوحدة النمطية قابلة للكتابة اآلن‪__class__ ‬تم التغيير في اإلصدار ‪ :3.5‬أصبحت‬

‫‪.‬حدة الصفات__‪ __dir‬و‪:__getattr__ ‬الجديد في اإلصدار ‪3.7‬‬

‫أنظر أيضا‬

‫__‪ __dir‬و __‪ __getattr‬الوحدة النمطية ‪PEP 562 -‬‬

‫‪.‬ظائف على وحدات__‪ __dir‬و__‪ __getattr‬يصف‬

‫‪ ‬تنفيذ‪3.3.2.2. ‬‬

‫تنطبق الطرق التالية فقط عند ظهور مثيل من الفئة التي تحتوي على الطريقة (ما يسمى‪ ‬بفئة‪ ‬واصف‪ ) ‬في‪ ‬فئة‪ ‬المالك‪( ‬يجب أن يكون‬
‫الواصف إما في قاموس فئة المالك أو في قاموس الفصل ألحد الوالدين)‪ .‬في األمثلة أدناه ‪ ،‬تشير "السمة" إلى السمة التي يكون اسمها‪L‬‬
‫‪ __dict__.‬هو مفتاح الخاصية في فئة المالك‬

‫‪ ) ‬ذاتي‪ ، ‬مثال‪ ، ‬مالك‪  =  ‬ال شيء ‪object.__get__( ‬‬

‫تم استدعاؤها للحصول على سمة فئة المالك (وصول سمة الفئة) أو مثيل من تلك الفئة (الوصول إلى سمة‬
‫عندما يتم‪ None‬المثيل)‪ .‬وسيطة‪ ‬المالك‪ ‬االختيارية‪ ‬هي فئة المالك ‪ ،‬بينما‪ ‬المثيل‪  ‬هو المثيل الذي تم الوصول إلى السمة من خالله ‪ ،‬أو‬
‫‪ .‬الوصول إلى السمة من خالل‪ ‬المالك‬

‫‪.‬استثناءً‪ AttributeError‬يجب أن ُترجع هذه الطريقة قيمة السمة المحسوبة أو تثير‬

‫المضمنة هذه ‪ Python‬قابل لالستدعاء مع وسيطة واحدة أو اثنتين‪ .‬تدعم واصفات)(__‪__get‬أنه‪ PEP 252 ‬يحدد‬


‫المواصفات ؛‪  ‬ومع ذلك ‪ ،‬فمن المحتمل أن تحتوي بعض أدوات الجهات الخارجية على واصفات تتطلب كال‬
‫‪.‬الخاصفي كلتا الحجتين سواء كانت مطلوبة أم ال ‪Python‬دائمًا ما يمر تطبيق‪. __getattribute__() ‬الوسيطتين‬

‫‪ ) ‬ذاتي‪ ، ‬مثال‪ ، ‬قيمة ‪object.__set__( ‬‬

‫‪ .‬ودعا إلى تعيين السمة على مثيل‪ ‬المثال‪ ‬من الطبقة مالك لقيمة جديدة‪ ،‬قيمة‬

‫تغيير نوع الواصف إلى "واصف البيانات"‪ .‬راجع‪ ‬استدعاء الواصفات‪ ‬لمزيد من )(__‪ __delete‬أو)(__‪ __set‬الحظ ‪ ،‬إضافة‬


‫‪.‬التفاصيل‬

‫‪ ) ‬ذاتي‪ ، ‬مثال ‪object.__delete__( ‬‬

‫‪.‬ودعا لحذف السمة على مثيل‪ ‬المثال‪ ‬من الطبقة المالك‬

‫الوحدة النمطية على أنها تحدد الفئة حيث تم تعريف هذا الكائن (يمكن أن يساعد ‪ inspect‬يتم تفسير‪ ‬السمة‪ ‬بواسطة__‪__objclass‬‬
‫تعيين هذا بشكل مناسب‪ L‬في استبطان وقت التشغيل لسمات الفئة الديناميكية)‪  .‬بالنسبة إلى العناصر القابلة لالستدعاء ‪ ،‬قد يشير إلى أن‬
‫‪ CPython‬على سبيل المثال ‪ ،‬يقوم( مثيل من النوع المحدد (أو فئة فرعية) متوقع أو مطلوب باعتباره الوسيطة الموضعية األولى‬
‫‪ C).‬بتعيين هذه السمة للطرق غير المنضمة التي يتم تنفيذها في‬

‫‪ ‬استدعاء‪3.3.2.3. ‬‬

‫بشكل عام‪ ،‬واصف هو سمة الكائن مع "ملزمة السلوك"‪ ،‬واحد الذي تم تجاوزه من قبل األساليب في بروتوكول اصف الوصول‬
‫‪.‬إذا تم تعريف أي من هذه الطرق لكائن ‪ ،‬فيُقال إنها واصف‪ __delete__(). ‬و)(__‪: __get__()، __set‬السمة‬

‫لديها ‪ ، a.x‬السلوك االفتراضي للوصول إلى السمة هو الحصول على السمة أو تعيينها أو حذفها من قاموس الكائن‪ .‬على سبيل المثال‬
‫الستبعاد‪ ‬الفئات‪ ‬الوصفي)‪ type(a‬وتستمر عبر الفئات األساسية ‪ type(a).__dict__['x']،‬ثم ‪ a.__dict__['x']،‬سلسلة بحث تبدأ بـ‬
‫‪.‬ة‬

‫‪Pg. 33‬‬
‫السلوك االفتراضي وتستدعي ‪ Python‬ومع ذلك ‪ ،‬إذا كانت قيمة البحث عبارة عن كائن يحدد إحدى طرق الوصف ‪ ،‬فقد تتجاوز‬
‫‪.‬طريقة الواصف بدالً من ذلك‪  .‬يعتمد مكان حدوث ذلك في سلسلة األسبقية على طرق التوصيف التي تم تعريفها وكيف تم استدعاؤها‬

‫‪ a:‬تعتمد كيفية تجميع الحجج على‪ ، a.x. ‬نقطة البداية الستدعاء الواصف هي عملية ربط‬

‫دعوة مباشرة‬

‫‪: x.__get__(a).‬الدعوة أبسط وأقل شيوعا عند استدعاء رمز المستخدم مباشرة طريقة اصف‬

‫ربط المثيل‬

‫))‪: .type(a).__dict__['x'].__get__(a, type(a‬وتحويلها إلى الدعوة‪، a.x‬إذا ملزمة لمثيل كائن‬

‫فئة ملزمة‬

‫)‪: .A.__dict__['x'].__get__(None, A‬وتحولت الدعوة‪، A.x‬إذا ملزمة لفئة‬

‫سوبر ملزم‬

‫ثم الربط‪ ‬تفتيش‪ ‬للفئة األساسية‪ ‬السابقة مباشرة‪ ‬ثم تحتج واصف مع ‪ super،‬هو مثيل‪ a‬إذا‬


‫)__‪: .super(B, obj).m()obj.__class__.__mro__ABA.__dict__['m'].__get__(obj, obj.__class‬الدعوة‬

‫على سبيل المثال ‪ ،‬االرتباطات ‪ ،‬تعتمد أسبقية استدعاء الواصف على طرق التوصيف المحددة‪ .‬واصف يمكن أن تحدد أي مزيج‬
‫فسيؤدي الوصول إلى السمة إلى إرجاع كائن ‪ __get__()،‬إذا لم يتم تعريفها‪ __delete__(). ‬و)(__‪ __get__()، __set‬من‬
‫فهو ‪ __delete__()،‬و ‪ /‬أو)(__‪ __set‬الواصف نفسه ما لم تكن هناك قيمة في قاموس مثيل الكائن‪ .‬إذا كان الواصف يعرف‬
‫)(__‪ __get‬واصف بيانات ؛‪ ‬إذا لم يحدد أيًا منهما ‪ ،‬فهو واصف غير متعلق بالبيانات‪ .‬عادة‪ ،‬واصفات البيانات تحدد على حد سواء‬
‫)(__‪ __set‬و)(__‪ __get‬طريقة‪ .‬واصفات البيانات ذات)(__‪ __get‬في حين واصفات البيانات غير بوجود مجرد ‪ __set__()،‬و‬
‫المعرفة دائمًا تتجاوز إعادة تعريف في قاموس المثيل‪ .‬في المقابل ‪ ،‬يمكن تجاوز الواصفات غير المتعلقة ))(__‪__delete‬و ‪ /‬أو(‬
‫‪.‬بالبيانات بواسطة المثيالت‬

‫باعتبارها واصفات غير متعلقة بالبيانات‪ .‬وف ًقا لذلك ‪ classmethod()) ،‬و)(‪ staticmethod‬بما في ذلك( ‪ Python‬يتم تنفيذ‪ ‬طرق‬
‫‪.‬يمكن للمثيالت إعادة تعريف الطرق وتجاوزها‪  .‬هذا يسمح للحاالت الفردية باكتساب سلوكيات تختلف عن األمثلة األخرى لنفس الفئة‬

‫‪.‬يتم تنفيذ الدالة كما واصف البيانات‪ .‬وف ًقا لذلك ‪ ،‬ال يمكن للحاالت تجاوز سلوك الخاصية)(‪ property‬و‬

‫‪3.3.2.4. __slots__ ‬‬

‫و‪__ ‬ضعيف__‪( ‬ما لم‪ __dict__ ‬الفتحات__‪  ‬تسمح لنا باإلعالن صراحة عن أعضاء البيانات (مثل الخصائص) ورفض إنشاء__‬
‫ً‬
‫صراحة في‪__ ‬الخانات__‪ ‬أو متوفرة لدى أحد الوالدين‪).‬‬ ‫يتم اإلعالن‬

‫‪.‬مهمة‪ .‬يمكن تحسين سرعة البحث عن السمات بشكل ملحوظ أيضًا‪ __dict__ ‬يمكن أن تكون‪ ‬المساحة‪ L‬المحفوظة خالل استخدام‬

‫__‪object.__slots‬‬

‫بمساحة ‪  __slots__ ‬يمكن تعيين متغير الفئة هذا سلسلة أو متكررة أو سلسلة من السالسل بأسماء‪ L‬متغيرة تستخدمها األمثلة‪ .‬تحتفظ‬
‫‪.‬لكل حالة‪ __weakref__ ‬و‪ __dict__ ‬للمتغيرات المعلنة وتمنع اإلنشاء التلقائي لـ‬

‫‪ __slots__ ‬مالحظات حول استخدام‪3.3.2.4.1. ‬‬

‫‪‬‬ ‫‪.‬سوف سمة من الحاالت تكون في متناول دائما‪ __weakref__ ‬و‪ __dict__ ‬و ‪ __slots__ ،‬عندما يرث من فئة دون‬

‫‪‬‬ ‫محاوالت ‪ __slots__ . ‬ال يمكن تعيين مثيالت متغيرات جديدة غير مدرجة في‪ ‬تعريف ‪ __dict__ ،‬بدون‪ ‬متغير‬
‫إذا كان التخصيص الديناميكي للمتغيرات الجديدة ‪ AttributeError. ‬التخصيص إلى اسم متغير غير مدرج يرفع‬
‫‪ __slots__ .‬تسلسل السالسل في‪ ‬إعالن'__‪ '__dict‬مطلوبًا ‪ ،‬فقم‪ ‬بإضافة‬

‫‪‬‬ ‫اإلشارات الضعيفة إلى‪ ‬مثيالتها‪ . ‬إذا ‪ __slots__ ‬لكل حالة ‪ ،‬ال تدعم‪ ‬الفئات التي تحدد‪ __weakref__ ‬بدون‪ ‬متغير‬
‫‪ __slots__ .‬تسلسل السالسل في‪ ‬إعالن'__‪ '__weakref‬كانت هناك حاجة إلى دعم مرجعي ضعيف ‪ ،‬فقم‪ ‬بإضافة‬

‫‪Pg. 34‬‬
‫‪‬‬ ‫يتم تنفيذها على مستوى الفصل عن طريق إنشاء واصفات (واصفات‪ ‬التنفيذ‪ ) ‬لكل اسم متغير‪ .‬نتيجة لذلك ‪ ،‬ال‪__slots__ ‬‬
‫؛‪ ‬وإال ‪ ،‬فإن سمة الفئة ‪ __slots__ ‬يمكن استخدام سمات الفئة لتعيين القيم االفتراضية لمتغيرات المثيل المحددة بواسطة‬
‫‪.‬ستكتب فوق تعيين الواصف‬

‫‪‬‬ ‫المُعلن عنها في اآلباء في فصول ‪ __slots__ ‬على الفئة التي تم تعريفها فيه‪ .‬تتوفر ‪ __slots__ ‬ال يقتصر‪ ‬عمل‪ ‬إعالن‬
‫و‪__ ‬ضعي ًفا__‪ ‬ما لم تحدد ‪ __dict__ ‬األطفال‪ .‬ومع ذلك ‪ ،‬ستحصل الفئات الفرعية الفرعية على‬
‫‪.‬أيضًا‪__ ‬الخانات__‪( ‬والتي يجب أن تحتوي فقط على أسماء‪ L‬أي‪ ‬خانات‪ ‬إضافية‪) ‬‬

‫‪‬‬ ‫إذا كانت الفئة تعرف فتحة محددة أيضً ا في فئة أساسية ‪ ،‬فإن متغير الحالة المحدد بواسطة فتحة الفئة األساسية ال يمكن‬
‫الوصول إليه (إال من خالل استرداد واصفه مباشرة من الفئة األساسية)‪ .‬هذا يجعل معنى البرنامج غير محدد‪ .‬في المستقبل‬
‫‪ ،.‬قد تتم إضافة شيك لمنع ذلك‬

‫‪‬‬ ‫‪ tuple.‬و‪ int، bytes‬ال يعمل من أجل الفئات المشتقة من "طول متغير" المدمج في أنواع مثل‪ __slots__ ‬غير فارغ‬

‫‪‬‬ ‫يمكن أيضً ا استخدام التعيينات ؛‪ ‬ومع ذلك ‪ ،‬في المستقبل ‪ ،‬قد ‪ __slots__ . ‬يمكن تعيين أي قابل للتكرار بدون سلسلة إلى‬
‫‪.‬يتم تعيين معنى خاص للقيم المقابلة لكل مفتاح‬

‫‪‬‬ ‫‪__ .‬إال إذا كان‪ ‬للفئتين‪ ‬نفس‪__ ‬الخانات ‪ __class__ ‬ال يعمل الواجب‬

‫‪‬‬ ‫يمكن استخدام الوراثة المتعددة مع فئات رئيسية متعددة ذات فترات زمنية محددة ‪ ،‬ولكن يُسمح ألحد الوالدين فقط بامتالك‬
‫سمات‪ L‬تم إنشاؤها بواسطة الفتحات (يجب أن تحتوي القواعد األخرى على تخطيطات خانات فارغة) ‪ -‬رفع‬
‫‪ TypeError.‬االنتهاكات‪L‬‬

‫‪‬‬ ‫إذا تم استخدام مكرر لـ‪__ ‬الفواصل الزمنية__ ‪ ،‬فسيتم إنشاء واصف لكل من قيم‪ ‬المكرر‪ . ‬ومع ذلك ‪،‬‬ ‫‪‬‬
‫‪.‬ستكون‪ ‬مكررً ا‪ ‬فار ًغا‪ __slots__ ‬فإن‪ ‬السمة‬

‫‪ ‬تخصيص إنشاء الفصل‪3.3.3. ‬‬

‫في تلك الفئة‪ .‬بهذه الطريقة ‪ ،‬من الممكن كتابة الفئات التي تغير ‪ __init_subclass__ ‬عندما ترث فئة من فئة أخرى ‪ ،‬يتم استدعاء‬
‫ً‬
‫ارتباطا وثي ًق ا بمصممي الفصل ‪ ،‬ولكن حيث يؤثر مصممي الفصل فقط على الفئة المحددة التي‬ ‫سلوك الفئات الفرعية‪ .‬يرتبط هذا‬
‫‪.‬تطبيقهم عليها‪  ، ‬ينطبق فقط على الفئات الفرعية المستقبلية للفئة التي تحدد الطريقة__‪ __init_subclass‬يتم‬

‫‪ object.__init_subclass__( cls ) ‬طريقة الفصل‬

‫هي الفئة الفرعية الجديدة‪ .‬إذا تم تعريفها على أنها ‪  cls ‬يتم استدعاء هذه الطريقة كلما تم تصنيف الفئة الحاوية إلى فئة فرعية‪ .‬ثم‬
‫‪.‬طريقة مثيل عادية ‪ ،‬يتم تحويل هذه الطريقة ضمنيًا إلى طريقة فئة‬

‫للتوافق مع الفئات األخرى ‪ __init_subclass__. ‬يتم تمرير وسيطات الكلمات الرئيسية التي يتم منحها لفئة جديدة إلى فئة األصل‬
‫يجب على المرء أن يأخذ وسيطات الكلمات الرئيسية المطلوبة ويمرر األخرى إلى الفئة األساسية ‪ __init_subclass__، ،‬باستخدام‬
‫‪:‬كما في‬

‫‪class Philosopher:‬‬

‫‪def __init_subclass__(cls, /, default_name, **kwargs):‬‬

‫)‪super().__init_subclass__(**kwargs‬‬

‫‪cls.default_name = default_name‬‬

‫‪class AustralianPhilosopher(Philosopher, default_name="Bruce"):‬‬

‫‪pass‬‬

‫ال يؤدي‪ ‬التطبيق االفتراضي إلى‪  ‬أي شيء ‪ ،‬ولكنه يتسبب في حدوث خطأ إذا تم استدعاؤه مع أي __‪object.__init_subclass‬‬
‫‪.‬وسيطات‬

‫‪Pg. 35‬‬
‫ملحوظة‬

‫‪ ‬‬

‫التطبيقات‪ .‬يمكن __‪ __init_subclass‬بواسطة بقية آالت النوع ‪ ،‬وال يتم تمريره إلى‪ metaclass ‬يتم استهالك‪ ‬تلميح‪metaclass‬‬
‫‪ type(cls).‬الفعلي (بدالً من التلميح الصريح) كـ ‪ metaclass‬الوصول إلى‬

‫الجديد في اإلصدار ‪3.6.1‬‬

‫)(__‪ __set_name‬يمسح متغيرات الفئة ويجعل عمليات االسترجاعات لمن لديهم)(__‪ ، type.__new‬عندما يتم إنشاء فئة‬
‫‪.‬خطاف‬

‫‪ ) ‬ذاتي‪ ، ‬مالك‪ ، ‬اسم ‪object.__set_name__( ‬‬

‫‪:‬يتم االتصال به تلقائيًا في وقت‪ ‬إنشاء‪ ‬مالك‪ ‬الفئة‪ ‬المالكة‪ . ‬تم تعيين‪ ‬اسم‪ ‬للكائن‪ ‬في تلك الفئة‬

‫‪class A:‬‬

‫)'‪x = C() # Automatically calls: x.__set_name__(A, 'x‬‬

‫يمكن )(__‪ ، __set_name‬فلن يتم استدعاؤها تلقائيًا‪ .‬إذا لزم األمر)(__‪ ، __set_name‬إذا تم تعيين متغير الفئة بعد إنشاء‪ L‬الفئة‬
‫‪:‬االتصال مباشرة‬

‫‪class A:‬‬

‫‪pass‬‬

‫)(‪c = C‬‬

‫‪A.x = c‬‬ ‫‪# The hook is not called‬‬

‫‪c.__set_name__(A, 'x') # Manually invoke the hook‬‬

‫‪.‬راجع‪ ‬تكوين كائن الفئة‪ ‬لمزيد من التفاصيل‬

‫الجديد في اإلصدار ‪3.6.1‬‬

‫‪3.3.3.1. Metaclasses‬‬

‫يتم تنفيذ جسم الفئة في مساحة اسم جديدة ويرتبط اسم الفئة محليًا ‪ type(). ‬بشكل افتراضي ‪ ،‬يتم إنشاء الفئات باستخدام‬
‫)‪ .type(name, bases, namespace‬بالنتيجة‬

‫وسيطة الكلمة األساسية في سطر تعريف الفئة ‪ ،‬أو عن طريق التوريث من ‪ metaclass ‬يمكن تخصيص عملية إنشاء الفئة بتمرير‬
‫‪ Meta:‬حاالت من‪ MySubclass‬و ‪ MyClass،‬فئة موجودة تضمنت مثل هذه الوسيطة‪ .‬في المثال التالي‪ ،‬على حد سواء‬

‫‪class Meta(type):‬‬

‫‪pass‬‬

‫‪class MyClass(metaclass=Meta):‬‬

‫‪pass‬‬

‫‪class MySubclass(MyClass):‬‬

‫‪Pg. 36‬‬
‫‪pass‬‬

‫‪.‬الموضحة أدناه ‪ metaclass‬يتم تمرير أي وسيطات أخرى للكلمات‪ L‬األساسية التي تم تحديدها في تعريف الفئة إلى جميع عمليات‬

‫‪:‬عند تنفيذ تعريف فئة ‪ ،‬تحدث الخطوات التالية‬

‫‪‬‬ ‫؛ ‪ MRO‬يتم حل إدخاالت‬

‫‪‬‬ ‫المناسب‪ L‬؛ ‪ metaclass‬يتم تحديد‬

‫‪‬‬ ‫تم إعداد مساحة‪ L‬اسم الفئة ؛‬


‫‪‬‬ ‫يتم تنفيذ جسم الفصل ؛‬

‫‪‬‬ ‫‪.‬يتم إنشاء كائن الفئة‬

‫‪ MRO ‬حل إدخاالت‪3.3.3.2. ‬‬

‫البحث عن طريقة عليها‪ .‬إذا تم __‪ __mro_entries‬فسيتم ‪ type،‬إذا كانت القاعدة التي تظهر في تعريف الفئة ليست مثيالً لـ‬
‫العثور عليها ‪ ،‬يتم استدعاؤها مع مجموعة القواعد األصلية‪ .‬يجب أن ُت رجع هذه الطريقة مجموعة من الفئات التي سيتم استخدامها‬
‫‪.‬فارغا ‪ ،‬وفي مثل هذه الحالة يتم تجاهل القاعدة األصلية ‪ tuple‬بدالً من هذه القاعدة‪ .‬قد يكون‬
‫ً‬

‫أنظر أيضا‬

‫‪ ‬‬

‫الدعم األساسي لوحدة الكتابة واألنواع العامة ‪PEP 560 -‬‬

‫‪ ‬المناسب‪ metaclass L‬تحديد‪3.3.3.3. ‬‬

‫‪:‬المناسب لتعريف الفئة على النحو التالي ‪ metaclass‬يتم تحديد‬

‫‪‬‬ ‫استخدام ذلك ؛)(‪ type‬صريح ‪ ،‬فسيتم ‪ metaclass‬إذا لم يتم إعطاء قواعد وال يوجد‬

‫‪‬‬ ‫‪ metaclass.‬ثم يتم استخدامه مباشرة كما ‪ type()،‬صريح وأنه‪ ‬ال‪ ‬مثيل ‪ metaclass‬إذا تم إعطاء‬

‫‪‬‬ ‫‪.‬األكثر اشتقا ًقا ‪ metaclass‬صريح ‪ ،‬أو تم تعريف القواعد ‪ ،‬فسيتم استخدام ‪ metaclass‬تم إعطاء‪ ‬مثيل لـ‪ ‬كـ)(‪ type‬إذا‬

‫لجميع الفئات ))‪ type(cls‬أي( المحدد بوضوح (إن وجد) والفئات الوصفية ‪ metaclass‬األكثر اشتقا ًقا من ‪ metaclass‬يتم تحديد‬
‫مشتق هو نوع فرعي من‪ ‬كل‪ ‬هذه الفئات الوصفية المرشحة‪ .‬إذا لم تستوف أي من الفئات ‪ metaclass‬األساسية المحددة‪ .‬أكثر‬
‫‪ TypeError.‬الوصفية المرشحة هذا المعيار ‪ ،‬فسيفشل تعريف الفئة مع‬

‫‪ ‬تحضير مساحة اسم الصنف‪3.3.3.4. ‬‬

‫سمة ‪ ،‬فسيتم‪ ‬اس__‪ __prepare‬يحتوي على ‪ metaclass‬المناسب ‪ ،‬يتم إعداد مساحة اسم الفئة‪ .‬إذا كان ‪ metaclass‬بمجرد تحديد‬
‫تدعاؤه كـ‪( ‬حيث تأتي وسيطات الكلمات‪ L‬األساسية اإلضافية ‪ ،‬إن وجدت ‪ ،‬من تعريف الفئة)‪ .‬و‪ ‬ينبغي تنفيذ طريقة باعتباره‪ . ‬يتم‬
‫تمرير‪ ‬مساحة االسم التي‪ ‬تم‪ ‬إرجاعها‪ ‬إلى‪ ، ‬ولكن عند إنشاء كائن الفئة النهائية ‪ ،‬يتم نسخ مساحة‪ L‬االسم إلى‬
‫‪ .namespace = metaclass.__prepare__(name, bases, **kwds)__prepare__classmethod()__prepar‬جديد‬
‫‪e____new__dict‬‬

‫‪.‬سمة ‪ ،‬فسيتم تهيئة مساحة اسم الفئة‪ ‬كتعيين مرتب‪ ‬فارغ__‪ __prepare‬ال يحتوي على أي ‪ metaclass‬إذا كان‬

‫أنظر أيضا‬

‫‪ Python 3000‬في ‪PEP 3115 - Metaclasses‬‬

‫ربط مساحة االسم__‪ __prepare‬قدم‬

‫‪ ‬تنفيذ الجسم الدرجة‪3.3.3.5. ‬‬

‫‪Pg. 37‬‬
‫يتم تنفيذ جسم الفصل (تقريبًا) بتنسيق‪ . ‬االختالف الرئيسي من االستدعاء العادي‪ ‬هو أن النطاق المعجمي يسمح لجسم الفصل (بما في‬
‫ذلك أي طرق) لإلشارة إلى األسماء‪ L‬من النطاقين الحالي والخارجي عندما يحدث تعريف الفئة داخل‬
‫)(‪.exec(body, globals(), namespace)exec‬دالة‬

‫ومع ذلك ‪ ،‬حتى عندما يحدث تعريف الفئة داخل الوظيفة ‪ ،‬فإن الطرق المحددة داخل الفئة ال تزال غير قادرة على رؤية األسماء‬
‫__‪ __class‬المعرفة في نطاق الفئة‪  .‬يجب الوصول إلى متغيرات الفئة من خالل المعلمة األولى لطرق المثيل أو الفئة ‪ ،‬أو من خالل‬
‫‪.‬المرجع‪ ‬المعجمي الضمني‪ ‬الموضح في القسم التالي‬

‫‪ ‬إنشاء كائن فئة‪3.3.3.6. ‬‬

‫بمجرد ملء مساحة‪ L‬اسم الفئة عن طريق تنفيذ نص الفصل ‪ ،‬يتم إنشاء كائن الفئة عن طريق االستدعاء‪( ‬الكلمات‪ L‬األساسية اإلضافية‬
‫التي تم تمريرها هنا هي نفسها تلك التي تم تمريرها‬
‫__‪.metaclass(name, bases, namespace, **kwds)__prepare‬إلى‪) ‬‬

‫هو مرجع إغالق ضمني تم __‪ super(). __class‬كائن الفئة هذا هو الكائن الذي سيتم الرجوع إليه بواسطة صيغة الصفرية من‬
‫يسمح هذا لصيغة الوسيطة ‪ super. ‬أو__‪ __class‬إنشاؤه بواسطة المترجم إذا كانت أي طرق في نص فئة تشير إلى أي منهما‬
‫بتحديد الفئة التي يتم تحديدها بشكل صحيح بنا ًء على النطاق المعجمي ‪ ،‬بينما يتم تحديد الفئة أو المثيل الذي تم )(‪ super‬الصفرية‬
‫‪.‬استخدامه إلجراء االستدعاء الحالي بنا ًء على الوسيطة األولى التي تم تمريرها إلى الطريقة‬

‫يتم تمرير الخلية إلى__‪ ، __class‬واإلصدارات األحدث ‪ CPython 3.6‬في‪ CPython: ‬تفاصيل تنفيذ‬
‫االستدعاء__‪ type.__new‬كإدخال في مساحة‪ L‬اسم الفئة‪ .‬في حالة وجوده ‪ ،‬يجب نشر هذا حتى وقت__‪metaclass __classcell‬‬
‫‪ Python.‬في ‪ RuntimeError3.8‬حتى تتم تهيئة الفصل بشكل صحيح‪ .‬سيؤدي عدم القيام بذلك إلى إصدار‬

‫يتم استدعاء خطوات ‪ type.__new__،‬يستدعي في النهاية ‪ metaclass‬أو أي ‪ type،‬االفتراضي ‪ metaclass‬عند استخدام‬


‫‪:‬التخصيص اإلضافية التالية بعد إنشاء كائن الفئة‬

‫طريقة ؛)(__‪ __set_name‬يجمع‪ ‬هذا‪ ‬األسلوب كل السمات‪ L‬الموجودة في مساحة اسم الفئة التي تحدد__‪1. type.__new‬‬

‫يتم استدعاء‪ ‬هذه‪  ‬الطرق مع تعريف الفئة واالسم المخصص لتلك السمة المعينة ؛__‪2. __set_name‬‬

‫‪.‬يسمى هوك على األصل الفوري للفئة جديدة من أجل طريقة قرارها)(__‪ __init_subclass‬و ‪3.‬‬

‫بعد إنشاء كائن الفئة ‪ ،‬يتم تمريره إلى مصممي الفئة المضمنين في تعريف الفئة (إن وجد) ويتم ربط الكائن الناتج في مساحة‪ L‬االسم‬
‫‪.‬المحلية كفئة محددة‬

‫يتم نسخ الكائن المقدم كمعامل مساحة االسم إلى تعيين مرتب جديد ويتم ‪ type.__new__،‬عندما يتم إنشاء فئة جديدة بواسطة‬
‫‪.‬سمة لكائن الفئة__‪ __dict‬تجاهل الكائن األصلي‪  .‬يتم تغليف النسخة الجديدة في وكيل للقراءة فقط ‪ ،‬والذي يصبح‬

‫أنظر أيضا‬

‫سوبر جديد ‪PEP 3135 -‬‬

‫مرجع اإلغالق‪ ‬الضمني__‪ __class‬يصف‬

‫‪ ‬استخدامات الفوقية‪3.3.3.7. ‬‬

‫االستخدامات المحتملة للفئات الوصفية ال حدود لها‪ .‬تتضمن بعض األفكار التي تم استكشافها‪ L‬التعداد ‪ ،‬والتسجيل ‪ ،‬والتحقق من‬
‫‪.‬الواجهة ‪ ،‬والتفويض التلقائي ‪ ،‬وإنشاء الخاصية التلقائي ‪ ،‬والوكالء ‪ ،‬واألطر ‪ ،‬والقفل ‪ /‬المزامنة التلقائية للموارد‬

‫‪ ‬تخصيص عمليات التحقق من المثيل والفئة الفرعية‪3.3.4. ‬‬

‫‪.‬المدمج في وظائف)(‪ issubclass‬و)(‪ isinstance‬يتم استخدام األساليب التالية لتجاوز السلوك االفتراضي ل‬

‫كـ "فئات )‪ (ABC‬هذه الطرق للسماح بإضافة أصناف قاعدة مجردة‪ metaclass abc.ABCMeta‬على وجه الخصوص ‪ ،‬يطبق‬
‫‪.‬أساسية افتراضية" إلى أي فئة أو نوع (بما في ذلك األنواع المضمنة) ‪ ،‬بما في ذلك أبجديات أخرى‬

‫‪ ) ‬ذاتي‪ ، ‬مثال ‪class.__instancecheck__( ‬‬

‫‪Pg. 38‬‬
‫إرجاع صحيح إذا كان‪ ‬يجب اعتبار‪ ‬المثيل‪ ‬مثياًل (مباشرً ا أو غير مباشر)‪ ‬للفئة‪ . ‬إذا تم تعريفه ‪ ،‬فإنه يستدعي‬
‫)‪ .isinstance(instance, class‬التنفيذ‬

‫‪ ) ‬ذاتي‪ ، ‬فئة فرعية ‪class.__subclasscheck__( ‬‬

‫إرجاع صحيح إذا كان‪ ‬يجب اعتبار‪ ‬الفئة الفرعية فئة فرعية‪( ‬مباشرة أو غير مباشرة) من‪ ‬الفئة‪ . ‬إذا تم تعريفه ‪ ،‬فإنه يستدعي‬
‫)‪ .issubclass(subclass, class‬التنفيذ‬

‫فئة‪ .‬ال يمكن تعريفها كطرق للفصل في الفصل الفعلي‪ .‬هذا يتوافق مع )‪ (metaclass‬الحظ أنه يتم البحث عن هذه الطرق في نوع‬
‫‪.‬البحث عن العمليات الخاصة التي يتم استدعاؤها في الحاالت ‪ ،‬فقط في هذه الحالة يكون المثيل بحد ذاته فئة‬

‫أنظر أيضا‬

‫تقديم فئات أساسية مجردة ‪PEP 3119 -‬‬

‫)(__‪ __instancecheck‬السلوك من خالل)(‪ issubclass‬و)(‪ isinstance‬يتضمن مواصفات تخصيص‬


‫‪.‬للغة )وحدة‪ abc ‬انظر( مع الدافع لهذه الوظيفة في سياق مضيفا فئات مجردة قاعدة ‪ __subclasscheck__()،‬و‬

‫‪ ‬محاكاة‪ L‬األنواع العامة‪3.3.5. ‬‬

‫عن طريق تحديد طريقة )]‪List[int‬على سبيل المثال(‪ PEP 484 ‬يمكن للمرء تنفيذ بناء جملة الفئة العامة كما هو محدد بواسطة‬
‫‪:‬خاصة‬

‫‪ ) ‬مفتاح ‪ object.__class_getitem__( cls ، ‬طريقة الفصل‬

‫‪ .‬قم بإرجاع كائن يمثل تخصص فئة عامة حسب وسيطات النوع الموجودة في‪ ‬المفتاح‬

‫يتم البحث عن هذه الطريقة في كائن الفئة نفسه ‪ ،‬وعند تعريفها في جسم الفئة ‪ ،‬تكون هذه الطريقة ضمنيًا طريقة فئة‪ .‬مالحظة ‪ ،‬هذه‬
‫‪.‬اآللية محجوزة بشكل أساسي لالستخدام مع تلميحات‪ L‬الكتابة الثابتة ‪ ،‬وال ينصح باستخدامات أخرى‬

‫أنظر أيضا‬

‫‪ ‬‬

‫الدعم األساسي لوحدة الكتابة واألنواع العامة ‪PEP 560 -‬‬

‫‪ ‬محاكاة‪ L‬الكائنات القابلة لالستدعاء‪3.3.6. ‬‬

‫‪ ) ‬النفس‪ ، [  ‬أرغس ‪object.__call__( ]  ...‬‬

‫يتم استدعاؤه عند "استدعاء" المثيل كوظيفة ؛‪ ‬إذا تم تعريف هذه الطريقة ‪ ،‬يتم‪ ‬ترجمتها تقريبًا‬
‫)‪ .x(arg1, arg2, ...)type(x).__call__(x, arg1, ...‬إلى‬

‫‪ ‬محاكاة أنواع الحاويات‪3.3.7. ‬‬

‫يمكن تعريف الطرق التالية لتنفيذ كائنات الحاوية‪ .‬عاد ًة ما تكون الحاويات عبارة عن تسلسالت (مثل القوائم أو المجموعات) أو‬
‫تعيينات (مثل القواميس) ‪ ،‬ولكنها يمكن أن تمثل حاويات أخرى أيضًا‪ُ  .‬تستخدم المجموعة األولى من الطرق إما لمحاكاة تسلسل أو‬
‫هو‪ N ‬التي‪ ‬يكون فيها‪ k ‬لمحاكاة‪ L‬التعيين ؛‪  ‬الفرق هو أنه بالنسبة للتسلسل ‪ ،‬يجب أن تكون المفاتيح المسموح بها هي األعداد الصحيحة‬
‫طول التسلسل ‪ ،‬أو كائنات الشرائح ‪ ،‬التي تحدد نطا ًقا من العناصر‪ .‬ويوصى أيضا أن تعيينات توفر الطرق‪، ، ، ، ، ، ، ، ، ‬‬
‫و‪ ‬يتصرف بشكل مشابه‪ L‬لتلك الكائنات القاموس القياسية بايثون‪ .‬ال‬
‫‪0 <= k < Nkeys()values()items()get()clear()setdefault()pop()popitem()copy()update()collections.abc‬‬
‫الفئة األساسية مجردة للمساعدة على خلق تلك األساليب من مجموعة أساسية ‪ MutableMapping ‬وحدة توفر‬
‫يجب متواليات قابلة للتغيير توفر ‪ keys(). ‬و ‪ __getitem__()، __setitem__()، __delitem__()،‬من‬
‫مثل بايثون قائمة ‪ sort()،‬و)(‪ append()، count()، index()، extend()، insert()، pop()، remove()، reverse‬طرق‬
‫موحدة الكائنات‪  .‬وأخيرا‪ ،‬ينبغي أنواع تسلسل تنفيذ عالوة على ذلك (أي سلسلة) والضرب (بمعنى التكرار) من خالل تحديد‬
‫هو موضح أدناه‪ .‬ال ينبغي أن)(__‪ __imul‬و)(__‪ __add__()، __radd__()، __iadd__()، __mul__()، __rmul‬األساليب‬
‫الطريقة للسماح )(__‪ __contains‬يحددوا العوامل العددية األخرى‪ .‬من المستحسن أن تقوم كل من التعيينات والتسلسالت بتنفيذ‬

‫‪Pg. 39‬‬
‫يجب البحث في مفاتيح الخرائط ؛‪ ‬للتسلسل ‪ ،‬يجب أن يبحث من خالل القيم‪ .‬يوصى كذلك‪ ،in‬للمشغل ؛‪ ‬للتعيينات‪ in‬باالستخدام الفعال‬
‫)(__‪ ، __iter‬الطريقة للسماح بالتكرار الفعال عبر الحاوية ؛‪ ‬للتعيينات )(__‪ __iter‬بأن تقوم كل من التعيينات والتسلسالت‪ L‬بتنفيذ‬
‫‪.‬يجب أن تتكرر من خالل مفاتيح الكائن ؛‪ ‬بالنسبة للتسلسالت‪ ، L‬يجب أن تتكرر من خالل القيم‬

‫‪ ) ‬ذاتي ‪object.__len__( ‬‬

‫يجب أن‪ ‬يُرجع‪ ‬طول الكائن ‪ ،‬وهو عدد صحيح‪ .0=> ‬أيضً ا ‪ ،‬يعتبر الكائن الذي ال ‪ len(). ‬يستدعي تنفيذ الوظيفة المضمنة‬
‫‪ُ .‬ترجع طريقتها صفرً ا خطأ ً في سياق منطقي)(__‪ __len‬طريقة والتي)(__‪ __bool‬يع ّرف‬

‫إذا كان الطول أكبر ‪ sys.maxsize. ‬يجب أن يكون الطول على األكثر ‪ CPython ،‬في‪ CPython: ‬تفاصيل تنفيذ‬
‫عن طريق اختبار قيمة ‪ OverflowError‬لمنع الزيادة‪ OverflowError. ‬فقد ترتفع ))(‪ len‬مثل( بعض الميزات‪ sys.maxsize‬من‬
‫‪.‬طريقة)(__‪ __bool‬الحقيقة ‪ ،‬يجب أن يحدد الكائن‬

‫‪ ) ‬ذاتي ‪object.__length_hint__( ‬‬

‫يجب إرجاع الطول المقدر للكائن (الذي قد يكون أكبر أو أقل من الطول الفعلي)‪ .‬يجب‪ operator.length_hint(). ‬دعا إلى التنفيذ‬
‫والتي يتم التعامل معها كما ‪ NotImplemented،‬أن يكون الطول عد ًدا صحيحً ا‪ .0=> ‬يمكن أيضً ا أن تكون القيمة المعادة‬
‫‪.‬لم تكن الطريقة موجودة على اإلطالق‪ .‬هذه الطريقة هي محض تحسين وليست مطلوبة أب ًدا للصحة__‪ __length_hint‬لو‬

‫الجديد في اإلصدار ‪3.4.1‬‬


‫ملحوظة‬

‫‪ ‬‬

‫يتم التقطيع حصريًا بالطرق الثالث التالية‪ .‬مكالمة‪ L‬مثل‬

‫‪a[1:2] = b‬‬

‫يترجم إلى‬

‫‪a[slice(1, 2, None)] = b‬‬

‫‪ None.‬وهكذا دواليك‪ .‬يتم دائمًا ملء عناصر الشريحة المفقودة‬

‫‪Pg. 40‬‬
‫‪ ) ‬ذاتي‪ ، ‬مفتاح ‪object.__getitem__( ‬‬

‫بالنسبة ألنواع التسلسل ‪ ،‬يجب أن تكون المفاتيح المقبولة عبارة عن أعداد صحيحة وكائنات ‪ self[key]. ‬دعا إلى تنفيذ تقييم‬
‫)(__‪ __getitem‬شرائح‪  .‬الحظ أن التفسير الخاص للفهارس السالبة (إذا كان الفصل يرغب في محاكاة نوع تسلسل) يعود إلى‬
‫فيمكن رفعه ؛‪ ‬إذا كانت قيمة خارج مجموعة الفهارس للتسلسل (بعد ‪ ، TypeError‬األسلوب‪ .‬إذا كان‪ ‬المفتاح‪ ‬من نوع غير مناسب‪L‬‬
‫فيجب رفعها‪ .‬بالنسبة ألنواع التعيين ‪ ،‬إذا كان‪ ‬المفتاح‪ ‬مفقو ًدا (ليس في الحاوية) ‪ ، IndexError‬أي تفسير خاص للقيم السالبة)‬
‫‪.‬فيجب رفعه‪، KeyError‬‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬سيتم رفع الفهارس غير القانونية للسماح بالكشف المناسب‪ L‬عن نهاية التسلسل‪ IndexError‬الحلقات تتوقع أنه‪for‬‬

‫‪ ) ‬ذاتي‪ ، ‬مفتاح‪ ، ‬قيمة ‪object.__setitem__( ‬‬

‫يجب تنفيذ ذلك فقط للتعيينات إذا كانت الكائنات تدعم ‪ __getitem__(). ‬نفس المالحظة كما في‪ self[key]. ‬دعا لتنفيذ االحالة الى‬
‫التغييرات في قيم المفاتيح ‪ ،‬أو إذا كان من الممكن إضافة مفاتيح جديدة ‪ ،‬أو للتسلسالت إذا كان من الممكن استبدال العناصر‪ .‬يجب‬
‫‪.‬الطريقة)(__‪ __getitem‬رفع االستثناءات نفسها‪ ‬لقيم‪ ‬المفاتيح‪ ‬غير المالئمة‪ ‬كما في‬

‫‪ ) ‬ذاتي‪ ، ‬مفتاح ‪object.__delitem__( ‬‬

‫يجب تنفيذ ذلك فقط للتعيينات إذا كانت الكائنات تدعم ‪ __getitem__(). ‬نفس المالحظة كما في‪ self[key]. ‬دعا إلى تنفيذ حذف‬
‫إزالة المفاتيح ‪ ،‬أو للتسلسالت إذا كان من الممكن إزالة العناصر من التسلسل‪ .‬يجب رفع االستثناءات نفسها‪ ‬لقيم‪ ‬المفاتيح‪ ‬غير‬
‫‪.‬الطريقة)(__‪ __getitem‬المالئمة‪ ‬كما في‬

‫‪ ) ‬ذاتي‪ ، ‬مفتاح ‪object.__missing__( ‬‬

‫‪.‬عندما ال يكون المفتاح في القاموس ‪ dt‬الفئات الفرعية لـ]‪ self[key‬لتنفيذ)(__‪ dict. __getitem‬تم االتصال به‬

‫‪ ) ‬ذاتي ‪object.__iter__( ‬‬

‫يتم استدعاء هذه الطريقة عندما يكون المكرر مطلوبًا للحاوية‪ .‬يجب أن تعيد هذه الطريقة كائ ًنا مكررً ا جدي ًدا يمكنه التكرار على جميع‬
‫‪.‬الكائنات الموجودة في الحاوية‪  .‬للتعيينات ‪ ،‬يجب أن تتكرر فوق مفاتيح الحاوية‬
‫تحتاج كائنات التكرار أي ً‬
‫ضا إلى تنفيذ هذه الطريقة ؛‪ ‬هم مطالبون بالعودة بأنفسهم‪ .‬لمزيد من المعلومات حول كائنات المكرر ‪،‬‬
‫‪ .‬راجع‪ ‬أنواع التكرار‬

‫‪ ) ‬ذاتي ‪object.__reversed__( ‬‬

‫المدمج لتنفيذ التكرار العكسي‪ .‬يجب أن يعيد كائن مكرر جديد يتكرر على جميع )(‪ reversed‬تم استدعاؤه (إن وجد) بواسطة‬
‫‪.‬الكائنات في الحاوية بترتيب عكسي‬

‫)(__‪ ( __len‬فسيعود المضمّن إلى استخدام بروتوكول التسلسل‪ ، reversed() ‬لم يتم توفير الطريقة)(__‪ __reversed‬إذا‬
‫إذا كان بإمكانها توفير تنفيذ )(__‪ __reversed‬يجب أن توفر الكائنات التي تدعم بروتوكول التسلسل فقط‪ __getitem__()). ‬و‬
‫‪ reversed().‬أكثر كفاءة من ذلك الذي يوفره‬

‫كتكرار من خالل حاوية‪ .‬ومع ذلك ‪ ،‬يمكن أن توفر كائنات الحاوية الطريقة )‪ ‬و‪ ( in‬عادة ما يتم تنفيذ‪ ‬مشغلي اختبار العضوية‬
‫ضا أن يكون الكائن قابالً للتكرار‬
‫‪.not in‬الخاصة التالية مع تنفيذ أكثر كفاءة ‪ ،‬والذي ال يتطلب أي ً‬

‫‪ ) ‬النفس‪ ، ‬البند ‪object.__contains__( ‬‬

‫دعا إلى تنفيذ مشغلي اختبار العضوية‪ .‬يجب أن يعود صحيحً ا إذا كان‪ ‬العنصر‪ ‬في‪ ‬نفسه‪ ، ‬خطأ في خالف ذلك‪ .‬لتعيين الكائنات ‪،‬‬
‫‪.‬يجب أن يأخذ هذا في االعتبار مفاتيح التعيين بدالً من القيم أو أزواج العناصر الرئيسية‬

‫ثم بروتوكول تكرار ‪ __iter__()،‬يحاول اختبار العضوية أوالً التكرار عبر ‪ __contains__()،‬بالنسبة للكائنات التي ال تعرف‬
‫‪ .‬راجع‪ ‬هذا القسم في مرجع اللغة ‪ __getitem__()،‬التسلسل القديم عبر‬

‫‪Pg. 41‬‬
‫‪ ‬محاكاة األنواع الرقمية‪3.3.8. ‬‬

‫يمكن تعريف الطرق التالية لمحاكاة الكائنات الرقمية‪  .‬يجب ترك األساليب المقابلة للعمليات التي ال يدعمها نوع معين من األرقام‬
‫‪.‬المنفذة (على سبيل المثال ‪ ،‬عمليات البت لألرقام غير المتكاملة) غير محددة‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__add__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__sub__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__mul__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__matmul__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__truediv__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__floordiv__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__mod__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__divmod__( ‬‬

‫‪ [ ، modulo  ] ) ‬النفس‪ ، ‬أخرى ‪object.__pow__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__lshift__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__rshift__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__and__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__xor__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__or__( ‬‬

‫تسمى هذه الطرق لتنفيذ العمليات الحسابية الثنائية‬


‫هو مثيل ‪ x ‬على سبيل المثال ‪ ،‬لتقييم التعبير‪ ، ‬حيث‪( +، -، *، @، /، //، %، divmod()، pow()، **، <<، >>، &، ^، ، |). ‬‬
‫للفئة التي لها عملية‪ ، ‬يسمى‪ .‬و‪ ‬ينبغي أن تكون طريقة ما يعادل استخدام‪ ‬و‪ . ‬ال ينبغي أن تكون مرتبطة به‪ . ‬الحظ أنه‪ ‬يجب تعريفه‬
‫لقبول وسيطة ثالثة اختيارية إذا كان سيتم دعم اإلصدار الثالثي‬
‫‪ .x + y__add__()x.__add__(y)__divmod__()__floordiv__()__mod__()__truediv__()__p‬من‪ ‬الوظيفة‪ ‬المضمنة‬
‫)(‪ow__()pow‬‬

‫‪ NotImplemented.‬إذا كانت إحدى هذه الطرق ال تدعم العملية مع الوسائط المقدمة ‪ ،‬فيجب أن تعود‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__radd__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__rsub__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__rmul__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__rmatmul__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__rtruediv__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__rfloordiv__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__rmod__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__rdivmod__( ‬‬

‫‪ [ ، modulo  ] ) ‬النفس‪ ، ‬أخرى ‪object.__rpow__( ‬‬

‫‪Pg. 42‬‬
‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__rlshift__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__rrshift__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__rand__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__rxor__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__ror__( ‬‬

‫مع )|‪ ( +، -، *، @، /، //، %، divmod()، pow()، **، <<، >>، &، ^، ، ‬تسمى هذه الطرق لتنفيذ العمليات الحسابية الثنائية‬
‫المعامالت المنعكسة‪( L‬المبادلة)‪  .‬يتم استدعاء هذه الوظائف فقط إذا كان المعامل األيسر ال يدعم العملية المقابلة‪ 3 ‬والمعامالت‪ L‬من‬
‫هو مثيل لفئة تحتوي على عملية‪ ، ‬يتم استدعاؤه في ‪ y ‬أنواع مختلفة‪ 4 .‬على سبيل المثال ‪ ،‬لتقييم التعبير‪ ، ‬حيث‬
‫)‪ NotImplemented .x - y__rsub__()y.__rsub__(x)x.__sub__(y‬حالة‪ ‬إرجاع‬

‫‪).‬ستصبح قواعد اإلكراه معقدة للغاية()(__‪ __rpow‬لن يحاول االتصال)(‪ pow‬الحظ أن النظام الثالثي‬

‫ملحوظة‬

‫‪ ‬‬

‫إذا كان نوع المعامل األيمن فئة فرعية من نوع المعامل األيسر وتوفر تلك الفئة الفرعية تطبي ًقا مختل ًفا للطريقة المنعكسة‪ L‬للعملية ‪،‬‬
‫‪.‬فسيتم استدعاء هذه الطريقة قبل طريقة المعامل األيسر غير المنعكسة‪ .‬يسمح هذا السلوك للفئات الفرعية بتجاوز عمليات أسالفهم‪L‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__iadd__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__isub__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__imul__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__imatmul__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__itruediv__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__ifloordiv__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__imod__( ‬‬

‫‪ [ ، modulo  ] ) ‬النفس‪ ، ‬أخرى ‪object.__ipow__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__ilshift__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__irshift__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__iand__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__ixor__( ‬‬

‫‪ ) ‬النفس‪ ، ‬اآلخر ‪object.__ior__( ‬‬

‫تسمى هذه الطرق لتنفيذ التخصيصات الحسابية المتزايدة (‪- ،=+ ‬‬


‫=‪ .)=| ، ،=^ ،=& ،=>> ،=<< ،=** ،=% ،=// ،=/ ،=@ ،=* ،‬يجب أن تحاول هذه الطرق إجراء العملية في مكانها‬
‫(تعديل‪ ‬الذات‪ ) ‬وإرجاع النتيجة (والتي يمكن أن تكون‪ ‬ذاتية‪ ، ‬ولكن ال يجب أن تكون كذلك‪ .) ‬إذا لم يتم تحديد طريقة معينة ‪ ،‬فإن‬
‫طريقة ‪ ،‬فإنه )(__‪ __iadd‬مثياًل لفئة ذات‪ x ‬التخصيص اإلضافي يعود إلى األساليب العادية‪ .‬على سبيل المثال ‪ ،‬إذا كان‬
‫في ‪x += yx = x.__iadd__(y)x.__add__(y)y.__radd__(x)x + y. ‬يكافئ‪ . ‬خالف ذلك‪ ،‬و‪ ‬تعتبر‪ ،‬كما هو الحال مع تقييم‬
‫استثنا ًء عندما ]'‪ a_tuple [i] + = ['item‬راجع‪ ‬لماذا تثير( حاالت معينة ‪ ،‬يمكن أن يؤدي التعيين المعزز إلى أخطاء غير متوقعة‬
‫‪.‬ولكن هذا السلوك في الواقع جزء من نموذج البيانات ‪ ) ،‬تعمل اإلضافة؟‬

‫‪ ) ‬ذاتي ‪object.__neg__( ‬‬

‫‪Pg. 43‬‬
‫‪ ) ‬ذاتي ‪object.__pos__( ‬‬

‫‪ ) ‬ذاتي ‪object.__abs__( ‬‬

‫‪ ) ‬ذاتي ‪object.__invert__( ‬‬

‫‪ ~).‬و‪ ( -، +، abs() ‬ودعا إلى تنفيذ العمليات الحسابية األحادية‬

‫‪ ) ‬ذاتي ‪object.__complex__( ‬‬

‫‪ ) ‬ذاتي ‪object.__int__( ‬‬

‫‪ ) ‬ذاتي ‪object.__float__( ‬‬

‫‪.‬يجب أن ترجع قيمة من النوع المناسب‪ float(). L‬و)(‪ complex()، int‬دعا إلى تنفيذ الوظائف المضمنة‬

‫‪ ) ‬ذاتي ‪object.__index__( ‬‬

‫كما هو الحال في ( الكائن الرقمية لكائن صحيح ‪ losslessly‬وكلما بيثون يحتاج إلى تحويل ‪ operator.index()،‬ودعا إلى تنفيذ‬
‫يشير وجود هذه الطريقة إلى أن الكائن الرقمي هو نوع عدد صحيح‪ .‬يجب‪). ‬ظائف‪ oct() ‬و)(‪ bin()، hex‬تشريح‪ ،‬أو في المدمج في‬
‫‪.‬إرجاع عدد صحيح‬

‫)(‪ complex‬و‪ int()، float() ‬لم يتم تعريف ثم المقابلة المدمج في وظائف)(__‪ __complex‬و)(__‪ __int__()، __float‬إذا‬


‫‪ __index__().‬تراجع ل‬

‫‪ [ ، ndigits  ] ) ‬النفس ‪object.__round__( ‬‬

‫‪ ) ‬ذاتي ‪object.__trunc__( ‬‬

‫‪ ) ‬ذاتي ‪object.__floor__( ‬‬

‫‪ ) ‬ذاتي ‪object.__ceil__( ‬‬

‫ما لم‪ ‬يتم ‪ ceil(). ‬و)(‪ trunc()، floor‬ظائف‪ math ‬و)(‪ round‬ودعا إلى تنفيذ وظيفة المدمج في‬


‫‪ a int).‬عاد ًة(‪ Integral ‬جميع هذه الطرق ‪ ،‬يجب أن ترجع قيمة الكائن المقتطعة إلى)(__‪ __round‬إلى‪ ndigits ‬تمرير‬

‫‪ __trunc__().‬إلى‪ int() ‬لم يتم تعريفها ‪ ،‬فستعود الوظيفة المضمنة)(__‪ __int‬إذا‬

‫‪ ‬مع مديري سياق البيان‪3.3.9. ‬‬

‫البيان‪ .‬يتعامل مدير السياق مع اإلدخال والخروج‪ with‬مدير السياق‪  ‬هو كائن الذي يحدد السياق وقت التشغيل التي ستنشأ عند تنفيذ‪A ‬‬
‫( العبارة‪ with‬من سياق وقت التشغيل المطلوب لتنفيذ كتلة التعليمات البرمجية‪ .‬عاد ًة ما يتم استدعاء مديري السياق باستخدام‬
‫ضا استخدامها عن طريق استدعاء أساليبهم مباشرة ‪ The with statement ) ،‬الموصوفة في القسم‬ ‫‪.‬ولكن يمكن أي ً‬

‫تشمل االستخدامات النموذجية لمديري السياق حفظ واستعادة أنواع مختلفة من الحالة العالمية ‪ ،‬وتأمين الموارد وإلغاء قفلها ‪ ،‬وإغالق‬
‫‪.‬الملفات المفتوحة ‪ ،‬وما إلى ذلك‬

‫‪ .‬لمزيد من المعلومات حول مديري السياق ‪ ،‬راجع‪ ‬أنواع إدارة السياق‬

‫‪ ) ‬ذاتي ‪object.__enter__( ‬‬

‫‪ as‬سوف بيان ربط قيمة هذه الطريقة في العودة إلى الهدف (ق) المحددة في‪ with‬أدخل سياق وقت التشغيل المرتبط بهذا الكائن‪ .‬و‬
‫‪.‬الفقرة من البيان‪ ،‬إن وجدت‬

‫‪object.__exit__( self ، exc_type ، exc_value ، traceback ) ‬‬

‫قم بإنهاء سياق وقت التشغيل المرتبط بهذا الكائن‪ .‬تصف المعلمات‪ L‬االستثناء الذي تسبب في إنهاء السياق‪ .‬إذا تم الخروج من السياق‬
‫‪ None.‬دون استثناء ‪ ،‬فستكون جميع الوسائط الثالثة‬

‫‪Pg. 44‬‬
‫إذا تم توفير استثناء ‪ ،‬ورغبت الطريقة في منع االستثناء (أي منعه من االنتشار) ‪ ،‬فيجب أن ترجع قيمة حقيقية‪ .‬خالف ذلك ‪ ،‬ستتم‬
‫‪.‬معالجة االستثناء بشكل طبيعي عند الخروج من هذه الطريقة‬

‫‪.‬األساليب ال يجب أن تعيد إنشاء االستثناء الذي تم تمريره ؛‪ ‬هذه هي مسؤولية المتصل)(__‪ __exit‬الحظ أن‬

‫أنظر أيضا‬

‫"بيان "مع ‪PEP 343 -‬‬

‫‪ .‬لبيان‪ ‬بايثون‪ with ‬المواصفات والخلفية واألمثلة‬

‫‪ ‬تخصيص الحجج الموضعية في مطابقة نمط الفصل‪3.3.10. ‬‬

‫عند استخدام اسم فئة في نمط ما ‪ ،‬ال يُسمح بالمتغيرات الموضعية في النمط افتراضيًا ‪ ،‬أي‪ ‬عادة ما تكون غير صالحة بدون دعم‬
‫خاص في‪ ‬النموذج‪  . ‬لتتمكن من استخدام هذا النوع من األنماط ‪ ،‬يحتاج الفصل إلى‬
‫‪ __match_args__ .case MyClass(x, y)MyClass‬تحديد‪ ‬سمة‬

‫__‪object.__match_args‬‬

‫يمكن تخصيص مجموعة من السالسل لمتغير الفئة هذا‪ .‬عند استخدام هذه الفئة في نمط فئة مع وسيطات‪ ‬موضعية‪ ، ‬سيتم تحويل كل‬
‫ككلمة أساسية‪ .‬عدم وجود هذه السمة ‪ __match_args__ ‬وسيطة‪ ‬موضعية‪ ‬إلى وسيطة كلمة رئيسية ‪ ،‬باستخدام القيمة المقابلة في‬
‫‪ ().‬يعادل تعيينها إلى‬

‫هو‪ ‬أن الوسائل التي‪ ‬تعادل‪ . ‬الحظ أن عدد الوسائط في النمط يجب أن يكون __‪ MyClass.__match_args‬على سبيل المثال‪ ،‬إذا‬
‫‪ .‬؛‪ ‬إذا كانت أكبر ‪ ،‬فإن محاولة مطابقة النمط سترفع‪ __match_args__ ‬أصغر من أو يساوي عدد العناصر في‬
‫‪("left", "center", "right")case MyClass(x, y)case MyClass(left=x, center=y)TypeError‬‬

‫الجديد في اإلصدار ‪3.10.1‬‬


‫أنظر أيضا‬

‫مطابقة األنماط الهيكلية ‪PEP 634 -‬‬

‫‪ .‬بيان‪ ‬بايثون‪ match‬مواصفات‬

‫‪ ‬طريقة البحث الخاصة‪3.3.11. ‬‬

‫بالنسبة للفئات المخصصة ‪ ،‬فإن االستدعاءات الضمنية للطرق الخاصة مضمونة فقط للعمل بشكل صحيح إذا تم تحديدها على نوع‬
‫‪:‬كائن ‪ ،‬وليس في قاموس مثيل الكائن‪ .‬هذا السلوك هو سبب قيام الشفرة التالية بإثارة استثناء‬

‫>>>‬

‫‪>>> class C:‬‬

‫‪...‬‬ ‫‪pass‬‬

‫‪...‬‬

‫)(‪>>> c = C‬‬

‫‪>>> c.__len__ = lambda: 5‬‬

‫)‪>>> len(c‬‬

‫‪Traceback (most recent call last):‬‬

‫>‪File "<stdin>", line 1, in <module‬‬

‫)(‪TypeError: object of type 'C' has no len‬‬

‫‪Pg. 45‬‬
‫يتم تنفيذ ذلك من خالل )(__‪ __repr‬و)(__‪ __hash‬األساس المنطقي وراء هذه األكاذيب السلوك مع عدد من الطرق الخاصة مثل‬
‫كافة‪ L‬الكائنات‪ ،‬بما في ذلك كائنات النوع‪  .‬إذا استخدم البحث الضمني لهذه الطرق عملية البحث التقليدية ‪ ،‬فإنها ستفشل عند استدعائها‬
‫‪:‬في كائن النوع نفسه‬

‫>>>‬

‫)‪>>> 1 .__hash__() == hash(1‬‬

‫‪True‬‬

‫)‪>>> int.__hash__() == hash(int‬‬

‫‪Traceback (most recent call last):‬‬

‫>‪File "<stdin>", line 1, in <module‬‬

‫‪TypeError: descriptor '__hash__' of 'int' object needs an argument‬‬

‫يُشار أحيا ًن ا إلى المحاولة غير الصحيحة الستدعاء طريقة غير منضمة لفئة بهذه الطريقة باسم `` ارتباك الطبقة الفوقية '' ‪ ،‬ويتم‬
‫‪:‬تجنبها عن طريق تجاوز المثيل عند البحث عن طرق خاصة‬

‫>>>‬

‫)‪>>> type(1).__hash__(1) == hash(1‬‬

‫‪True‬‬

‫)‪>>> type(int).__hash__(int) == hash(int‬‬

‫‪True‬‬

‫باإلضافة إلى تجاوز أي سمات‪ L‬مثيل من أجل الصحة ‪ ،‬فإن البحث الضمني الخاص بطريقة عامة يتخطى‬
‫‪:‬الطريقة حتى الخاصة بالفئة الوصفية للكائن)(__‪ __getattribute‬أيضًا‬

‫>>>‬

‫‪>>> class Meta(type):‬‬

‫‪...‬‬ ‫‪def __getattribute__(*args):‬‬

‫‪...‬‬ ‫)"‪print("Metaclass getattribute invoked‬‬

‫‪...‬‬ ‫)‪return type.__getattribute__(*args‬‬

‫‪...‬‬

‫‪>>> class C(object, metaclass=Meta):‬‬

‫‪...‬‬ ‫‪def __len__(self):‬‬

‫‪...‬‬ ‫‪return 10‬‬

‫‪...‬‬ ‫‪def __getattribute__(*args):‬‬

‫‪...‬‬ ‫)"‪print("Class getattribute invoked‬‬

‫‪...‬‬ ‫)‪return object.__getattribute__(*args‬‬

‫‪...‬‬

‫)(‪>>> c = C‬‬

‫‪Pg. 46‬‬
‫)(__‪>>> c.__len‬‬ ‫‪# Explicit lookup via instance‬‬

‫‪Class getattribute invoked‬‬

‫‪10‬‬

‫)‪>>> type(c).__len__(c‬‬ ‫‪# Explicit lookup via type‬‬

‫‪Metaclass getattribute invoked‬‬

‫‪10‬‬

‫)‪>>> len(c‬‬ ‫‪# Implicit lookup‬‬

‫‪10‬‬

‫اآللية بهذه الطريقة مجااًل كبيرً ا لتحسينات السرعة داخل المترجم الفوري ‪ ،‬على حساب بعض )(__‪ __getattribute‬يوفر تجاوز‬
‫المرونة في التعامل مع األساليب الخاصة (‪ ‬يجب‪ ‬تعيين‪ ‬الطريقة الخاصة‪  ‬على كائن الفئة نفسه حتى يتم استدعاؤها باستمرار من قبل‬
‫‪ .‬المترجم الفوري)‬

‫‪3.4. Coroutines‬‬

‫‪ ‬كائنات منتظرة‪3.4.1. ‬‬

‫التي تم‪ ‬إرجاعها من‪ ‬الوظائف في ‪ Coroutine‬األسلوب‪ .‬كائنات )(__‪ __await‬تنفذ الكائن عموما‪ awaitable ‬و‬


‫‪.async def‬انتظار‬

‫ملحوظة‬

‫‪ ‬‬

‫المنتظرة أيضً ا ‪ ،‬لكنها ال ‪ asyncio.coroutine() ‬أو)(‪ types.coroutine‬تم‪ ‬إرجاع كائنات‪ ‬مكرر المولد‪ ‬من المولدات المزينة‬


‫‪ __await__().‬تنفذ‬

‫‪ ) ‬ذاتي ‪object.__await__( ‬‬

‫تنفذ هذه الطريقة لتكون ‪ ، asyncio.Future‬يجب إرجاع‪ ‬مكرر‪ . ‬يجب أن تستخدم لتنفيذ‪ ‬األشياء‪ ‬المنتظرة‪ . ‬على سبيل المثال‬
‫‪.‬التعبير‪ await‬متوافقة مع‬

‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫أنظر أيضا‬

‫‪ ‬‬

‫‪.‬للحصول على معلومات إضافية حول األشياء المنتظرة‪PEP 492 ‬‬

‫‪ Coroutine ‬كائنات‪3.4.2. ‬‬

‫والتكرار على )(__‪__await‬عن طريق االتصال ‪ coroutine‬هيأشياء‪ ‬منتظرة‪ . ‬يمكن التحكم في تنفيذ‪ Coroutine ‬كائنات‬


‫وتحتفظ سمةاالستثناء‪ ‬بقيمة ‪StopIteration،value‬من التنفيذ والعودة ‪ ،‬يرتفع المكرر ‪ coroutine‬النتيجة‪ .‬عندما ينتهي‬
‫ا‪StopIteration‬بشكل مباشر ‪ Coroutines‬استثنا ًء ‪ ،‬فسيتم نشره بواسطة المكرر‪ .‬ال ينبغي أن تثير ‪ coroutine‬اإلرجاع‪ .‬إذا أثار‬
‫‪.‬الستثناءات غيرالمعالجة‪L‬‬

‫أيضً ا على الطرق المدرجة أدناه ‪ ،‬والتي تشبه تلك الخاصة بالمولدات (انظر‪ ‬طرق المولد التكراري‪ .) ‬ومع ‪ Coroutines‬تحتوي‬
‫‪.‬التكرار بشكل مباشر ‪ coroutines‬ذلك ‪ ،‬على عكس المولدات ‪ ،‬ال تدعم‬

‫‪.‬أكثر من مرة ‪ coroutine‬انتظار على‪ RuntimeError‬تم التغيير في اإلصدار ‪ :3.5.2‬إنه‬

‫‪Pg. 47‬‬
‫‪ ) ‬القيمة ‪coroutine.send( ‬‬

‫إذا‪ ‬لم ‪ __await__(). ‬وهذا هو ما يعادل دفع مكرر إرجاعها من قبل ‪ None،‬إذا‪ ‬القيمة‪ ‬هي‪ coroutine. ‬بدء أو استئناف تنفيذ‬
‫قيمة ( النتيجة‪ coroutine. ‬طريقة المكرر التي تسببت في تعليق)(‪ send‬فإن هذه الطريقة تفوض إلى ‪ None،‬تكن‪ ‬القيمة‪ ‬كذلك‬
‫‪.‬قيمة اإلرجاع ‪ ،‬الموصوفة أعاله)(__‪ __await‬هي نفسها عند التكرار على )أو استثناء آخر ‪ StopIteration،‬اإلرجاع‬

‫‪coroutine.throw( type  [ ، value  [ ، traceback  ] ] ) ‬‬

‫إذا كان ‪ coroutine ،‬طريقة المكرر التي تسببت في توقف)(‪ throw‬تفوض هذه الطريقة‪ coroutine. ‬يرفع االستثناء المحدد في‬
‫)أو استثناء آخر ‪ StopIteration،‬قيمة اإلرجاع( لديها مثل هذه الطريقة‪ .‬خالف ذلك ‪ ،‬يتم رفع االستثناء عند نقطة التعليق‪ .‬النتيجة‬
‫فإنه ‪ coroutine ،‬قيمة اإلرجاع ‪ ،‬الموصوفة أعاله‪ .‬إذا لم يتم اكتشاف االستثناء في)(__‪ __await‬هي نفسها عند التكرار على‬
‫‪.‬ينتشر مرة أخرى إلى المتصل‬

‫)(‪coroutine.close‬‬

‫طريقة المكرر ‪ close() ‬فإن هذه الطريقة تفوض أوالً إلى ‪ coroutine ،‬يتسبب الكوروتين في تنظيف نفسه والخروج‪ .‬إذا تم تعليق‬
‫عند نقطة التعليق ‪ ،‬مما يجعل ‪ GeneratorExit‬إذا كان لديها مثل هذه الطريقة‪ .‬ثم يرتفع ‪ coroutine ،‬التي تسببت في توقف‬
‫‪.‬على أنه انتهى من التنفيذ ‪ ،‬حتى لو لم يبدأ مطل ًقا ‪ coroutine‬الكوروتين ينظف نفسه على الفور‪ .‬أخيرً ا ‪ ،‬تم وضع عالمة على‬

‫‪.‬تلقائيًا باستخدام العملية المذكورة أعاله عندما تكون على وشك التدمير ‪ Coroutine‬يتم إغالق كائنات‬

‫‪ ‬التكرارات غير المتزامنة‪3.4.3. ‬‬

‫‪.‬األسلوب__‪ __anext‬و‪ ‬مكرر غير المتزامن‪ ‬يمكن استدعاء كود غير متزامن في تقريرها‬

‫‪.async for‬يمكن استخدام التكرارات غير المتزامنة في‪ ‬البيان‬

‫‪ ) ‬ذاتي ‪object.__aiter__( ‬‬

‫‪ .‬يجب إرجاع‪ ‬كائن‪ ‬مكرر غير متزامن‬

‫‪ ) ‬ذاتي ‪object.__anext__( ‬‬

‫‪.‬خطأ عند انتهاء التكرار‪ StopAsyncIteration‬يجب أن ُترجع قيمة‪ ‬منتظرة‪ ‬تؤدي إلى قيمة تالية‪ ‬للمكرر‪ . ‬يجب أن يظهر‬

‫‪:‬مثال على كائن قابل للتكرار غير متزامن‬

‫‪class Reader:‬‬

‫‪async def readline(self):‬‬

‫‪...‬‬

‫‪def __aiter__(self):‬‬

‫‪return self‬‬

‫‪async def __anext__(self):‬‬

‫)(‪val = await self.readline‬‬

‫‪if val == b'':‬‬

‫‪raise StopAsyncIteration‬‬

‫‪return val‬‬

‫‪Pg. 48‬‬
‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫الممكن أن يعيد‪ ‬أمرً ا منتظرً ا من‪ ‬شأنه أن يحل __‪ __aiter‬كان من ‪ Python 3.7 ،‬تم التغيير في اإلصدار ‪ :3.7‬قبل استخدام‬
‫‪ .‬إلى‪ ‬مكرر غير متزامن‬

‫‪.‬خطأ‪ TypeError‬يجب إرجاع كائن مكرر غير متزامن‪ .‬إرجاع أي شيء آخر سينتج عنه__‪ Python 3.7 ، __aiter‬بدءًا من‬

‫‪ ‬مديرو السياق غير المتزامن‪3.4.4. ‬‬

‫‪.‬األساليب__‪ __aexit‬و__‪ __aenter‬و‪ ‬مدير سياق غير متزامن‪ ‬هو‪ ‬مدير السياق‪ ‬أن يكون قادرا على وقف إعدام في تقريرها‬

‫‪.async with‬يمكن استخدام مديري السياق غير المتزامن في‪ ‬بيان‬

‫‪ ) ‬ذاتي ‪object.__aenter__( ‬‬

‫‪ .‬االختالف الوحيد هو أنه يجب أن يعيد‪ ‬انتظارً ا ‪ __enter__()،‬يشبه إلى حد كبير‬

‫‪object.__aexit__( self ، exc_type ، exc_value ، traceback ) ‬‬

‫‪ .‬االختالف الوحيد هو أنه يجب أن يعيد‪ ‬انتظارً ا ‪ __exit__()،‬يشبه إلى حد كبير‬

‫‪:‬مثال على فئة مدير سياق غير متزامن‬

‫‪class AsyncContextManager:‬‬

‫‪async def __aenter__(self):‬‬

‫)'‪await log('entering context‬‬

‫‪async def __aexit__(self, exc_type, exc, tb):‬‬

‫)'‪await log('exiting context‬‬

‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫الحواشي‬
‫‪1‬‬

‫ومن‪ ‬غير‪  ‬الممكن في بعض الحاالت لتغيير نوع الكائن‪ ،‬في ظل ظروف خاضعة للرقابة معينة‪ .‬على الرغم من أنها ليست فكرة جيدة‬
‫‪.‬بشكل عام ‪ ،‬حيث يمكن أن تؤدي إلى سلوك غريب للغاية إذا تم التعامل معها بشكل غير صحيح‬

‫‪2‬‬

‫الطرق لها معالجة خاصة لذلك؛‪ ‬سيستمر اآلخرون في )(__‪ __contains‬و ‪ __hash__()، __iter__()، __reversed__()،‬و‬


‫‪.‬غير القابل لالستدعاء‪ None‬ولكن قد يفعلون ذلك باالعتماد على السلوك ‪ a TypeError،‬رفع‬

‫‪3‬‬

‫ال تقم بتعيين الطريقة ‪ NotImplemented. ‬تعني عبارة "ال يدعم" هنا أن الفئة ليس لديها مثل هذه الطريقة ‪ ،‬أو أن الطريقة ترجع‬
‫إذا كنت تريد فرض الرجوع إلى الطريقة المنعكسة‪ L‬في المعامل األيمن ‪ -‬فسيكون لذلك بدالً من ذلك تأثير معاكس‪ None‬على‬
‫‪  .‬لحظر‪ ‬هذا اإلجراء االحتياطي‪ ‬بشكل صريح‬

‫‪4‬‬

‫فشلت‪ ‬الطريقة غير المنعكسة ‪ -‬مثل‪ - ‬فإن العملية اإلجمالية غير )(__‪ __add‬بالنسبة للمعامالت‪ L‬من نفس النوع ‪ ،‬يُفترض أنه إذا‬
‫‪.‬مدعومة ‪ ،‬وهذا هو سبب عدم استدعاء الطريقة المنعكسة‪L‬‬

‫‪Pg. 49‬‬
‫‪ ‬نموذج التنفيذ‪4. ‬‬

‫‪ ‬هيكل البرنامج‪4.1 ‬‬

‫كتلة‪  ‬هو قطعة من نص البرنامج بيثون التي يتم تنفيذها كوحدة واحدة‪ .‬فيما‪. A ‬من كتل التعليمات البرمجية ‪ Python‬يتم إنشاء برنامج‬
‫يلي الكتل‪ :‬وحدة نمطية وجسم وظيفي وتعريف فئة‪ .‬كل أمر مكتوب بشكل تفاعلي عبارة عن كتلة‪ .‬ملف البرنامج النصي (ملف يتم‬
‫( تقديمه كمدخل قياسي للمترجم أو يتم تحديده كوسيطة سطر أوامر للمترجم) عبارة عن كتلة تعليمات برمجية‪ .‬أمر البرنامج النصي‬
‫هو كتلة تعليمات برمجية‪ .‬الوحدة النمطية التي يتم تشغيلها كبرنامج )الخيار‪ -c‬األمر المحدد في سطر أوامر المترجم مع‬
‫ضا كتلة تعليمات برمجية‪ .‬حجة ‪ -m‬عالي‪ ‬المستوى (كوحدة نمطية‪ ) ‬من سطر األوامر باستخدام__‪ __main‬نصي‬ ‫وسيطة هي أي ً‬
‫‪.‬هي كتلة التعليمات البرمجية)(‪ exec‬و)(‪ eval‬السلسلة التي تم تمريرها إلى وظائف المدمج في‬

‫يتم تنفيذ كتلة التعليمات البرمجية في‪ ‬إطار التنفيذ‪ . ‬يحتوي اإلطار على بعض المعلومات اإلدارية (المستخدمة‪ L‬في التصحيح) ويحدد‬
‫‪.‬مكان وكيفية استمرار التنفيذ بعد اكتمال تنفيذ كتلة التعليمات البرمجية‬

‫‪ ‬التسمية‪4.2 ‬‬

‫‪ ‬تجليد األسماء‪4.2.1. ‬‬

‫‪.‬األسماء‪ ‬تشير إلى األشياء‪ .‬يتم تقديم األسماء‪ L‬من خالل عمليات ربط االسم‬

‫والعبارات وتعريفات الفئة والوظيفة (هذه تربط الفئة أو اسم ‪ import‬ترتبط التركيبات التالية باألسماء‪ :‬المعلمات‪ L‬الرسمية للوظائف‬
‫عبارة ‪ with‬في‪ as‬رأس حلقة أو بعد ذلك‪ for‬الوظيفة في كتلة التعريف) ‪ ،‬واألهداف التي تكون معرفات‪ L‬إذا حدثت في مهمة أو‬
‫بيان من شكل‪ ‬ملزم لجميع األسماء‪ L‬المعرفة في وحدة المستوردة‪ ،‬ما عدا تلك التي تبدأ مع تسطير‪ .‬ال ‪ import‬فقرة‪ .‬في‪ except‬أو‬
‫*‪.from ... import ‬يجوز استخدام هذا النموذج إال على مستوى الوحدة النمطية‬

‫‪.‬العبارة أيضً ا ملزما ً لهذا الغرض (على الرغم من أن الدالالت الفعلية هي لفك ربط االسم)‪ del‬يعتبر الهدف الذي يحدث في‬

‫يحدث كل تعيين أو عبارة استيراد داخل كتلة محددة بواسطة تعريف فئة أو دالة أو على مستوى الوحدة النمطية (كتلة رمز المستوى‬
‫‪.‬األعلى)‬
‫ً‬
‫مرتبطا في كتلة ‪ ،‬فسيكون متغيرً ا محليًا لتلك الكتلة ‪ ،‬ما لم يتم اإلعالن عنه كـ‬ ‫إذا كان االسم ‪ global. ‬أو‪ nonlocal‬إذا كان االسم‬
‫ً‬
‫مرتبطا على مستوى الوحدة النمطية ‪ ،‬فسيكون متغيرً ا عامًا‪(  .‬متغيرات كتلة رمز الوحدة النمطية محلية وعالمية‪ ).‬إذا تم استخدام‬
‫‪ .‬متغير في كتلة تعليمات برمجية ولكن لم يتم تعريفه هناك ‪ ،‬فهو‪ ‬متغير حر‬

‫‪.‬يشير كل تكرار السم في نص البرنامج إلى‪ ‬ربط‪ ‬هذا االسم الذي تحدده قواعد تحليل االسم التالية‬

‫‪ ‬حل أسماء‪4.2.2. ‬‬

‫نطاق‪ ‬يحدد الرؤية من اسم داخل كتلة‪ .‬إذا تم تعريف متغير محلي في كتلة ‪ ،‬فإن نطاقه يتضمن تلك الكتلة‪ .‬إذا حدث التعريف في ‪A ‬‬
‫ً‬
‫ارتباطا مختل ًفا لالسم‬ ‫‪.‬كتلة دالة ‪ ،‬فإن النطاق يمتد إلى أي كتل متضمنة في كتلة التعريف ‪ ،‬ما لم تقدم الكتلة المضمنة‬

‫عند استخدام اسم في مقطع تعليمات برمجية ‪ ،‬يتم حله باستخدام أقرب نطاق متضمن‪ .‬تسمى مجموعة كل هذه النطاقات‪ L‬المرئية‬
‫‪ .‬لمجموعة التعليمات البرمجية‪ ‬بيئة‪ ‬الكتلة‬

‫استثناء‪ .‬إذا كان النطاق الحالي عبارة عن نطاق دالة ‪ ،‬وكان االسم‪ NameError‬عندما ال يتم العثور على اسم على اإلطالق ‪ ،‬يظهر‬
‫‪ UnboundLocalError‬يشير إلى متغير محلي لم يتم ربطه بعد بقيمة في النقطة التي يتم فيها استخدام االسم ‪ ،‬فسيظهر‬
‫‪ NameError.‬هي فئة فرعية من‪. UnboundLocalError‬استثناء‬

‫إذا حدثت عملية ربط االسم في أي مكان داخل كتلة التعليمات البرمجية ‪ ،‬فسيتم التعامل مع جميع استخدامات‪ L‬االسم داخل الكتلة‬
‫كمراجع للكتلة الحالية‪  .‬يمكن أن يؤدي هذا إلى حدوث أخطاء عند استخدام اسم داخل كتلة قبل ربطها‪ .‬هذه القاعدة خفية‪ .‬تفتقر‬
‫إلى اإلعالنات وتسمح بحدوث عمليات ربط األسماء‪ L‬في أي مكان داخل كتلة التعليمات البرمجية‪ .‬يمكن تحديد المتغيرات ‪Python‬‬
‫‪.‬المحلية لمجموعة التعليمات البرمجية عن طريق مسح النص الكامل للكتلة لعمليات ربط االسم‬

‫العبارة تحدث داخل كتلة ‪ ،‬فإن جميع استخدامات االسم المحدد في العبارة تشير إلى ربط هذا االسم في مساحة‪ L‬اسم ‪ global‬إذا كانت‬
‫المستوى األعلى‪ .‬يتم حل األسماء‪ L‬في مساحة‪ L‬اسم المستوى األعلى من خالل البحث في مساحة االسم العامة ‪ ،‬أي مساحة اسم الوحدة‬
‫يتم البحث في مساحة ‪ builtins. ‬التي تحتوي على كتلة التعليمات البرمجية ‪ ،‬ومساحة االسم المبنية ‪ ،‬ومساحة اسم الوحدة النمطية‬

‫‪Pg. 50‬‬
‫بيان يجب أن تسبق جميع ‪ global‬االسم العالمية أوالً‪  .‬إذا لم يتم العثور على االسم هناك ‪ ،‬فسيتم البحث في مساحة‪ L‬االسم المبنية‪ .‬في‬
‫‪.‬استخدامات االسم‬

‫بيان له نفس نطاق كاسم عملية الربط في نفس الكتلة‪ .‬إذا كان أقرب نطاق متضمن للمتغير الحر يحتوي على عبارة ‪ global‬في‬
‫‪.‬عامة ‪ ،‬فسيتم التعامل مع المتغير الحر على أنه متغير عام‬

‫يتم رفعه ‪. SyntaxError‬يسبب بيان أسماء المقابلة لإلشارة إلى المتغيرات ملزمة سابقا في أقرب نطاق وظيفة إرفاق‪ nonlocal‬و‬
‫‪.‬في وقت الترجمة إذا لم يكن االسم المحدد موجو ًدا في أي نطاق دالة متضمن‬

‫يتم إنشاء مساحة االسم للوحدة النمطية تلقائيًا في المرة األولى التي يتم فيها استيراد الوحدة‪ .‬يتم دائمًا استدعاء الوحدة النمطية‬
‫‪ __main__.‬الرئيسية للبرنامج النصي‬

‫هي خاصة في سياق تحليل االسم‪  .‬تعريف الفئة هو بيان قابل للتنفيذ قد يستخدم )(‪ eval‬و)(‪ exec‬الطبقة كتل تعريف والحجج ل‬
‫ويعرف األسماء‪  .‬تتبع هذه المراجع القواعد العادية لتحليل االسم مع استثناء يتم البحث عن المتغيرات المحلية غير المنضمة في‬
‫مساحة‪ L‬االسم العمومية‪ .‬تصبح مساحة‪ L‬اسم تعريف الفئة قاموس السمات الخاص بالفئة‪ .‬يقتصر نطاق األسماء المحددة في كتلة فئة‬
‫على كتلة الفئة ؛‪  ‬ال يمتد إلى كتل التعليمات البرمجية للطرق ‪ -‬وهذا يشمل اإلدراك وتعبيرات المولد حيث يتم تنفيذها باستخدام نطاق‬
‫‪:‬وظيفة‪ .‬هذا يعني أن ما يلي سوف يفشل‬

‫‪class A:‬‬

‫‪a = 42‬‬

‫))‪b = list(a + i for i in range(10‬‬

‫‪ ‬المدمج والتنفيذ المقيد‪4.2.3. ‬‬

‫؛‪ ‬إنها تفاصيل تنفيذ بدقة‪ .‬يجب على المستخدمين __‪ __builtins‬يجب على المستخدمين عدم لمس‪ CPython: ‬تفاصيل تنفيذ‬
‫‪.‬الوحدة النمطية وتعديل سماتها‪ L‬بشكل مناسب‪ builtinsL‬على‪ import‬الراغبين في تجاوز القيم في مساحة‪ L‬االسم المبنية‬

‫في __‪ __builtins‬تم العثور بالفعل على مساحة‪ L‬االسم المبنية المرتبطة بتنفيذ كتلة التعليمات البرمجية من خالل البحث عن االسم‬
‫مساحة االسم العالمية الخاصة به ؛‪ ‬يجب أن يكون هذا قامو ًس ا أو وحدة نمطية (في الحالة األخيرة يتم استخدام قاموس الوحدة)‪ .‬بشكل‬
‫؛‪ ‬عندما يكون في ‪ builtins‬هي‪ ‬الوحدة النمطية‪ ‬المدمجة__‪ ، __builtins‬الوحدة النمطية__‪ __main‬افتراضي ‪ ،‬عندما تكون في‬
‫‪.‬الوحدة نفسها‪ builtins‬هو اسم مستعار لقاموس__‪ ، __builtins‬أي وحدة أخرى‬

‫‪ ‬التفاعل مع الميزات الديناميكية‪4.2.4. ‬‬

‫‪ :‬يحدث تحليل االسم للمتغيرات المجانية في وقت التشغيل ‪ ،‬وليس في وقت الترجمة‪ .‬هذا يعني أن الكود التالي سيطبع ‪42‬‬

‫‪i = 10‬‬

‫‪def f():‬‬

‫)‪print(i‬‬

‫‪i = 42‬‬

‫)(‪f‬‬

‫ظائف ال يستطيعون الوصول إلى بيئة مليئة لحل األسماء‪ .‬يمكن حل األسماء في مساحات‪ L‬األسماء المحلية )(‪ exec‬و)(‪ eval‬و‬
‫)(‪ exec‬والعالمية للمتصل‪  .‬ال يتم حل المتغيرات المجانية في أقرب مساحة اسم متضمنة ‪ ،‬ولكن في مساحة‪ L‬االسم العامة‪ 1 .‬إن‬
‫ظائف لديها الوسائط االختيارية لتجاوز مساحة االسم العالمي والمحلي‪ .‬إذا تم تحديد مساحة اسم واحدة فقط ‪ ،‬فسيتم )(‪ eval‬و‬
‫‪.‬استخدامها لكليهما‬

‫‪4.3. Exceptions‬‬

‫‪Pg. 51‬‬
‫االستثناءات هي وسيلة للخروج من التدفق الطبيعي للتحكم في كتلة التعليمات البرمجية من أجل معالجة‪ L‬األخطاء أو غيرها من‬
‫الظروف االستثنائية‪ .‬واستثناء‪ ‬أثار‪ ‬عند نقطة حيث تم الكشف عن الخطأ‪ .‬يمكن‪ ‬معالجته من‪ ‬خالل كتلة التعليمات البرمجية المحيطة‬
‫‪.‬أو عن طريق أي كتلة رمز استدعت بشكل مباشر أو غير مباشر كتلة التعليمات البرمجية حيث حدث الخطأ‬

‫ضا أن يثير ‪ Python‬استثنا ًء عندما يكتشف خطأ وقت التشغيل (مثل القسمة على صفر)‪ .‬يمكن لبرنامج ‪ Python‬يثير مترجم‬ ‫أي ً‬
‫يمكن ‪ try… except. ‬العبارة‪ .‬يتم تحديد معالجات االستثناءات باستخدام‪ ‬العبارة‪ raise‬استثنا ًء بشكل صريح مع‬
‫عبارة هذه العبارة لتحديد رمز التنظيف الذي ال يتعامل مع االستثناء ‪ ،‬ولكن يتم تنفيذه سواء حدث استثناء أم ال في ‪ finally ‬استخدام‬
‫‪.‬الكود السابق‬

‫نموذج "اإلنهاء" لمعالجة الخطأ‪ :‬يمكن لمعالج االستثناء اكتشاف ما حدث ومتابعة التنفيذ على مستوى خارجي ‪ Python ،‬تستخدم‬
‫‪.‬لكنه ال يمكنه إصالح سبب الخطأ وإعادة محاولة العملية الفاشلة (باستثناء إعادة إدخال القطعة المخالفة من الكود من األعلى)‬

‫عندما ال يتم التعامل مع استثناء على اإلطالق ‪ ،‬يقوم المترجم بإنهاء تنفيذ البرنامج أو العودة إلى الحلقة الرئيسية التفاعلية الخاصة‬
‫‪ SystemExit.‬به‪ .‬في كلتا الحالتين ‪ ،‬يقوم بطباعة تتبع مكدس‪ ، L‬إال عندما يكون االستثناء هو‬
‫ً‬
‫اعتماد ا على فئة المثيل‪ :‬يجب أن تشير إلى فئة المثيل أو فئة ‪ except‬يتم تحديد االستثناءات من خالل حاالت الفئة‪ .‬يتم تحديد‬ ‫الجملة‬
‫‪.‬أساسية منها‪  .‬يمكن للمعالج تلقي المثيل ويمكن أن يحمل معلومات إضافية حول الحالة االستثنائية‬

‫ملحوظة‬

‫‪ ‬‬

‫إلى اإلصدار التالي دون سابق ‪ Python‬قد تتغير محتوياتها من إصدار واحد من‪ Python API. ‬رسائل االستثناء ليست جزءًا من‬
‫‪.‬إنذار وال ينبغي االعتماد عليها بواسطة الكود الذي سيعمل تحت إصدارات متعددة من المترجم‬

‫‪ .‬جاء في القسم‪ ‬البيان رفع‪ raise‬البيان في القسم‪ ‬البيان المحاولة‪ ‬و‪ try‬انظر أيضا وصف‬

‫¶‪ ‬نظام االستيراد‪5. ‬‬

‫البيان هو الطريقة ‪ import‬في‪ ‬وحدة‪ ‬واحدة‪ ‬الوصول إلى الكود في وحدة أخرى من خالل عملية‪ ‬استيراده‪ . ‬و ‪ Python‬يكتسب‪ ‬كود‬
‫األكثر شيوعا الستدعاء استيراد اآلالت‪ ،‬ولكنها ليست الطريقة الوحيدة‪ .‬يمكن أيضً ا استخدام‪ ‬وظائف مثل‬
‫‪.‬الستدعاء آالت االستيراد)(__‪ __import‬مدمجة)(‪ importlib.import_module‬ووظائف‬

‫بيان يجمع بين اثنين من العمليات؛‪  ‬يبحث عن الوحدة النمطية المسماة ‪ ،‬ثم يقوم بربط نتائج هذا البحث باسم في النطاق ‪ import‬في‬
‫للوظيفة ‪ ،‬مع الوسيطات )(__‪ __import‬يتم تعريف‪ ‬عملية البحث الخاصة‪ ‬بالبيان على أنها استدعاء‪. import‬المحلي‬
‫البيان للحصول على ‪ import‬راجع‪ import. ‬يتم استخدام‪ ‬قيمة اإلرجاع‪ ‬ألداء عملية ربط االسم للعبارة)(__‪. __import‬المناسبة‬
‫‪.‬التفاصيل الدقيقة لعملية ربط االسم هذه‬

‫بحث الوحدة فقط ‪ ،‬وإذا وجدت ‪ ،‬عملية إنشاء‪ L‬الوحدة‪ .‬بينما قد تحدث بعض اآلثار الجانبية ‪ __import__()،‬استدعاء مباشر إلجراء‬
‫البيان‪ ‬فقط‪ ‬ينفذ‪ import‬فإن ‪ sys.modules) ،‬بما في ذلك( مثل استيراد الحزم األصلية ‪ ،‬وتحديث ذاكرات التخزين المؤقت المختلفة‬
‫‪.‬عملية ربط االسم‬

‫قد )(‪ . importlib.import_module‬يتم استدعاء الوظيفة المضمنة‪ ‬القياسية )(__‪ ، __import‬يتم تنفيذ جملة‪ import‬عندما‬


‫واستخدام الحلول الخاصة بها لتنفيذ دالالت )(__‪ __import‬تختار‪ ‬اآلليات األخرى الستدعاء نظام االستيراد (مثل‪ ) ‬تجاوز‬
‫‪.‬االستيراد‬

‫عن الوحدة النمطية وإذا وجدت ‪ ،‬فإنها تنشئ كائن وحدة نمطية‪ Python ، 1 ‬عندما يتم استيراد وحدة نمطية ألول مرة ‪ ،‬تبحث‬
‫استراتيجيات مختلفة ‪ Python‬رفع‪ .‬تنفذ ‪ ModuleNotFoundError‬وتهيئتها‪ .‬إذا تعذر العثور على الوحدة النمطية المسماة‪ ، L‬فسيتم‬
‫للبحث عن الوحدة النمطية المسماة عند استدعاء آلية االستيراد‪ .‬يمكن تعديل هذه االستراتيجيات وتوسيعها باستخدام العديد من‬
‫‪.‬الخطافات الموضحة في األقسام أدناه‬

‫تم التغيير في اإلصدار ‪  :3.3‬تم تحديث نظام االستيراد لتنفيذ المرحلة الثانية من‪ . 302‬لم يعد هناك أي آالت استيراد ضمنية ‪ -‬يتم‬
‫( باإلضافة إلى ذلك ‪ ،‬تم تنفيذ دعم حزمة مساحة االسم األصلية‪sys.meta_path. ‬الكشف عن نظام االستيراد الكامل من خالل‬
‫‪PEP 420 ).‬انظر‬

‫‪Pg. 52‬‬
‫‪5.1. importlib‬‬

‫توفر وحدة واجهة برمجة تطبيقات غنية للتفاعل مع نظام االستيراد‪ .‬على سبيل ‪ importlib‬و‬
‫يوفر واجهة برمجة تطبيقات موصى بها وأبسط من واجهة برمجة التطبيقات )(‪ ، importlib.import_module‬المثال‬
‫‪.‬وثائق المكتبة لمزيد من التفاصيل‪ importlib‬الستدعاء آلية االستيراد‪ .‬الرجوع إلى)(__‪ __import‬المضمنة‬

‫‪5.2. Packages‬‬

‫على نوع واحد فقط من كائنات الوحدة النمطية ‪ ،‬وجميع الوحدات من هذا النوع ‪ ،‬بغض النظر عما إذا كانت الوحدة ‪ Python‬تحتوي‬
‫أو أي شيء آخر‪  .‬للمساعدة في تنظيم الوحدات النمطية وتوفير تسلسل هرمي للتسمية ‪ ،‬لدى ‪ C‬أو ‪ Python‬النمطية مطبقة في‬
‫‪ .‬مفهوم‪ ‬الحزم ‪Python‬‬

‫يمكنك التفكير في الحزم على أنها أدلة على نظام الملفات والوحدات النمطية كملفات داخل الدالئل ‪ ،‬لكن ال تأخذ هذا التشبيه حرفيًا‬
‫ألن الحزم والوحدات النمطية ال تحتاج إلى أن تنشأ من نظام الملفات‪  .‬ألغراض هذه الوثائق ‪ ،‬سنستخدم هذا القياس المريح لألدلة‬
‫والملفات‪  .‬مثل دالئل نظام الملفات ‪ ،‬يتم تنظيم الحزم بشكل هرمي ‪ ،‬وقد تحتوي الحزم نفسها على حزم فرعية ‪ ،‬باإلضافة إلى‬
‫‪.‬وحدات نمطية عادية‬

‫من المهم أن تضع في اعتبارك أن جميع الحزم عبارة عن وحدات نمطية ‪ ،‬ولكن ليست كل الوحدات عبارة عن حزم‪ .‬أو بعبارة‬
‫‪.‬سمة حزمة__‪ __path‬أخرى ‪ ،‬الحزم هي مجرد نوع خاص من الوحدات‪ .‬على وجه التحديد ‪ ،‬تعتبر أي وحدة نمطية تحتوي على‬

‫جميع الوحدات لها اسم‪  .‬يتم فصل أسماء الحزم الفرعية عن اسم الحزمة األصلي بنقطة ‪ ،‬على غرار بناء جملة الوصول إلى السمة‬
‫والتي بدورها تحتوي على حزمة فرعية تسمى ‪ email،‬الحزمة‪ sys‬القياسية لبايثون‪ .‬وبالتالي قد يكون لديك وحدة تسمى وتسمى‬
‫‪ email.mime.text.‬النمطية داخل تلك‪ ‬الحزمة‪ ‬الفرعية تسمى‪ email.mime‬والوحدة‬

‫‪ ‬الحزم العادية‪5.2.1. ‬‬

‫تعرف الثعبان نوعين من الحزم‪ ،‬و‪ ‬الحزم العادية‪ ‬و‪ ‬الحزم مساحة االسم‪ . ‬الحزم العادية هي حزم تقليدية كما كانت موجودة في‬
‫ملف‪ .‬عندما يتم استيراد حزمة‪ __init__.py‬واإلصدارات األقدم‪ .‬عادة ما يتم تنفيذ الحزمة العادية كدليل يحتوي على ‪Python 3.2‬‬
‫‪ __init__.py‬يتم تنفيذ‪ ‬هذا‪ ‬الملف ضمنيًا ‪ ،‬وترتبط الكائنات التي يحددها بأسماء‪ L‬في مساحة‪ L‬اسم الحزمة‪ .‬و‪ ، __init__.py‬عادية‬
‫يمكن أن تحتوي على ملف نفس رمز بيثون التي يمكن أن تحتوي على أي وحدة أخرى‪ ،‬وسوف بيثون إضافة بعض سمات‪ L‬إضافية‬
‫‪.‬إلى وحدة عندما يتم استيراده‬

‫‪:‬حزمة‪ ‬المستوى األعلى‪ ‬بثالث حزم فرعية‪ parent ‬على سبيل المثال ‪ ،‬يحدد تخطيط نظام الملفات التالي‬

‫‪parent/‬‬

‫‪__init__.py‬‬

‫‪one/‬‬

‫‪__init__.py‬‬

‫‪two/‬‬

‫‪__init__.py‬‬

‫‪three/‬‬

‫‪__init__.py‬‬

‫الواردات الالحقة ‪ parent/one/__init__.py. ‬و‪ parent/__init__.py‬سينفذ ضمنيًا‪ parent.one‬االستيراد‬


‫‪.‬التوالي‪ parent/three/__init__.py‬وعلى‪ parent/two/__init__.py‬سيتم تنفيذها‪ parent.three‬أو‪ parent.two‬من‬

‫‪ Namespace ‬حزم‪5.2.2. ‬‬

‫تعد حزمة مساحة االسم مركبًا من‪ ‬أجزاء‪ ‬مختلفة‪ ، ‬حيث يساهم كل جزء بحزمة فرعية في الحزمة الرئيسية‪ .‬قد تتواجد األجزاء في‬
‫ض ا العثور على األجزاء في ملفات مضغوطة أو على الشبكة أو في أي مكان آخر تبحث فيه‬‫مواقع مختلفة على نظام الملفات‪ .‬يمكن أي ً‬

‫‪Pg. 53‬‬
‫مباشرة مع الكائنات الموجودة في نظام الملفات وقد ال تتوافق معها ؛‪ ‬قد ‪ Namespace‬أثناء االستيراد‪ .‬قد تتوافق حزم ‪Python‬‬
‫‪.‬تكون وحدات افتراضية ليس لها تمثيل ملموس‬

‫صا يقوم تلقائيًا ‪ __path__ ‬قائمة عادية ‪ Namespace‬ال تستخدم حزم‬ ‫لسماتها‪ .‬بدالً من ذلك ‪ ،‬يستخدمون نوعً ا متكررً ا مخص ً‬
‫‪ sys.path‬أو( بإجراء بحث جديد عن أجزاء الحزمة في محاولة االستيراد التالية داخل تلك الحزمة إذا تغير مسار الحزمة األصلية‬
‫‪).‬لحزمة المستوى األعلى‬

‫العثور على أدلة‪ ‬متعددة‪ ‬أثناء بحث ‪ parent‬ملف‪ .‬في الواقع ‪ ،‬قد يتم‪ parent/__init__.py‬مع حزم مساحة االسم ‪ ،‬ال يوجد‬
‫قد ال يكون موجو ًدا فعليًا ‪ parent/one‬االستيراد ‪ ،‬حيث يتم توفير كل منها بواسطة جزء مختلف‪ .‬وبالتالي‬
‫عندما يتم استيرادها أو ‪ parent‬حزمة مساحة اسم لحزمة المستوى األعلى ‪ Python‬في هذه الحالة ‪ ،‬ستنشئ‪ parent/two. ‬بجوار‬
‫‪.‬إحدى حزمها الفرعية‬

‫‪.‬لمواصفات حزمة مساحة‪ L‬االسم‪ PEP 420 ‬أنظر أيضا‬

‫‪5.3. Searching‬‬

‫إلى‪ ‬اسم‪ ‬مؤهل بالكامل‪ ‬للوحدة (أو الحزمة ‪ ،‬ولكن ألغراض هذه المناقشة‪ ، L‬فإن االختالف غير ‪ Python‬لبدء البحث ‪ ،‬تحتاج‬
‫للبيان ‪ ،‬أو من المعلمات‪ import L‬جوهري) التي يتم استيرادها‪ .‬قد يأتي هذا االسم من وسيطات مختلفة‬
‫‪.‬وظائف)(__‪ __import‬أو)(‪ importlib.import_module‬إلى‬

‫سيتم استخدام هذا االسم في مراحل مختلفة من بحث االستيراد ‪ ،‬وقد يكون المسار المنقط إلى وحدة فرعية ‪ ،‬على سبيل‬
‫في حالة فشل أي‪ foo.bar.baz. ‬وأخيرً ا ‪ foo.bar،‬ثم ‪ foo،‬أوالً االستيراد ‪ Python‬في هذه الحالة ‪ ،‬تحاول‪ foo.bar.baz. ‬المثال‬
‫‪ a.‬يتم رفع‪ ، ModuleNotFoundError‬من الواردات الوسيطة‬

‫‪ ‬وحدة التخزين المؤقت‪5.3.1. ‬‬

‫يعمل هذا التعيين كذاكرة تخزين مؤقت لجميع الوحدات ‪ sys.modules. ‬المكان األول الذي تم فحصه أثناء بحث االستيراد هو‬
‫سوف ‪، sys.modules‬تم استيرادها سابقا‪ foo.bar.baz‬النمطية التي تم استيرادها مسب ًقا ‪ ،‬بما في ذلك المسارات الوسيطة‪ .‬حتى إذا‬
‫‪.‬سيكون لكل مفتاح قيمة كائن الوحدة النمطية المقابل‪ foo.bar.baz. ‬و‪ foo، foo.bar‬تحتوي على إدخاالت ل‬

‫وإذا كان موجو ًدا ‪ ،‬فإن القيمة المرتبطة هي الوحدة النمطية التي ‪ sys.modules‬أثناء االستيراد ‪ ،‬يتم البحث عن اسم الوحدة النمطية‬
‫إذا كان اسم ‪ a. ‬رفع‪ ModuleNotFoundError‬فسيتم ‪ None،‬تفي باالستيراد وتكتمل العملية‪ .‬ومع ذلك ‪ ،‬إذا كانت القيمة كذلك‬
‫ً‬
‫مفقودا ‪ ،‬فستواصل‬ ‫‪.‬البحث عن الوحدة ‪ Python‬الوحدة‬

‫قابل للكتابة‪  .‬قد ال يؤدي حذف مفتاح إلى تدمير الوحدة النمطية المرتبطة به (حيث قد تحتوي الوحدات النمطية ‪sys.modules‬‬
‫‪ Python‬األخرى على مراجع لها) ‪ ،‬ولكنه سيؤدي إلى إبطال إدخال ذاكرة التخزين المؤقت للوحدة المسماة‪ ، L‬مما يتسبب في قيام‬
‫مما يفرض االستيراد التالي ‪  None،‬بالبحث من جديد عن الوحدة النمطية المسماة عند استيرادها التالي‪ .‬يمكن أي ً‬
‫ضا تعيين المفتاح لـ‬
‫‪ ModuleNotFoundError.‬للوحدة النمطية ليؤدي إلى ملف‬

‫‪ sys.modules،‬حذار الرغم من ذلك‪ ،‬كما لو كنت الحفاظ على مرجع إلى كائن وحدة‪ ،‬وإبطال إدخال ذاكرة التخزين المؤقت في‬
‫ومن ثم إعادة استيراد وحدة الكشف عن اسمه‪ ،‬أن اثنين من الكائنات وحدة‪ ‬ال‪ ‬تكون هي نفسها‪ .‬على النقيض من‬
‫سيتم إعادة استخدام‪ ‬نفس‪  ‬كائن الوحدة النمطية ‪ ،‬وببساطة إعادة تهيئة محتويات الوحدة عن طريق إعادة)(‪ ، importlib.reload‬ذلك‬
‫‪.‬تشغيل رمز الوحدة‬

‫‪ ‬محددات‪5.3.2. ‬‬

‫للعثور على الوحدة ‪ Python‬فسيتم استدعاء بروتوكول استيراد ‪ sys.modules،‬إذا لم يتم العثور على الوحدة النمطية المسماة في‬
‫وتحميلها‪  .‬يتكون هذا البروتوكول من كائنين المفاهيمي‪ ،‬المكتشفون‪ ‬و‪ ‬رافعات‪ . ‬تتمثل مهمة الباحث في تحديد ما إذا كان يمكنه‬
‫العثور على الوحدة المسماة‪ L‬باستخدام أي استراتيجية يعرفها‪ .‬يشار إلى الكائنات التي تقوم بتنفيذ كل من هذه الواجهات‪ L‬بالمستوردين‪- ‬‬
‫‪.‬فهي تعود بنفسها عندما يجدون أنه يمكنهم تحميل الوحدة المطلوبة‬

‫عد ًدا من أدوات البحث والمستوردين االفتراضية‪ .‬األول يعرف كيفية تحديد الوحدات المدمجة‪ ، L‬والثاني يعرف ‪ Python‬تتضمن‬
‫كيفية تحديد الوحدات المجمدة‪ .‬يبحث مكتشف افتراضي ثالث‪ ‬عن‪ ‬مسار استيراد‪ ‬للوحدات النمطية‪ .‬على‪ ‬مسار استيراد‪ ‬عبارة عن‬

‫‪Pg. 54‬‬
‫ضا توسيعه للبحث عن أي مورد يمكن تحديد موقعه‬ ‫قائمة من المواقع التي قد اسم مسارات نظام الملفات أو ملفات مضغوطة‪ .‬يمكن أي ً‬
‫‪ ، URL.‬مثل تلك التي تم تحديدها بواسطة عناوين‬

‫‪.‬آلية االستيراد قابلة للتوسيع ‪ ،‬لذا يمكن إضافة مكتشفات‪ L‬جديدة لتوسيع نطاق ونطاق البحث عن الوحدة‬

‫المكتشفون ال يقومون بتحميل الوحدات في الواقع‪ .‬إذا تمكنوا من العثور على الوحدة المسماة ‪ ،‬فسيقومون بإرجاع‪ ‬مواصفات الوحدة‬
‫‪.‬النمطية‪ ،  ‬وهي عبارة عن تغليف للمعلومات المتعلقة باستيراد الوحدة ‪ ،‬والتي تستخدمها‪ L‬بعد ذلك آلية االستيراد عند تحميل الوحدة‬

‫تصف األقسام التالية البروتوكول الخاص بالمكتشفات واللوادر بمزيد من التفصيل ‪ ،‬بما في ذلك كيفية إنشاء وتسجيل برامج جديدة‬
‫‪.‬لتوسيع آلية االستيراد‬

‫قام الباحثون بإرجاع أدوات‪ ‬التحميل‪ ‬مباشرة ‪ ،‬بينما يقومون ‪ Python ،‬تم التغيير في اإلصدار ‪ :3.4‬في اإلصدارات السابقة من‬
‫‪.‬اآلن بإرجاع مواصفات الوحدة التي‪ ‬تحتوي على أدوات‪ ‬التحميل‪  .‬ال تزال اللوادر مستخدمة أثناء االستيراد ولكن لها مسؤوليات أقل‬

‫‪ ‬خطافات االستيراد‪5.3.3. ‬‬

‫تم تصميم آالت االستيراد بحيث تكون قابلة للتوسيع ؛‪ ‬اآللية األساسية‪ L‬لذلك هي‪ ‬خطاطيف االستيراد‪ . ‬هناك نوعان من السنانير‬
‫‪ .‬االستيراد‪ :‬السنانير الفوقية‪ ‬و‪ ‬السنانير مسار الواردات‬

‫البحث في ‪ sys.modules‬في بداية معالجة‪ L‬االستيراد ‪ ،‬قبل حدوث أي معالجة استيراد أخرى ‪ ،‬بخالف ‪ Meta hooks‬يتم استدعاء‬
‫المعالجة أو الوحدات المجمدة أو حتى الوحدات المدمجة‪ .‬يتم‪ sys.path‬ذاكرة التخزين المؤقت‪ .‬هذا يسمح لخطافات التعريف بتجاوز‬
‫‪.‬كما هو موضح أدناه ‪ sys.meta_path،‬تسجيل خطافات التعريف عن طريق إضافة كائنات مكتشف جديدة إليها‬

‫المعالجة ‪ ،‬عند النقطة التي يتم فيها مواجهة )__‪ package.__path‬أو(‪ sys.path‬يتم استدعاء خطافات‪ L‬مسار االستيراد كجزء من‬
‫كما ‪ sys.path_hooks‬عنصر المسار المرتبط بها‪  .‬يتم تسجيل خطافات مسار االستيراد عن طريق إضافة عناصر استدعاء جديدة‬
‫‪.‬هو موضح أدناه‬

‫‪ ‬مسار التعريف‪5.3.4. ‬‬

‫والتي تحتوي على ‪ sys.meta_path،‬بعد ذلك ‪ Python‬تبحث ‪ sys.modules،‬عندما ال يتم العثور على الوحدة النمطية المسماة‪L‬‬
‫قائمة بكائنات مكتشف مسار التعريف‪  .‬يتم االستعالم عن هؤالء المكتشفون لمعرفة ما إذا كانوا يعرفون كيفية التعامل مع الوحدة‬
‫والتي تأخذ ثالث وسيطات‪ :‬االسم ومسار )(‪ find_spec‬النمطية المسماة‪ .‬يجب على مكتشفات مسار التعريف تنفيذ طريقة تسمى‬
‫االستيراد و (اختياريًا) الوحدة النمطية المستهدفة‪  .‬يمكن لمكتشف مسار التعريف استخدام أي إستراتيجية يريدها لتحديد ما إذا كان‬
‫‪.‬يمكنه التعامل مع الوحدة المسماة‪ L‬أم ال‬

‫إذا كان مكتشف مسار التعريف يعرف كيفية التعامل مع الوحدة النمطية المسماة‪ ، L‬فإنه يقوم بإرجاع كائن محدد‪ .‬إذا لم تتمكن من‬
‫وصلت المعالجة إلى نهاية قائمتها دون إعادة أحد ‪ sys.meta_path‬إذا‪ None. ‬التعامل مع الوحدة النمطية المسماة ‪ ،‬فإنها ترجع‬
‫يتم ببساطة نشر أي استثناءات أخرى يتم طرحها ‪ ،‬مما يؤدي إلى إحباط ‪ a. ‬رفع‪ ModuleNotFoundError‬المواصفات ‪ ،‬فسيتم‬
‫‪.‬عملية االستيراد‬

‫تسمى طريقة المكتشفون مسار الفوقية مع اثنين أو ثالث حجج‪ .‬األول هو االسم المؤهل بالكامل للوحدة التي يتم )(‪ find_spec‬و‬
‫الوسيطة الثانية هي مدخالت‪ L‬المسار الستخدامها في البحث عن الوحدة ‪ foo.bar.baz. ‬استيرادها ‪ ،‬على سبيل المثال‬
‫ولكن بالنسبة‪ ‬للوحدات‪ ‬الفرعية أو الحزم ‪ None،‬النمطية‪  .‬بالنسبة للوحدات النمطية ذات المستوى األعلى ‪ ،‬فإن الوسيطة الثانية هي‬
‫تعذر الوصول إلى __‪ __path‬سمة‪ ‬الحزمة‪ ‬األصلية‪ .‬إذا__‪ __path‬الفرعية ‪ ،‬فإن الوسيطة الثانية هي قيمة‬
‫رفع‪  .‬الوسيطة الثالثة هي كائن وحدة موجود سيكون هدف التحميل الح ًقا‪ .‬يمر ‪ ModuleNotFoundError‬السمة‪ ‬المناسبة ‪ ،‬فسيتم‬
‫‪.‬نظام االستيراد في الوحدة النمطية المستهدفة‪ L‬فقط أثناء إعادة التحميل‬

‫قد يتم اجتياز مسار التعريف عدة مرات لطلب استيراد واحد‪  .‬على سبيل المثال ‪ ،‬بافتراض عدم تخزين أي من الوحدات النمطية‬
‫سيؤدي‪ ‬االستيراد‪ ‬أوالً إلى إجراء استيراد مستوى أعلى ‪ ،‬مع استدعاء‪ ‬كل مكتشف مسار تعريف‪ ، foo.bar.baz‬المعنية بالفعل مؤق ًتا‬
‫(‪ .) ‬بعد‪ ‬أن تم استيراده ‪ ،‬سيتم استيراده عن طريق اجتياز مسار التعريف مرة أخرى ‪ ،‬استدعاء‪ . ‬بمجرد‪ ‬أن يتم االستيراد ‪ ،‬سوف‬
‫يستدعي االجتياز‬
‫‪ .mpf.find_spec("foo", None, None)mpffoofoo.barmpf.find_spec("foo.bar", foo.__path__, None‬النهائي‬
‫)‪)foo.barmpf.find_spec("foo.bar.baz", foo.bar.__path__, None‬‬

‫‪Pg. 55‬‬
‫سيعود هؤالء المستوردون دائمًا‬ .‫ مسار التعريف عمليات االستيراد ذات المستوى األعلى فقط‬L‫تدعم بعض مكتشفات‬ None
‫عندما‬ None‫غير الوسيطة الثانية‬ ‫أي شيء آخر‬ ‫يتم تمرير‬.

‫ تحتوي لغة‬Python ‫االفتراضية‬ sys.meta_path ‫ أحدها يعرف كيفية استيراد الوحدات‬، ‫ مسار تعريف‬L‫على ثالثة مكتشفات‬
‫الباحث‬ ‫(أي‬ ‫مسار االستيراد‬ ‫ واآلخر يعرف كيفية استيراد الوحدات من‬، ‫ وواحد يعرف كيفية استيراد الوحدات المجمدة‬، L‫المدمجة‬
) ‫المستند إلى المسار‬.

‫تم‬ :3.4 ‫تم التغيير في اإلصدار‬ find_spec()‫استبدال طريقة مكتشفات مسار التعريف‬ find_module()، ‫والتي تم إهمالها‬
‫ فإن آالت االستيراد ستجربها فقط إذا لم ينفذ الباحث‬، ‫ بينما ستستمر في العمل دون تغيير‬ .‫اآلن‬ find_spec().

3.10 ‫تم التغيير في اإلصدار‬:find_module() ‫نظام االستيراد اآلن‬ ‫استخدام‬ ‫يزيد‬ ImportWarning.

5.4. Loading

‫فيما يلي عرض‬ .‫ فستستخدمها آلية االستيراد (والمحمل الذي يحتوي عليه) عند تحميل الوحدة‬، ‫إذا تم العثور على مواصفات الوحدة‬
‫تقريبي لما يحدث أثناء جزء التحميل من االستيراد‬:

module = None

if spec.loader is not None and hasattr(spec.loader, 'create_module'):

# It is assumed 'exec_module' will also be defined on the loader.

module = spec.loader.create_module(spec)

if module is None:

module = ModuleType(spec.name)

# The import-related module attributes get set here:

_init_module_attrs(spec, module)

if spec.loader is None:

# unsupported

raise ImportError

if spec.origin is None and spec.submodule_search_locations is not None:

# namespace package

sys.modules[spec.name] = module

elif not hasattr(spec.loader, 'exec_module'):

module = spec.loader.load_module(spec.name)

# Set __loader__ and __package__ if missing.

else:

sys.modules[spec.name] = module

try:

spec.loader.exec_module(module)

Pg. 56
‫‪except BaseException:‬‬

‫‪try:‬‬

‫]‪del sys.modules[spec.name‬‬

‫‪except KeyError:‬‬

‫‪pass‬‬

‫‪raise‬‬

‫]‪return sys.modules[spec.name‬‬

‫‪:‬الحظ التفاصيل التالية‬

‫‪‬‬ ‫‪.‬فسيكون االستيراد قد أعاده بالفعل ‪ sys.modules،‬إذا كان هناك كائن وحدة نمطية موجود باالسم المحدد‬

‫‪‬‬ ‫قبل أن يقوم المُحمل بتنفيذ رمز الوحدة‪ .‬هذا أمر بالغ األهمية ألن كود الوحدة قد ‪ sys.modules‬ستكون الوحدة موجودة‬
‫مسب ًقا تمنع التكرار غير المحدود في أسوأ الحاالت ‪ sys.modules ‬يستورد نفسه (بشكل مباشر أو غير مباشر) ؛‪ ‬إضافته‬
‫‪.‬والتحميل المتعدد في أفضل األحوال‬

‫‪‬‬ ‫أي وحدة موجودة بالفعل ‪ sys.modules. ‬في حالة فشل التحميل ‪ ،‬تتم إزالة الوحدة الفاشلة ‪ -‬والوحدة الفاشلة فقط ‪ -‬من‬
‫ذاكرة التخزين المؤقت ‪ ،‬وأي وحدة تم تحميلها بنجاح كأثر جانبي ‪ ،‬يجب أن تظل في ذاكرة التخزين ‪ sys.modules‬في‬
‫‪ sys.modules.‬المؤقت‪ .‬يتناقض هذا مع إعادة التحميل حيث يتم ترك الوحدة الفاشلة فيها‬

‫‪‬‬ ‫بعد إنشاء الوحدة النمطية ولكن قبل التنفيذ ‪ ،‬تحدد آلية االستيراد سمات الوحدة ذات الصلة باالستيراد‬
‫‪ .‬كما تم تلخيصها في‪ ‬قسم الحق ‪) ،‬في مثال الشفرة الزائفة أعاله "‪("_init_module_attrs‬‬

‫‪‬‬ ‫تنفيذ الوحدة النمطية هو اللحظة األساسية للتحميل التي يتم فيها ملء مساحة اسم الوحدة‪ .‬يتم تفويض التنفيذ بالكامل إلى‬
‫‪.‬اللودر ‪ ،‬والذي يقرر ما يتم ملؤه وكيف يتم ذلك‬

‫‪‬‬ ‫هي الوحدة التي تم إرجاعها )( ‪ exec_module‬قد ال تكون الوحدة النمطية التي تم إنشاؤها أثناء التحميل وتمريرها إلى‬
‫‪ .‬في نهاية االستيراد‪2 ‬‬

‫تم التغيير في اإلصدار ‪ :3.4‬تولى نظام االستيراد المسؤوليات المعيارية للوادر‪ .‬تم تنفيذ هذه في السابق‬
‫‪.‬الطريقة)(‪ importlib.abc.Loader.load_module‬بواسطة‬

‫‪5.4.1. Loaders‬‬

‫توفر اللوادر النمطية الوظيفة الحاسمة‪ L‬للتحميل‪ :‬تنفيذ الوحدة‪ .‬تستدعي آلية‬


‫الطريقة باستخدام وسيطة واحدة ‪ ،‬كائن الوحدة النمطية المراد ‪ importlib.abc.Loader.exec_module() ‬االستيراد‬
‫‪ .‬يتم تجاهل‪ ‬أي قيمة يتم إرجاعها من)(‪. exec_module‬تنفيذه‬

‫‪:‬يجب أن يستوفي اللوادر المتطلبات التالية‬

‫‪‬‬ ‫‪) ،‬على عكس الوحدة النمطية المضمنة أو االمتداد الذي يتم تحميله ديناميكيًا( ‪ Python‬إذا كانت الوحدة النمطية هي وحدة‬
‫‪ ( module.__dict__).‬فيجب على المُحمل تنفيذ رمز الوحدة في مساحة االسم العام للوحدة‬

‫‪‬‬ ‫سيتم )(‪ exec_module‬على الرغم من أنه ‪ ImportError،‬إذا لم يتمكن المُحمل من تنفيذ الوحدة ‪ ،‬فيجب أن يرفع‬
‫‪.‬نشر‪ ‬أي استثناء آخر يتم طرحه أثناء‪ ‬ذلك‬

‫ستعيد الطريقة فقط )(‪ ، find_spec‬في كثير من الحاالت ‪ ،‬يمكن أن يكون الباحث والمحمل هو نفس الكائن ؛‪ ‬في مثل هذه الحاالت‬
‫‪ self.‬المواصفات مع ضبط أداة التحميل على‬

‫‪Pg. 57‬‬
‫طريقة‪ .‬يأ)(‪ create_module‬قد تشترك برامج تحميل الوحدة النمطية في إنشاء كائن الوحدة النمطية أثناء التحميل عن طريق تنفيذ‬
‫ال )(‪. create_module‬خذ وسيطة واحدة ‪ ،‬مواصفات الوحدة النمطية ‪ ،‬ويعيد كائن الوحدة النمطية الجديد الستخدامه أثناء التحميل‬
‫‪.‬فإن آلية االستيراد ستنشئ الوحدة الجديدة نفسها ‪ None،‬يحتاج إلى تعيين أي سمات على كائن الوحدة النمطية‪ .‬إذا عادت الطريقة‬

‫‪.‬سيلة لتحميل)(‪ create_module‬الجديد في اإلصدار ‪ :3.4‬و‬

‫ويفترض آلية استيراد كافة المسؤوليات )(‪ exec_module‬تم استبدال الطريقة التي)(‪ load_module‬تغير في اإلصدار ‪ :3.4‬و‬
‫‪.‬النمطي التحميل‬

‫طريقة اللوادر إذا كانت موجودة وال يتم تنفيذ )(‪ load_module‬من أجل التوافق مع اللوادر الموجودة ‪ ،‬ستستخدم آلية االستيراد‬
‫بدالً من )(‪ exec_module‬فقد تم إهماله ويجب على اللوادر التنفيذ)(‪ ، load_module‬ومع ذلك‪ exec_module(). ‬اللودر أيضًا‬
‫‪.‬ذلك‬

‫طريقة يجب تنفيذ جميع وظائف النمطي تحميل المذكورة أعاله باإلضافة إلى تنفيذ وحدة‪ .‬تنطبق جميع القيود)(‪ load_module‬على‬
‫‪:‬نفسها ‪ ،‬مع بعض اإليضاحات‪ L‬اإلضافية‬

‫‪‬‬ ‫فيجب أن يستخدم المُحمل تلك الوحدة النمطية ‪ sys.modules،‬إذا كان هناك كائن وحدة نمطية موجود باالسم المحدد فيه‬
‫إذا لم تكن الوحدة النمطية المسماة‪ L‬موجودة )‪.‬فلن يعمل بشكل صحيح)(‪ importlib.reload‬وإال(‪. ‬الموجودة‬
‫‪ sys.modules.‬فيجب على المُحمل إنشاء كائن وحدة نمطية جديد وإضافته إليه ‪ sys.modules،‬في‬

‫‪‬‬ ‫قبل أن ينفذ المُحمل رمز الوحدة النمطية ‪ ،‬لمنع التكرار غير المحدود أو ‪ sys.modules‬يجب أن‪ ‬تكون‪ ‬الوحدة‪ ‬موجودة‬
‫‪.‬التحميل المتعدد‬

‫‪‬‬ ‫ولكن يجب إزالة‪ ‬فقط‪ ‬لعدم وحدة (ق)‪ sys.modules، ،‬إذا فشل التحميل‪ ،‬ويجب على محمل إزالة أي وحدات وإدراجها‬
‫‪.‬وفقط إذا محمل نفسها وقد حملت وحدة (ق) صراحة‬

‫ال)(‪ create_module‬يتم تعريفه ولكنه)(‪ exec_module‬عندما‪ A DeprecationWarning‬تم التغيير في اإلصدار ‪ :3.5‬يظهر‬


‫‪.‬يتم‬

‫‪.‬ليست كذلك)(‪ create_module‬يعرف ولكن)(‪ exec_module‬يتم رفع عندما‪ ImportError‬تغير في اإلصدار ‪ :3.6‬ان‬

‫‪ ImportWarning.‬سيزيد)(‪ load_module‬تم التغيير في اإلصدار ‪ :3.10‬استخدام‬

‫‪5.4.2. Submodules‬‬

‫العبارات ‪ import-from،‬أو‪ ، import‬واجهات برمجة التطبيقات‪ importlib‬مثل( عندما يتم تحميل وحدة فرعية باستخدام أي آلية‬
‫يتم وضع ارتباط في مساحة اسم الوحدة الرئيسية لكائن الوحدة الفرعية‪ .‬على سبيل المثال ‪ ،‬إذا ‪ __import__()) ،‬أو المضمنة‬
‫مرتبطة بالوحدة ‪ foo‬سيكون لها سمة‪ spam.foo، spam‬بعد االستيراد ‪ foo،‬تحتوي على وحدة فرعية‪ spam‬كانت الحزمة‬
‫‪:‬الفرعية‪ .‬لنفترض أن لديك بنية الدليل التالية‬

‫‪spam/‬‬

‫‪__init__.py‬‬

‫‪foo.py‬‬

‫‪bar.py‬‬

‫‪:‬لديها األسطر التالية فيه‪ spam/__init__.py‬و‬

‫‪from .foo import Foo‬‬

‫‪from .bar import Bar‬‬

‫‪:‬وحدة نمطية‪ spam‬في‪ bar‬و‪ foo‬ثم تنفيذ يضع التالية اسم ملزمة ل‬

‫>>>‬

‫‪Pg. 58‬‬
‫‪>>> import spam‬‬

‫‪>>> spam.foo‬‬

‫>'‪<module 'spam.foo' from '/tmp/imports/spam/foo.py‬‬

‫‪>>> spam.bar‬‬

‫>'‪<module 'spam.bar' from '/tmp/imports/spam/bar.py‬‬

‫المألوف ‪ ،‬قد يبدو هذا مفاج ًئا ‪ ،‬لكنه في الواقع ميزة أساسية لنظام االستيراد‪ .‬االحتفاظ الثابت ‪ Python‬بالنظر إلى قواعد ربط اسم‬
‫فيجب أن يظهر ‪) ،‬كما تفعل بعد االستيراد أعاله(]'‪ sys.modules['spam.foo‬و]'‪ sys.modules['spam‬هو أنه إذا كان لديك‬
‫‪.‬كسمة‪ L‬لألول‪ foo‬األخير‬

‫‪ ‬مواصفات الوحدة‪5.4.3. ‬‬

‫تستخدم آالت االستيراد مجموعة متنوعة من المعلومات حول كل وحدة أثناء االستيراد ‪ ،‬خاصة قبل التحميل‪ .‬معظم المعلومات‬
‫‪.‬مشتركة لجميع الوحدات‪  .‬الغرض من مواصفات الوحدة النمطية هو تغليف هذه المعلومات المتعلقة باالستيراد على أساس كل وحدة‬

‫يسمح استخدام المواصفات أثناء االستيراد بنقل الحالة بين مكونات نظام االستيراد ‪ ،‬على سبيل المثال بين الباحث الذي ينشئ‬
‫مواصفات الوحدة والمحمل الذي ينفذها‪  .‬واألهم من ذلك ‪ ،‬أنه يسمح آلالت االستيراد بأداء عمليات التحميل المعياري ‪ ،‬بينما بدون‬
‫‪.‬مواصفات الوحدة ‪ ،‬يتحمل اللودر هذه المسؤولية‬

‫للحصول على تفاصيل حول ‪ ModuleSpec‬في كائن الوحدة النمطية‪ .‬انظر__‪ __spec‬يتم الكشف عن مواصفات الوحدة كسمة‪L‬‬
‫‪.‬محتويات مواصفات الوحدة‬

‫الجديد في اإلصدار ‪3.4.1‬‬

‫‪ ‬سمات‪ L‬الوحدة ذات الصلة باالستيراد‪5.4.4. ‬‬

‫‪.‬تمأل آلية االستيراد هذه السمات‪ L‬على كل كائن وحدة أثناء التحميل ‪ ،‬بنا ًء على مواصفات الوحدة ‪ ،‬قبل أن يقوم المُحمل بتنفيذ الوحدة‬

‫__‪__name‬‬

‫يجب أن يتم تعيين السمة إلى اسم مؤهل بشكل كامل من وحدة‪ .‬يستخدم هذا االسم لتعريف الوحدة بشكل فريد في __‪ __name‬و‬
‫‪.‬نظام االستيراد‬

‫__‪__loader‬‬

‫يجب أن يتم تعيين السمة إلى كائن محمل أن استيراد اآلالت المستخدمة‪ L‬عند تحميل وحدة‪ .‬هذا في الغالب للتأمل ‪ __loader__ ،‬و‬
‫‪.‬ولكن يمكن استخدامه لوظائف إضافية خاصة بمحمل ‪ ،‬على سبيل المثال الحصول على البيانات المرتبطة بمحمل‬

‫__‪__package‬‬

‫عندما ‪ __name__. ‬يجب تعيين سمة‪ ‬الوحدة‪  . ‬يجب أن تكون قيمتها سلسلة ‪ ،‬ولكن يمكن أن تكون نفس قيمة لها__‪__package‬‬
‫عندما ال تكون الوحدة عبارة عن ‪ __name__. ‬يجب تعيين قيمتها على__‪ ، __package‬تكون الوحدة عبارة عن حزمة‬
‫يجب تعيينها على السلسلة الفارغة للوحدات النمطية ذات المستوى األعلى ‪ ،‬أو للوحدات الفرعية ‪ ،‬على ‪ ، __package__ ‬حزمة‬
‫‪.‬لمزيد من التفاصيل‪PEP 366 ‬اسم الحزمة األصلية‪ .‬ارى‬

‫حساب الواردات النسبية الصريحة للوحدات النمطية الرئيسية ‪ ،‬على النحو المحدد في__‪ __name‬يتم استخدام هذه السمة بدالً من‬
‫‪ . 366__spec__.parent.‬من المتوقع أن يكون لها نفس القيمة مثل‬

‫‪ __spec__.parent.‬المتوقع أن تكون قيمة__‪ __package‬تم التغيير في اإلصدار ‪ :3.6‬من‬

‫__‪__spec‬‬

‫‪Pg. 59‬‬
‫يجب أن يتم تعيين السمة إلى المواصفات وحدة الذي تم استخدامه عند استيراد وحدة‪ .‬اإلعداد __‪ __spec‬و‬
‫مناسب ينطبق بالتساوي على‪  ‬الوحدات التي تمت تهيئتها أثناء بدء تشغيل المترجم الفوري‪ . ‬االستثناء الوحيد ‪ __spec__ ‬بشكل‬
‫‪ .‬يتم‪ ‬تعيينه إلى ال شيء في بعض الحاالت__‪ __spec‬حيث ‪ __main__،‬هو‬

‫‪.‬يتم استخدامه كإجراء احتياطي‪ ، __spec__.parent‬ال يتم تعريفه__‪ __package‬عندما‬

‫الجديد في اإلصدار ‪3.4.1‬‬

‫‪.‬ال يتم تعريفه__‪ __package‬يُستخدم كبديل احتياطي عندما‪:__spec__.parent ‬تم التغيير في اإلصدار ‪3.6‬‬

‫__‪__path‬‬

‫فيجب تعيين سمة‪ ‬كائن الوحدة النمطية‪ . ‬يجب __‪ ، __path‬إذا كانت الوحدة النمطية عبارة عن حزمة (إما عادية أو مساحة االسم)‬
‫ً‬
‫فارغا ‪ ،‬فيجب __‪ __path‬لم يكن لها أهمية أخرى‪ .‬إذا__‪ __path‬أن تكون القيمة قابلة للتكرار ‪ ،‬ولكن قد تكون فارغة إذا‬ ‫لم يكن‬
‫‪ .‬ترد‪ ‬أدناه__‪ __path‬أن ينتج سالسل عند تكرارها‪ .‬مزيد من التفاصيل حول دالالت‬

‫‪.‬الحزمية‪ ‬على‪ ‬سمة__‪ __path‬يجب أال تحتوي الوحدات النمطية غير‬

‫__‪__file‬‬

‫__‪__cached‬‬

‫ضبطه إذا لم __‪ __file‬هو اختياري‪ .‬إذا تم تعيينها ‪ ،‬يجب أن تكون قيمة هذه السمة سلسلة‪ .‬قد يختار نظام االستيراد عدم__‪__file‬‬
‫‪.‬يكن له معنى داللي (على سبيل المثال ‪ ،‬وحدة محملة من قاعدة بيانات)‬

‫السمة التي تمثل المسار إلى أي إصدار مترجم من الكود __‪ __cached‬تم تعيينه ‪ ،‬فقد يكون من المناسب‪ L‬أي ً‬
‫ضا تعيين__‪ __file‬إذا‬
‫(على سبيل المثال ‪ ،‬ملف مترجم بالبايت)‪ .‬ال يلزم وجود الملف لتعيين هذه السمة ؛‪ ‬يمكن أن يشير المسار ببساطة إلى مكان وجود‬
‫‪PEP 3147 ).‬انظر( الملف المترجم‬

‫عدم التعيين‪ .‬ومع ذلك ‪ ،‬فإن هذا السيناريو غير نمطي تمامًا‪ .‬في النهاية ‪ __file__ ،‬وقت__‪ __cached‬من المناسب أيضً ا تحديد‬
‫لذلك إذا كان بإمكان أداة التحميل التحميل من وحدة تخزين مؤقت ولكن ال ‪ __cached__. ‬و ‪ /‬أو__‪ __file‬المحمل هو ما يستخدم‬
‫‪.‬يتم تحميلها من ملف ‪ ،‬فقد يكون هذا السيناريو غير النمطي مناسبًا‬

‫‪__ ‬وحدة ‪ __.‬مسار‪5.4.5. ‬‬

‫‪.‬سمة ‪ ،‬فهي حزمة__‪ __path‬بحكم التعريف ‪ ،‬إذا كانت الوحدة النمطية لها‬

‫توفير ‪ُ  sys.path‬تستخدم سمة‪ ‬الحزمة‪ ‬أثناء استيراد حزمها الفرعية‪ .‬داخل آلية االستيراد ‪ ،‬تعمل بشكل مشابه تمامًا مثل__‪__path‬‬
‫‪ sys.path.‬عادة ما يكون أكثر تقيي ًدا من__‪ ، __path‬قائمة بالمواقع للبحث عن الوحدات النمطية أثناء االستيراد‪ .‬ومع ذلك‬

‫تنطبق‪ ‬نفس القواعد المستخدمة‪ ‬أي ً‬


‫ضا على ‪. sys.path‬يجب أن تكون متكررة من السالسل ‪ ،‬لكنها قد تكون فارغة__‪__path‬‬
‫‪ __path__.‬يتم الرجوع إليها عند عبور الحزمة )الموضحة أدناه(‪ sys.path_hooks‬و ‪ __path__،‬الحزمة‬

‫سمة‪ ‬الحزمة‪ ، ‬وكانت هذه هي الطريقة التي تم بها تنفيذ حزم مساحة‪ __path__  L‬قد يضبط ملف‪ ‬الحزمة‪ ‬أو يغير‪__init__.py‬‬
‫ملفات تحتوي فقط ‪__init__.py‬لم تعد حزم مساحة االسم بحاجة إلى توفير ‪PEP 420 ،‬االسم قبلبيب ‪ . 420‬مع اعتماد‬
‫‪.‬بشكل صحيح لحزمة مساحة االسم‪__path__ ‬كود معالجة ؛‪ ‬يتم تعيين آلية االستيراد تلقائيًا‪__path__ ‬على‬

‫‪ ‬وحدة ممثلين‪5.4.6. ‬‬
‫ً‬
‫اعتمادا على السمات‪ L‬المحددة أعاله ‪ ،‬وفي‬ ‫بشكل افتراضي ‪ ،‬تحتوي جميع الوحدات النمطية على نسخ قابلة لالستخدام ‪ ،‬ولكن‬
‫‪.‬مواصفات الوحدة ‪ ،‬يمكنك التحكم بشكل أكثر وضوحً ا في نسخ كائنات الوحدة‬

‫فستحاول آلية االستيراد إنشاء نسخة منها‪ .‬إذا فشل ذلك أو لم تكن هناك ‪ ( __spec__) ،‬إذا كانت الوحدة تحتوي على مواصفات‬
‫مواصفات ‪ ،‬فسيقوم نظام االستيراد بصياغة نسخة افتراضية باستخدام أي معلومات متوفرة في الوحدة النمطية‪ .‬انها ستحاول‬
‫مع العجز عن أي معلومات ‪ repr،‬كمدخل في__‪ module.__loader‬و__‪ module.__name__، module.__file‬استخدام‬
‫‪.‬مفقود‬

‫‪Pg. 60‬‬
‫‪:‬فيما يلي القواعد الدقيقة المستخدمة‪L‬‬

‫‪‬‬ ‫تتم استشارة ‪ repr. ‬سمة ‪ ،‬يتم استخدام المعلومات الواردة في المواصفات إلنشاء‪ __spec__L‬إذا كانت الوحدة النمطية لها‬
‫‪".‬سمات "االسم" و "المُحمل" و "األصل" و "الموقع الجغرافي‬

‫‪‬‬ ‫‪ repr.‬سمة ‪ ،‬فسيتم استخدامها كجزء من__‪ __file‬إذا كانت الوحدة النمطية لها‬

‫‪‬‬ ‫فسيتم استخدام أداة تحميل التحميل ‪ None،‬غير موجود__‪ __loader‬ال تحتوي على رمز__‪ __file‬إذا كانت الوحدة‬
‫‪.‬كجزء من وحدة نسخ الوحدة‬

‫‪‬‬ ‫‪ repr.‬في__‪ __name‬خالف ذلك ‪ ،‬ما عليك سوى استخدام الوحدة‬

‫تم إيقافه ويتم استخدام المواصفات وحدة اآلن من استيراد اآلالت لتوليد‪ loader.module_repr() ‬تغير في اإلصدار ‪ :3.4‬استخدام‬
‫‪.‬حدة ‪repr‬‬

‫طريقة‪ ‬أ)(‪ module_repr‬عن طريق استدعاء ‪ repr‬سيتم إنشاء الوحدة النمطية ‪ Python 3.3 ،‬للتوافق مع اإلصدارات السابقة مع‬
‫‪.‬داة التحميل‪ ، ‬إذا تم تحديدها ‪ ،‬قبل تجربة أي‪ ‬من‪ ‬األسلوبين الموصوفين أعاله‪ .‬ومع ذلك ‪ ،‬تم إهمال الطريقة‬

‫سمة‪ ‬الوحدة‪ ‬ولكن قبل __‪ __spec‬يحدث‪ ‬االتصال‪ ‬اآلن بعد محاولة استخدام‪:module_repr() ‬تم التغيير في اإلصدار ‪3.10‬‬


‫‪.‬المقرر أن يتوقف استخدام بيثون ‪ module_repr()3.12‬من‪ __file__. ‬الرجوع مرة أخرى‬

‫‪ ‬إبطال رمز بايت المخزن مؤق ًتا‪5.4.7. ‬‬

‫الملف‪ .py‬ملف ‪ ،‬فإنه يتحقق مما إذا كانت ذاكرة التخزين المؤقت محدثة مع‪ .pyc‬بتحميل رمز بايت مؤقت من ‪ Python‬قبل أن يقوم‬
‫‪ ‬‬
‫بذلك عن طريق تخزين الطابع الزمني األخير الذي تم تعديله وحجمه في ملف ذاكرة ‪  Python‬المصدر‪ . ‬بشكل افتراضي ‪ ،‬تقوم‬
‫التخزين المؤقت عند كتابته‪  .‬في وقت التشغيل ‪ ،‬يقوم نظام االستيراد بالتحقق من صحة ملف ذاكرة التخزين المؤقت عن طريق‬
‫‪.‬التحقق من البيانات الوصفية المخزنة في ملف ذاكرة التخزين المؤقت مقابل البيانات الوصفية للمصدر‬

‫أيضً ا ملفات ذاكرة التخزين المؤقت "المستندة إلى التجزئة" ‪ ،‬والتي تخزن تجزئة لمحتويات الملف المصدر بدالً من ‪ Python‬تدعم‬
‫‪ .pyc‬الملفات‪ ‬المستندة إلى التجزئة‪ : ‬محددة وغير محددة‪ .‬بالنسبة إلى‪ .pyc‬البيانات الوصفية الخاصة به‪ .‬هناك نوعان مختلفان من‬
‫من صحة ملف ذاكرة التخزين المؤقت عن طريق تجزئة الملف المصدر ومقارنة ‪ Python‬الملفات‪ ‬المستندة إلى التجزئة‪ ، ‬تتحقق‬
‫التجزئة الناتجة مع التجزئة في ملف ذاكرة التخزين المؤقت‪  .‬إذا تم العثور على ملف ذاكرة تخزين مؤقت تم التحقق منه على أساس‬
‫بإعادة إنشائه ويكتب ملف ذاكرة تخزين مؤقت جديد تم التحقق منه على أساس ‪ Python‬التجزئة غير صالح ‪ ،‬يقوم‬
‫ببساطة أن ملف ذاكرة التخزين ‪ Python‬للملفات‪  ‬القائمة على التجزئة التي لم يتم التحقق منها‪ ، ‬تفترض‪ .pyc‬التجزئة‪ .‬بالنسبة‬
‫‪ --check-hash-‬قد يتم تجاوز سلوك التحقق من صحة الملفات‪ ‬المستندة إلى التجزئة‪ ‬بالعالمة‪. .pyc‬المؤقت صالح إذا كان موجو ًدا‬
‫‪based-pycs .‬‬

‫تدعم فقط اإلبطال المستند ‪ Python‬الملفات‪ ‬المستندة إلى التجزئة‪ . ‬في السابق ‪ ،‬كانت‪ .pyc‬تم التغيير في اإلصدار ‪ :3.7‬تمت إضافة‬
‫‪.‬إلى الطابع الزمني لذاكرة التخزين المؤقت للرمز البايت‬

‫‪ ‬المسار القائم على الباحث‪5.5 ‬‬

‫مع العديد من مكتشفات المسارات الوصفية االفتراضية‪ .‬واحد من هؤالء ‪ ،‬يسمى‪ ‬الباحث المستند ‪ Python‬كما ذكرنا ساب ًقا ‪ ،‬تأتي‬
‫يبحث في‪ ‬مسار االستيراد‪ ، ‬والذي يحتوي على قائمة‪ ‬بإدخاالت المسار‪ . ‬يقوم كل إدخال مسار بتسمية ‪ ( PathFinder) ،‬إلى المسار‬
‫‪.‬موقع للبحث عن الوحدات النمطية‬

‫ال يعرف الباحث المستند إلى المسار نفسه كيفية استيراد أي شيء‪ .‬بدالً من ذلك ‪ ،‬فإنه يجتاز مدخالت‪ L‬المسار الفردية ‪ ،‬ويربط كل‬
‫‪.‬منها بمكتشف إدخال المسار الذي يعرف كيفية التعامل مع هذا النوع المعين من المسار‬

‫تقوم المجموعة االفتراضية من مكتشفات‪ L‬إدخال المسار بتنفيذ جميع الدالالت للعثور على الوحدات النمطية في نظام الملفات ‪،‬‬
‫والمكتبات )الملفات‪ Python ( .pyc‬ورمز بايت ‪) ،‬الملفات‪ Python ( .py‬والتعامل مع أنواع الملفات الخاصة مثل كود مصدر‬
‫الوحدة النمطية في المكتبة القياسية ‪ ،‬فإن مكتشفات إدخال المسار االفتراضية‪ zipimport ‬عندما تدعمها‪). ‬الملفات‪ .so‬مثل( المشتركة‬
‫ض ا مع تحميل جميع أنواع الملفات هذه (بخالف المكتبات المشتركة) من ملفات‬ ‫‪ zip.‬تتعامل أي ً‬

‫‪Pg. 61‬‬
‫أو استعالمات‪ L‬قاعدة البيانات أو أي ‪ URL‬ال يلزم أن تقتصر إدخاالت المسار على مواقع نظام الملفات‪ .‬يمكن أن تشير إلى عناوين‬
‫‪.‬موقع آخر يمكن تحديده كسلسلة‬

‫يوفر الباحث المستند إلى المسار روابط وبروتوكوالت إضافية بحيث يمكنك توسيع وتخصيص أنواع إدخاالت المسار القابلة‬
‫للشبكة ‪ ،‬فيمكنك كتابة رابط يقوم بتنفيذ دالالت ‪ URL‬للبحث‪  .‬على سبيل المثال ‪ ،‬إذا كنت ترغب في دعم إدخاالت المسار كعناوين‬
‫للعثور على وحدات نمطية على الويب‪ .‬سيعيد هذا الخطاف (القابل لالستدعاء)‪ ‬مكتشف إدخال المسار الذي‪ ‬يدعم البروتوكول ‪HTTP‬‬
‫‪.‬الموصوف أدناه ‪ ،‬والذي تم استخدامه بعد ذلك للحصول على أداة تحميل للوحدة من الويب‬

‫كلمة تحذير‪ :‬يستخدم هذا القسم والسابق كالهما مصطلح "‪ ‬مكتشف"‪ ، ‬ويميز بينهما باستخدام المصطلحين "‪ ‬مكتشف‪ ‬مسار‬
‫التعريف"‪ ‬و "‪ ‬مكتشف‪ ‬مسار الدخول"‪ . ‬هذان النوعان من المكتشفات‪ L‬متشابهان للغاية ‪ ،‬ويدعمان بروتوكوالت متشابهة ‪ ،‬ويعمالن‬
‫بطرق متشابهة‪ L‬أثناء عملية االستيراد ‪ ،‬ولكن من المهم أن تضع في اعتبارك أنهما مختلفان تمامًا‪ .‬على وجه الخصوص ‪ ،‬تعمل‬
‫‪.‬االجتياز‪ sys.meta_path‬مكتشفات‪ L‬مسار التعريف في بداية عملية االستيراد ‪ ،‬كما تم إيقافها عن‬

‫على النقيض من ذلك ‪ ،‬فإن مكتشفات‪ L‬إدخال المسار هي إلى حد ما عبارة عن تفاصيل تنفيذية للباحث المستند إلى المسار ‪ ،‬وفي‬
‫‪.‬فلن يتم استدعاء أي من دالالت مكتشف إدخال المسار ‪ sys.meta_path،‬الواقع ‪ ،‬إذا تمت إزالة الباحث المستند إلى المسار من‬

‫‪ ‬مكتشفات مسار الدخول‪5.5.1. ‬‬

‫التي تم تحديد موقعها‪ ‬بإدخال ‪ Python‬يكون‪ ‬الباحث المستند إلى المسار‪ ‬مسؤوالً عن إيجاد وتحميل وحدات وحزم‬
‫‪.‬مسار‪ ‬سلسلة‪ . ‬معظم أسماء مدخالت‪ L‬المسار مواقع في نظام الملفات ‪ ،‬لكن ال يجب أن تقتصر على هذا‬

‫البروتوكول الموصوف ساب ًقا ‪ ،‬ومع ذلك فإنه )(‪ find_spec‬بصفته مكتشف مسار التعريف ‪ ،‬يقوم الباحث المستند إلى المسار‪ ‬بتنفيذ‬
‫‪ .‬يعرض خطافات‪ L‬إضافية يمكن استخدامها لتخصيص كيفية العثور على الوحدات النمطية وتحميلها من‪ ‬مسار االستيراد‬

‫‪ ، sys.path، sys.path_hooks‬وتستخدم ثالثة متغيرات من قبل‪ ‬مكتشف الطريق القائم‬


‫تستخدم أيضا السمات‪ L‬على كائنات الحزمة‪ .‬توفر هذه طر ًقا إضافية يمكن من ‪ __path__ ‬و‪ sys.path_importer_cache. ‬و‬
‫‪.‬خاللها تخصيص آالت االستيراد‬

‫متغير ‪  PYTHONPATH ‬يحتوي على قائمة من السالسل التي توفر مواقع البحث عن الوحدات والحزم‪ .‬يتم تهيئته من‪sys.path‬‬
‫يمكن‪ ‬لإلدخاالت في‪ ‬تسمية الدالئل الموجودة في نظام ‪. sys.path‬البيئة والعديد من اإلعدادات االفتراضية الخاصة بالتثبيت والتنفيذ‬
‫التي يجب البحث فيها عن الوحدات )الوحدة النمطية‪ site‬راجع( الملفات والملفات المضغوطة و "المواقع" األخرى المحتملة‬
‫؛‪ ‬يتم تجاهل ‪ sys.path‬أو استعالمات‪ L‬قاعدة البيانات‪ .‬يجب أن تكون السالسل والبايت فقط موجودة في ‪ URL‬النمطية ‪ ،‬مثل عناوين‬
‫‪ .‬كافة‪ L‬أنواع البيانات األخرى‪ .‬يتم تحديد ترميز إدخاالت البايت بواسطة‪ ‬مكتشفات إدخال المسار‪ ‬الفردية‬

‫إن‪ ‬أداة‪ ‬البحث القائمة على المسار‪ ‬هي‪ ‬مكتشف‪ ‬مسار التعريف‪ ، ‬لذلك تبدأ آلية‪ ‬االستيراد‪ ‬البحث عن‪ ‬مسار االستيراد من‪ ‬خالل‬
‫ستكون ‪ find_spec()،‬الوسيطة لـ‪ path‬طريقة‪ ‬الباحث القائم على المسار‪ ‬كما هو موضح ساب ًقا‪ .‬عند تقديم)(‪ find_spec‬استدعاء‬
‫‪ path‬سمة‪ ‬الحزمة‪ ‬لالستيراد داخل تلك الحزمة‪ .‬إذا كانت‪ __path__ ‬قائمة بمسارات السلسلة التي يجب اجتيازها ‪ -‬عاد ًة ما تكون‬
‫‪.‬ويتم استخدامه‪ sys.path‬فهذا يشير إلى استيراد المستوى األعلى ‪ None،‬الوسيطة هي‬

‫يكرر الباحث المستند إلى المسار كل إدخال في مسار البحث ‪ ،‬ولكل منها ‪ ،‬يبحث عن‪ ‬مكتشف إدخال‬
‫على سبيل المثال ‪ ،‬قد ( إلدخال المسار‪ .‬نظرً ا ألن هذا يمكن أن يكون عملية باهظة الثمن )‪ ( PathEntryFinder‬المسار‪ ‬المناسب‪L‬‬
‫يحتفظ الباحث المستند إلى المسار بمدخالت مسار تعيين ذاكرة التخزين ‪) ،‬لهذا البحث‪ stat () ‬يكون هناك‪ ‬تكاليف إضافية الستدعاء‬
‫على الرغم من االسم ‪ sys.path_importer_cache( ،‬المؤقت لمكتشفات إدخال المسار‪ .‬يتم االحتفاظ بذاكرة التخزين المؤقت هذه‬
‫بهذه الطريقة ‪ ،‬ال ‪ ). ‬فإن ذاكرة التخزين المؤقت هذه تخزن في الواقع كائنات أداة البحث بدالً من أن تقتصر على‪ ‬كائنات‪ ‬المستورد‬
‫يلزم إجراء البحث المكلف عن‪ ‬مكتشف إدخال مسار‪ ‬موقع‪ ‬إدخال مسار‪ ‬معين‪ ‬إال مرة واحدة‪ .‬كود المستخدم مجاني إلزالة إدخاالت‬
‫إجبار الباحث المستند إلى المسار على إجراء بحث عن إدخال المسار ‪sys.path_importer_cache‬ذاكرة التخزين المؤقت من‬
‫‪ .‬مرة أخرى‪3 ‬‬
‫ً‬
‫موجود ا في ذاكرة التخزين المؤقت ‪ ،‬فإن الباحث المستند إلى المسار يتكرر عبر كل قابل لالستدعاء‬ ‫إذا لم يكن إدخال المسار‬
‫يتم استدعاء‪ ‬كل‪ ‬خطاف إدخال مسار‪  ‬في هذه القائمة باستخدام وسيط واحد ‪ ،‬وهو إدخال المسار الذي سيتم ‪ sys.path_hooks. ‬في‬
‫البحث فيه‪ .‬قد يؤدي هذا االستدعاء إما إلى إرجاع‪ ‬مكتشف إدخال المسار‪ ‬الذي يمكنه التعامل مع إدخال المسار ‪ ،‬أو قد يتم‬
‫يستخدم من قبل مكتشف على المسار لإلشارة إلى أن ورطتها ال يمكن العثور على‪ ‬مكتشف ‪ ImportError‬و‪ ImportError. ‬رفعه‬
‫إدخال مسار‪ ‬ألن‪ ‬إدخال مسار‪ . ‬يتم تجاهل االستثناء‪ ‬واستيراد المساريستمر التكرار‪ .‬يجب أن يتوقع موضع اإلضافة كائن سلسلة أو‬

‫‪Pg. 62‬‬
‫‪) ،‬أو أي شيء آخر ‪ ، UTF-8 ،‬على سبيل المثال ‪ ،‬قد يكون ترميز نظام ملفات( بايت؛‪ ‬إن ترميز كائنات البايت يصل إلى الخطاف‬
‫‪ ImportError.‬وإذا لم يتمكن الخطاف من فك شفرة الوسيطة ‪ ،‬فيجب أن يرتفع‬

‫طريقة )(‪ find_spec‬التكرار ينتهي مع أي‪ ‬إدخال مسار الباحث عن‪ ‬إعادته‪ ،‬ثم مكتشف على المسار في‪ sys.path_hooks‬إذا‬
‫مشيرا إلى ‪ None،‬والعودة )تشير إلى أنه ال يوجد مكتشف لهذا الدخول مسار(‪ sys.path_importer_cache‬في‪ None ‬سيخزن‬
‫‪.‬أن هذه‪ ‬الفوقية مسار مكتشف‪ ‬ال يمكن العثور على حدة‬

‫إذا‪ ‬تم‪ ‬إرجاع‪ ‬مكتشف إدخال المسار‪ ‬بواسطة أحد عناصر‪ ‬ربط ربط إدخال المسار‪ ‬الموجودة عليه‪ ، ‬فسيتم استخدام البروتوكول التالي‬
‫‪.sys.path_hooks‬ليطلب من الباحث عن مواصفات الوحدة النمطية ‪ ،‬والتي يتم استخدامها بعد ذلك عند تحميل الوحدة النمطية‬

‫أوالً ‪ ،‬إذا ‪ sys.path. ‬يتم التعامل مع دليل العمل الحالي ‪ -‬المشار إليه بسلسلة فارغة ‪ -‬بشكل مختلف قليالً عن المدخالت‪ L‬األخرى في‬
‫ثانيًا ‪ ،‬يتم البحث عن ‪ sys.path_importer_cache. ‬تم العثور على دليل العمل الحالي غير موجود ‪ ،‬فلن يتم تخزين أي قيمة فيه‬
‫حديثا لكل عملية بحث عن وحدة‪ً  .‬‬
‫ثالثا ‪ ،‬سيكون المسار المستخدم لـ‬ ‫ً‬ ‫والعودة‪ sys.path_importer_cache‬قيمة دليل العمل الحالي‬
‫‪.‬دليل العمل الحالي الفعلي وليس السلسلة الفارغة)(‪ importlib.machinery.PathFinder.find_spec‬بواسطة‬

‫‪ ‬بروتوكول مكتشف مسار الدخول‪5.5.2. ‬‬

‫من أجل دعم واردات الوحدات النمطية والحزم المُهيأة وأيضً ا للمساهمة بأجزاء في حزم مساحة االسم ‪ ،‬يجب على مكتشفات‪ L‬إدخال‬
‫‪.‬الطريقة)(‪ find_spec‬المسار تنفيذ‬

‫بإرجاع)(‪. find_spec‬تأخذ وسيطتين‪ :‬االسم المؤهل بالكامل للوحدة التي يتم استيرادها ‪ ،‬والوحدة الهدف (االختيارية))(‪find_spec‬‬
‫‪.‬مواصفات كاملة المأهولة للوحدة‪ .‬ستحتوي هذه المواصفات دائمًا على مجموعة "محمل" (مع استثناء واحد)‬

‫لإلشارة إلى آلية االستيراد أن المواصفات تمثل‪ ‬جزءًا من‪ ‬مساحة االسم‪ ، ‬يقوم مكتشف إدخال المسار بتعيين‬
‫‪.‬إلى قائمة تحتوي على الجزء "‪"subodule_search_locations‬‬

‫وكالهما إهمال اآلن‪ ،‬ولكن سيتم استخدامها ‪ find_module()،‬و)(‪ find_loader‬استبدال‪:find_spec() ‬تغير في اإلصدار ‪3.4‬‬


‫‪.‬لم يتم تعريف)(‪ find_spec‬إذا‬

‫ال تزال األساليب محترمة من ‪ find_spec(). ‬قد تقوم مكتشفات إدخال المسار األقدم بتنفيذ إحدى هاتين الطريقتين المهملتين بدالً من‬
‫تم تنفيذه على مكتشف إدخال المسار ‪ ،‬فسيتم تجاهل الطرق )(‪ find_spec‬أجل التوافق مع اإلصدارات السابقة‪ .‬ومع ذلك ‪ ،‬إذا‬
‫‪.‬القديمة‬

‫حيث يكون ‪ُ -tuple‬ترجع ‪. find_loader() 2‬وسيطة واحدة ‪ ،‬يتم استيراد االسم المؤهل للوحدة النمطية بالكامل)(‪find_loader‬‬
‫‪ .‬العنصر األول هو المُحمل والعنصر الثاني عبارة عن‪ ‬جزء‪ ‬مساحة‪ L‬االسم‬

‫للتوافق مع اإلصدارات السابقة مع التطبيقات األخرى لبروتوكول االستيراد ‪ ،‬تدعم العديد من مكتشفات إدخال المسار أيضًا‬
‫ال يتم استدعاء ‪ find_module()،‬الطريقة‪ ‬التقليدية‪ ‬التي يدعمها مكتشفو المسار الوصفي‪ .‬ومع ذلك)(‪ find_module‬نفس‬
‫وسيطة (من المتوقع أن تسجل معلومات المسار المناسبة من االستدعاء األولي إلى ‪ path‬طرق‪ ‬مكتشف إدخال المسار‪ً  ‬‬
‫أبدا باستخدام‬
‫‪.‬خطاف المسار)‬

‫تم إهمال الطريقة على المكتشفون دخول المسار‪ ،‬كما أنه ال يسمح مكتشف إدخال مسار للمساهمة أجزاء لحزم )(‪ find_module‬و‬
‫موجودة على إدخال مسار مكتشف‪ ،‬فإن نظام استيراد ندعو ‪ find_module() ‬و)(‪ find_loader‬مساحة‪ L‬االسم‪ .‬إذا كان كل‬
‫‪ find_module().‬في تفضيل)(‪ find_loader‬دائما‬

‫خالل نظام )(‪ find_loader‬ومن)(‪ find_module‬تم التغيير في اإلصدار ‪ :3.10‬سيتم رفع‪ ‬المكالمات إلى‬


‫‪ ImportWarning.‬االستيراد‬

‫‪ ‬استبدال نظام االستيراد القياسي‪5.6 ‬‬

‫واستبدالها ‪ sys.meta_path،‬تتمثل اآللية األكثر موثوقية الستبدال نظام االستيراد بالكامل في حذف المحتويات االفتراضية لـ‬
‫‪.‬بالكامل بخطاف مسار تعريف مخصص‬

‫‪Pg. 63‬‬
‫إذا كان من المقبول تغيير سلوك عبارات االستيراد فقط دون التأثير على واجهات برمجة التطبيقات األخرى التي تصل إلى نظام‬
‫فقد يكون‪ ‬استبدال‪ ‬الوظيفة المضمنة كافيًا‪ .‬يمكن أيضً ا استخدام هذه التقنية على مستوى الوحدة النمطية )(__‪ ، __import‬االستيراد‬
‫‪.‬لتغيير سلوك بيانات االستيراد فقط داخل تلك الوحدة‬

‫لمنع استيراد بعض الوحدات بشكل انتقائي من الخطاف في وقت مبكر على مسار التعريف (بدالً من تعطيل نظام االستيراد القياسي‬
‫يشير األخير إلى أن البحث ‪ None. ‬بدالً من إرجاعه)(‪ find_spec‬مباشر ًة من‪ ModuleNotFoundError‬تمامًا) ‪ ،‬يكفي رفعه‬
‫‪.‬عن مسار التعريف يجب أن يستمر ‪ ،‬بينما يؤدي رفع استثناء إلى إنهائه على الفور‬

‫‪ ‬الواردات النسبية للحزمة‪5.7 ‬‬

‫تستخدم الواردات النسبية النقاط البادئة‪  .‬تشير النقطة البادئة المفردة إلى استيراد نسبي ‪ ،‬بدءًا من الحزمة الحالية‪ .‬تشير نقطتان أو‬
‫أكثر من النقاط البادئة إلى استيراد نسبي ألصل (عناصر) الحزمة الحالية ‪ ،‬مستوى واحد لكل نقطة بعد األول‪ .‬على سبيل المثال ‪،‬‬
‫‪:‬بالنظر إلى تخطيط الحزمة التالي‬

‫‪package/‬‬

‫‪__init__.py‬‬

‫‪subpackage1/‬‬

‫‪__init__.py‬‬

‫‪moduleX.py‬‬

‫‪moduleY.py‬‬

‫‪subpackage2/‬‬

‫‪__init__.py‬‬

‫‪moduleZ.py‬‬

‫‪moduleA.py‬‬

‫‪:‬ما يلي عبارة عن عمليات استيراد نسبية صالحة ‪ subpackage1/__init__.py،‬أو‪ subpackage1/moduleX.py‬في أيٍ من‬

‫‪from .moduleY import spam‬‬

‫‪from .moduleY import spam as ham‬‬

‫‪from . import moduleY‬‬

‫‪from ..subpackage1 import moduleY‬‬

‫‪from ..subpackage2.moduleZ import eggs‬‬

‫‪from ..moduleA import foo‬‬

‫قد تستخدم عمليات االستيراد المطلقة إما‪ ‬بناء الجملة‪ ‬أو‪  ‬بناء الجملة ‪ ،‬لكن الواردات النسبية قد تستخدم النموذج الثاني فقط ؛‪ ‬والسبب‬
‫><‪:import <>from <> import ‬في ذلك‬

‫‪import XXX.YYY.ZZZ‬‬

‫‪.‬ليس تعبيرً ا صالحً ا ‪ .moduleY‬كتعبير قابل لالستخدام ‪ ،‬ولكن‪ XXX.YYY.ZZZ‬يجب أن يفضح‬

‫‪__ ‬اعتبارات خاصة لـ __الرئيسية‪5.8 ‬‬

‫يتم تهيئة الوحدة __‪ ، __main‬الوحدة هي حالة خاصة بالنسبة للنظام استيراد بايثون‪ .‬كما هو مذكور في‪ ‬مكان آخر__‪ __main‬و‬
‫ومع ذلك ‪ ،‬على عكس هذين ‪ ،‬فهي ال تتأهل بشكل صارم كوحدة ‪ builtins. ‬و‪ sys‬مباشرة عند بدء تشغيل المترجم الفوري ‪ ،‬مثل‬

‫‪Pg. 64‬‬
‫تتم بها التهيئة تعتمد على العالمات‪ L‬والخيارات األخرى التي يتم من خاللها __‪ __main‬نمطية مدمجة‪ .‬وذلك ألن الطريقة التي‬
‫‪.‬استدعاء المترجم‬

‫‪__ ‬الرئيسية __‪ __.‬المواصفات__‪5.8.1. ‬‬

‫‪ None.‬يتم تعيينه بشكل مناسب أو‪ ، __main__.__spec__ ‬التهيئة__‪ __main‬اعتما ًدا على كيفية‬

‫__‪. __spec‬يتم تعيينه على مواصفات الوحدة النمطية للوحدة أو الحزمة المقابلة__‪ ، __spec‬بالخيار‪ Python -m‬عند بدء تشغيل‬
‫‪.‬إدخال آخر‪ sys.path‬تحميل الوحدة كجزء من تنفيذ دليل أو ملف مضغوط أو__‪ __main‬يتم ملؤها أيضً ا عند‬

‫ال يتوافق مباشر ًة__‪ __main‬حيث أن الكود المستخدم لملء ‪ None،‬يتم تعيين إلى‪ ، __main__.__spec__ ‬في‪ ‬الحاالت المتبقية‬
‫‪:‬مع وحدة نمطية قابلة لالستيراد‬

‫‪‬‬ ‫موجه تفاعلي‬

‫‪‬‬ ‫اختيار‪-c ‬‬

‫‪‬‬ ‫‪ stdin‬يركض من‬

‫‪‬‬ ‫تعمل مباشرة من مصدر أو ملف بايت كود‬

‫في الحالة األخيرة ‪ ،‬حتى إذا كان‪ ‬من الممكن استيراد الملف من الناحية ‪ None‬يكون دائمًا__‪ __main__.__spec‬الحظ أن هذا‬
‫‪ __main__.‬التبديل إذا كانت البيانات الوصفية للوحدة مطلوبة في‪ -m‬الفنية مباشر ًة كوحدة نمطية بدالً من ذلك‪ .‬استخدم رمز‬

‫ويتم تعيينها وف ًقا لذلك ‪ __main__.__spec__ ،‬تتوافق مع وحدة نمطية قابلة لالستيراد__‪ __main‬الحظ أيضً ا أنه حتى عندما‬
‫فإنها ال تزال تعتبر‪ ‬وحدات‪ ‬مميزة‪ . ‬ويرجع ذلك إلى حقيقة أن الكتل الخاضعة للحراسة بواسطة‪ ‬عمليات التحقق ال يتم تنفيذها إال عند‬
‫__‪.if __name__ == "__main__":__main‬استخدام الوحدة النمطية لملء‪ ‬مساحة‪ L‬االسم ‪ ،‬وليس أثناء االستيراد العادي‬

‫‪ ‬قضايا مفتوحة‪5.9. ‬‬

‫‪.‬سيكون من الرائع ح ًقا أن يكون لديك رسم تخطيطي‬

‫ماذا عن قسم مخصص فقط لسمات الوحدات والحزم ‪ ،‬ربما توسيع أو استبدال اإلدخاالت ذات )‪XXX * (import_machinery.rst‬‬
‫الصلة في صفحة مرجع نموذج البيانات؟‬

‫وآخرون في دليل المكتبة على روابط "انظر أيضً ا" في الجزء العلوي التي تشير ‪ pkgutil‬و ‪ XXX runpy‬يجب أن يحصل كل من‬
‫‪.‬إلى قسم نظام االستيراد الجديد‬

‫يتم التهيئة بها؟__‪ __main‬أضف المزيد من الشرح بخصوص الطرق المختلفة التي ‪XXX‬‬

‫‪ PEP 395 ).‬أي نسخ من( المراوغات ‪ /‬المزالق__‪ __main‬أضف مزي ًدا من المعلومات‪ L‬حول ‪XXX‬‬

‫‪5.10. References‬‬

‫تطورت آلية االستيراد بشكل كبير منذ أيام بايثون األولى‪ .‬ال تزال‪ ‬المواصفات‪ ‬األصلية‪ ‬للحزم‪ ‬متاحة للقراءة ‪ ،‬على الرغم من تغيير‬
‫‪.‬بعض التفاصيل منذ كتابة هذا المستند‬

‫‪ .‬مع التمديد الالحق فيبيب ‪PEP 302 ، 420‬كان‪ sys.meta_path‬المواصفات األصلية لـ‬

‫‪find_module().‬البروتوكول كبديل لـ)(‪find_loader‬أيضًا‪ PEP 420 ‬قدم‪ Python 3.3. ‬حزم مساحة االسم‪ ‬لـ‪ PEP 420 ‬قدم‬

‫‪.‬السمة للواردات النسبية الصريحة في الوحدات النمطية الرئيسية__‪__package‬إضافة‪ PEP 366 ‬يصف‬

‫في‪ ‬النهاية ‪ PEP 366‬للدالالتسيحدد__‪__name‬الواردات النسبية المطلقة والصريحة واقترح في البداية‪ PEP 328 ‬قدم‬


‫‪ __package__.‬ل‬

‫‪.‬تنفيذ الوحدات النمطية على أنها نصوص‪ PEP 338 ‬يع ّرف‬

‫‪Pg. 65‬‬
‫تغليف حالة االستيراد لكل وحدة في كائنات المواصفات‪ .‬كما أنه ينقل معظم المسؤوليات المعيارية للرافعات إلى ‪ PEP 451 ‬يضيف‬
‫آالت االستيراد‪  .‬تسمح هذه التغييرات بإهمال العديد من واجهات برمجة التطبيقات في نظام االستيراد وكذلك إضافة طرق جديدة إلى‬
‫‪.‬أدوات االكتشاف والتحميل‬

‫الحواشي‬

‫‪1‬‬

‫‪ types.ModuleType.‬انظر‬

‫‪2‬‬

‫استخدام قيمة اإلرجاع مباشر ًة‪ .‬بدالً من ذلك ‪ ،‬يحصل على كائن الوحدة النمطية من خالل البحث عن اسم ‪ importlib‬يتجنب تطبيق‬
‫هذا سلوك‪ sys.modules. ‬التأثير غير المباشر لهذا هو أن الوحدة التي تم استيرادها قد تحل محل نفسها في‪ sys.modules. ‬الوحدة‬
‫‪.‬األخرى ‪ Python‬خاص بالتنفيذ وال يمكن ضمان عمله في تطبيقات‬

‫‪3‬‬

‫في ‪ imp.NullImporter‬في التعليمات البرمجية القديمة ‪ ،‬من الممكن العثور على مثيالت‬
‫لمزيد‪ Porting Python code ‬بدالً من ذلك‪ .‬راجع‪ None‬يوصى بتغيير الرمز الستخدامه‪ sys.path_importer_cache. ‬ملف‬
‫‪.‬من التفاصيل‬

‫‪6. Expressions‬‬

‫‪.‬يشرح هذا الفصل معنى عناصر التعبيرات في بايثون‬

‫الممتد لوصف بناء الجملة وليس التحليل ‪ BNF‬مالحظات بناء الجملة‪ :‬في هذا والفصول التالية ‪ ،‬سيتم استخدام تدوين‬
‫المعجمي‪ .‬عندما (بديل واحد) لقاعدة بناء الجملة الشكل‬

‫‪ :: = othername‬االسم‬

‫‪ othername.‬هي نفسها لـ‪ name‬وال يتم إعطاء دالالت ‪ ،‬فإن دالالت هذا الشكل‬

‫‪ ‬التحويالت الحسابية‪6.1 ‬‬

‫عندما يستخدم وصف عامل حسابي أدناه العبارة "يتم تحويل الوسائط الرقمية إلى نوع شائع" ‪ ،‬فهذا يعني أن تنفيذ المشغل لألنواع‬
‫‪:‬المضمنة يعمل على النحو التالي‬

‫‪‬‬ ‫إذا كانت أي من الوسيطتين عبارة عن رقم مركب ‪ ،‬يتم تحويل األخرى إلى معقد ؛‬
‫‪‬‬ ‫وإال ‪ ،‬إذا كانت أي من الوسيطتين عبارة عن رقم فاصلة عائمة ‪ ،‬يتم تحويل األخرى إلى فاصلة عائمة ؛‬

‫‪‬‬ ‫‪.‬وبخالف ذلك ‪ ،‬يجب أن يكون كالهما ً‬


‫عددا صحيحً ا وال يلزم إجراء أي تحويل‬

‫تنطبق بعض القواعد اإلضافية على عوامل تشغيل معينة (على سبيل المثال ‪ ،‬سلسلة كوسيطة أيسر لعامل التشغيل '‪ .)'٪‬يجب أن‬
‫‪.‬تحدد اإلضافات‪ L‬سلوك التحويل الخاص بها‬

‫‪6.2. Atoms‬‬
‫الذرات هي العناصر األساسية للتعبيرات‪ .‬أبسط الذرات هي معرفات‪ L‬أو حرفية‪ .‬يتم أي ً‬
‫ضا تصنيف األشكال الموجودة بين أقواس أو‬
‫‪:‬أقواس أو أقواس من الناحية التركيبية على أنها ذرات‪ .‬صيغة الذرات هي‬

‫ذرة‬ ‫‪:: = identifier| literal|enclosure‬‬

‫‪ :: = parenth_form| list_display| dict_display| set_display‬الضميمة‬

‫‪| generator_expression|yield_atom‬‬

‫‪ ‬المعرفات (األسماء)‪6.2.1. ‬‬

‫‪Pg. 66‬‬
‫المعرف الذي يحدث على شكل ذرة هو اسم‪ .‬انظر قسم‪ ‬المعرفات والكلمات‪ ‬األساسية‪ L‬للتعريف المعجمي وقسم‪ ‬التسمية والربط‪ ‬لتوثيق‬
‫‪.‬التسمية والربط‬
‫ً‬
‫مرتبطا بجسم ما ‪ ،‬فإن تقييم الذرة ينتج هذا الكائن‪ .‬عندما يكون االسم غير ملزم ‪ ،‬فإن محاولة تقييمه‬ ‫عندما يكون االسم‬
‫‪.‬استثناءً‪ NameError ‬تثير‬

‫تشويه االسم الخاص‪ :‬عندما يبدأ المعرف الذي يحدث نصيًا في تعريف فئة بحرفين أو أكثر من أحرف الشرطة السفلية وال ينتهي‬
‫بشرطة سفلية أو أكثر ‪ ،‬فإنه يعتبر‪ ‬اسمًا خاصًا‪ ‬لتلك الفئة‪ .‬يتم تحويل األسماء‪ L‬الخاصة إلى نموذج أطول قبل إنشاء رمز لها‪ .‬يُدرج‬
‫التحويل اسم الفئة ‪ ،‬مع إزالة الشرطات السفلية البادئة وإدراج شرطة سفلية واحدة أمام االسم‪ .‬على سبيل المثال ‪ ،‬سيتم‬
‫هذا التحول مستقل عن السياق النحوي الذي ‪_Ham__spam. ‬إلى‪ Ham‬يحدث في فئة مسماة‪ __spamL‬تحويل‪ ‬المعرف الذي‬
‫يستخدم فيه المعرف‪ .‬إذا كان االسم المحول طويالً للغاية (أطول من ‪ 255‬حر ًفا) ‪ ،‬فقد يحدث اقتطاع محدد للتنفيذ‪ .‬إذا كان اسم الفئة‬
‫‪.‬يتكون فقط من شرطات سفلية ‪ ،‬فلن يتم إجراء أي تحويل‬

‫‪6.2.2. Literals‬‬

‫‪:‬القيم الحرفية للسلسلة والبايت والعديد من القيم الحرفية الرقمية ‪ Python‬تدعم‬

‫‪ :: = stringliteral| bytesliteral‬حرفي‬

‫‪| integer| floatnumber|imagnumber‬‬

‫ينتج عن تقييم حرفي كائن من النوع المحدد (سلسلة ‪ ،‬بايت ‪ ،‬عدد صحيح ‪ ،‬رقم النقطة العائمة ‪ ،‬رقم مركب) بالقيمة المحددة‪ .‬يمكن‬
‫‪.‬للحصول على التفاصيل‪ Literals ‬تقريب القيمة في حالة الفاصلة العائمة والحرفية التخيلية (المعقدة)‪ .‬انظر قسم‬

‫تتوافق جميع القيم الحرفية مع أنواع البيانات غير القابلة للتغيير ‪ ،‬وبالتالي فإن هوية الكائن أقل أهمية من قيمته‪ .‬قد تحصل التقييمات‬
‫المتعددة للقيم الحرفية بنفس القيمة (إما نفس التكرار في نص البرنامج أو حدث مختلف) على نفس الكائن أو كائن مختلف بنفس‬
‫‪.‬القيمة‬

‫‪ ‬أشكال بين قوسين‪6.2.3. ‬‬

‫‪:‬النموذج بين قوسين هو قائمة تعبير اختيارية محاطة بأقواس‬

‫")" ]‪parenth_form :: = "(" [ starred_expression‬‬

‫ينتج عن قائمة‪ L‬التعبير بين قوسين ما ينتج عن قائمة التعبيرات هذه‪ :‬إذا كانت القائمة تحتوي على فاصلة واحدة على األقل ‪ ،‬فستنتج‬
‫‪.‬مجموعة ؛‪  ‬وإال فإنه ينتج التعبير المفرد الذي يتكون من قائمة التعبير‬

‫غير قابلة للتغيير ‪ ،‬تنطبق نفس القواعد المطبقة على العناصر ‪ tuple‬ينتج عن زوج فارغ من األقواس كائن بنية فارغ‪ .‬نظرً ا ألن‬
‫‪.‬الحرفية (على سبيل المثال ‪ ،‬قد ينتج عن تواجدان للمجموعة الفارغة نفس الكائن أو قد ال ينتج عنهما)‬

‫الفارغ ‪ ،‬حيث‪ ‬يلزم‪ ‬وجود‪ ‬أقواس‪ tuple - ‬الحظ أن المجموعات ال تتكون من األقواس ‪ ،‬بل باستخدام عامل الفاصلة‪ .‬االستثناء هو‬
‫حيث يؤدي السماح بـ "ال شيء" غير المحصور في التعبيرات إلى االلتباسات والسماح لألخطاء المطبعية الشائعة بالمرور بدون‬
‫‪.‬تحديد‬

‫‪ ‬يعرض القوائم والمجموعات والقواميس‪6.2.4. ‬‬

‫‪:‬صيغة خاصة تسمى "شاشات‪ L‬العرض" ‪ ،‬كل منها بنكهتين ‪ Python‬إلنشاء قائمة ‪ ،‬توفر مجموعة أو قاموس‬

‫‪‬‬ ‫إما أن يتم سرد محتويات الحاوية بشكل صريح ‪ ،‬أو‬

‫‪‬‬ ‫‪ .‬يتم حسابها‪ L‬عبر مجموعة من تعليمات التكرار والتصفية تسمى‪ ‬الفهم‬

‫‪:‬العناصر النحوية الشائعة لعمليات الفهم هي‬

‫‪ :: = assignment_expression comp_for‬الفهم‬

‫‪comp_for‬‬ ‫]‪" or_test[ comp_iter‬في"‪" target_list‬لـ" ]"غير متزامن"[ = ‪::‬‬

‫‪Pg. 67‬‬
‫‪comp_iter‬‬ ‫‪:: = comp_for|comp_if‬‬

‫‪comp_if‬‬ ‫]‪:: = "if" or_test[ comp_iter‬‬

‫جمل‪ .‬في هذه الحالة‪ ،‬عناصر حاويات جديدة‪ if‬أو‪ for‬وصفر أو أكثر‪ for‬يتكون الفهم من تعبير واحد متبو ًعا بجملة واحدة على األقل‬
‫بنود كتلة‪ ،‬التعشيش من اليسار إلى اليمين‪ ،‬وتقييم التعبير إلنتاج ‪ if‬أو‪ for‬هي تلك التي سيتم إنتاجها من خالل النظر في كل من‬
‫‪.‬عنصر في كل مرة يتم الوصول إلى كتلة األعمق‬

‫يتم تنفيذ الفهم في نطاق منفصل ‪ for،‬ومع ذلك ‪ ،‬بصرف النظر عن التعبير القابل للتكرار في الجملة الموجودة في أقصى اليسار‬
‫‪.‬متداخل ضمنيًا‪ .‬يضمن ذلك عدم "تسرب" األسماء‪ L‬المعينة في قائمة الهدف إلى نطاق التضمين‬

‫يتم تقييم‪  ‬التعبير القابل للتكرار في الجملة الموجودة في أقصى اليسار‪ ‬مباشر ًة في نطاق التضمين ثم يتم تمريره كوسيطة إلى ‪for‬‬
‫في نطاق ‪ for‬الجمل‪ ‬الالحقة‪  ‬وأي شرط تصفية في الجملة الموجودة في أقصى اليسار‪ for‬النطاق المتداخل ضمنيًا‪ .‬ال يمكن تقييم‬
‫‪ : .‬التضمين ألنها قد تعتمد على القيم التي تم الحصول عليها من أقصى اليسار قابلة للتكرار‪ .‬على سبيل المثال‬
‫])‪[x*y for x in range(10) for y in range(x, x+10‬‬

‫‪.yield from‬و‪ ‬يحظر التعبيرات في نطاق متداخلة ضمنا‪، yield‬لضمان فهم دائما يؤدي إلى وعاء من النوع المناسب‬

‫في‪ ‬دالة ما ‪ ،‬يمكن استخدام جملة لتكرارها على‪ ‬مكرر غير متزامن‪ . ‬قد يتكون‪ ‬الفهم في‪ ‬دالة ما من ‪ Python 3.6 ،‬منذ‬
‫عبارة‪ ‬أو‪ ‬فقرة تلي التعبير الرئيسي ‪ ،‬وقد تحتوي على‪ ‬فقرات‪ ‬إضافية‪ ‬أو‪ ‬فقرات ‪ ،‬وقد تستخدم أيضًا‪ ‬التعبيرات‪ .‬إذا كان الفهم يحتوي‬
‫التي يظهر فيها‪ .‬أنظر ‪ coroutine‬على‪ ‬جمل أو‪ ‬تعبيرات يطلق عليه‪ ‬الفهم غير المتزامن‪ . ‬قد يوقف الفهم غير المتزامن تنفيذ وظيفة‬
‫‪ .‬بيب ‪async defasync forasync defforasync forforasync forawaitasync forawait530‬أيضا‬

‫‪.‬الجديد في اإلصدار ‪ :3.6‬تم تقديم الفهم غير المتزامن‬

‫‪.yield from‬و‪ ‬يحظر في نطاق متداخلة ضمنا‪:yield ‬تغير في اإلصدار ‪3.8‬‬

‫‪ ‬يعرض القائمة‪6.2.5. ‬‬

‫‪:‬عرض القائمة هو ربما سلسلة فارغة من التعبيرات الموضوعة بين أقواس مربعة‬

‫"]" ]‪list_display :: = "[" [ starred_list| comprehension‬‬

‫ينتج عن عرض القائمة كائن قائمة‪ L‬جديد ‪ ،‬يتم تحديد المحتويات إما بقائمة من التعبيرات أو الفهم‪ .‬عندما يتم توفير قائمة من التعبيرات‬
‫مفصولة بفواصل ‪ ،‬يتم تقييم عناصرها من اليسار إلى اليمين ووضعها في كائن القائمة بهذا الترتيب‪ .‬عندما يتم توفير الفهم ‪ ،‬يتم‬
‫‪.‬إنشاء القائمة من العناصر الناتجة عن الفهم‬

‫‪ ‬تعيين العروض‪6.2.6. ‬‬

‫يتم اإلشارة إلى مجموعة العرض من خالل األقواس المتعرجة ويمكن تمييزها عن شاشات عرض القاموس بسبب عدم وجود‬
‫‪:‬عالمات النقطتين التي تفصل بين المفاتيح والقيم‬

‫"}" )‪set_display :: = "{" ( starred_list| comprehension‬‬

‫ينتج عن عرض المجموعة كائن مجموعة جديد قابل للتغيير ‪ ،‬يتم تحديد المحتويات إما عن طريق سلسلة من التعبيرات أو‬
‫الفهم‪  .‬عندما يتم توفير قائمة من التعبيرات مفصولة بفواصل ‪ ،‬يتم تقييم عناصرها من اليسار إلى اليمين وإضافتها إلى الكائن‬
‫‪.‬المحدد‪  .‬عندما يتم توفير الفهم ‪ ،‬يتم إنشاء المجموعة من العناصر الناتجة عن الفهم‬

‫‪.‬ال يمكن إنشاء مجموعة فارغة باستخدام‪}{ ‬؛‪ ‬هذا الحرفي يبني قاموس فارغ‬

‫‪ ‬يعرض القاموس‪6.2.7. ‬‬

‫‪:‬عرض القاموس هو ربما سلسلة فارغة من أزواج المفاتيح ‪ /‬المسند محاطة بأقواس معقوفة‬

‫‪dict_display‬‬ ‫"}" ]‪:: = "{" [ key_datum_list| dict_comprehension‬‬

‫‪key_datum_list‬‬ ‫]"‪:: = key_datum("،" key_datum) * ["،‬‬

‫‪Pg. 68‬‬
‫‪key_datum‬‬ ‫‪:: = expression":" expression| "**"or_expr‬‬

‫‪dict_comprehension :: = expression":"expression comp_for‬‬

‫‪.‬ينتج عن عرض القاموس كائن قاموس جديد‬

‫إذا تم تقديم تسلسل مفصول بفواصل ألزواج المفاتيح ‪ /‬المسند ‪ ،‬فسيتم تقييمها من اليسار إلى اليمين لتحديد إدخاالت القاموس‪ :‬يتم‬
‫استخدام كل كائن مفتاح كمفتاح في القاموس لتخزين البيانات المقابلة‪  .‬هذا يعني أنه يمكنك تحديد نفس المفتاح عدة مرات في قائمة‬
‫‪.‬المفاتيح ‪ /‬البيانات ‪ ،‬وستكون قيمة القاموس النهائية لهذا المفتاح هي آخر قيمة معطاة‬

‫تشير‪ ‬النجمة المزدوجة‪ ‬إلى‪ ‬تفريغ القاموس‪ . ‬يجب أن يكون المعامل انها ل‪ ‬رسم الخرائط‪ . ‬تتم إضافة كل عنصر تعيين إلى **‬
‫القاموس الجديد‪  .‬تحل القيم الالحقة محل القيم التي تم تعيينها بالفعل بواسطة أزواج المفاتيح ‪ /‬البيانات السابقة وعمليات تفريغ‬
‫‪.‬القاموس السابقة‬

‫‪ .‬الجديد في اإلصدار ‪ :3.5‬التفريغ في عروض القواميس ‪ ،‬الذي اقترحه في األصل‪448‬‬

‫"‪ "if‬و "‪ "for‬يحتاج الفهم الدكتاتوري ‪ ،‬على النقيض من الفهم الشامل والقائم ‪ ،‬إلى تعبيرين مفصولين بنقطتين متبوعين بعبارات‬
‫‪.‬المعتادة‪  .‬عند تشغيل عملية الفهم ‪ ،‬يتم إدخال عناصر القيمة والمفتاح الناتج في القاموس الجديد بترتيب إنتاجهما‬

‫تم سرد القيود المفروضة على أنواع قيم المفاتيح مسب ًقا في القسم‪ ‬التدرج الهرمي للنوع القياسي‪( . ‬للتلخيص ‪ ،‬يجب أن يكون نوع‬
‫المفتاح قاباًل ‪ ‬للتجزئة‪ ، ‬مما يستبعد جميع الكائنات القابلة للتغيير‪ ).‬لم يتم اكتشاف‪ ‬التعارضات‪ ‬بين المفاتيح المكررة ؛‪ ‬يسود المرجع‬
‫‪.‬األخير (نصيًا في أقصى اليمين في الشاشة) المخزن لقيمة مفتاح معينة‬

‫في‪ Python 3.8. ‬لم يكن ترتيب تقييم المفتاح والقيمة محد ًدا بشكل جيد قبل ‪ Python 3.8 ،‬تم التغيير في اإلصدار ‪ :3.8‬قبل‬
‫‪ .‬تم تقييم القيمة قبل المفتاح‪ .‬بدءًا من ‪ ، 3.8‬يتم تقييم المفتاح قبل القيمة ‪ ،‬على النحو الذي اقترحه‪CPython ، 572‬‬

‫‪ ‬تعبيرات المولد‪6.2.8. ‬‬

‫‪:‬تعبير المولد هو رمز مولد مضغوط بين قوسين‬

‫")" "(" = ‪Generator_expression ::‬‬

‫‪expression comp_for‬‬

‫ينتج عن تعبير المولد كائن منشئ جديد‪  .‬تركيبها هو نفسه بالنسبة لعمليات الفهم ‪ ،‬باستثناء أنها محاطة بأقواس بدالً من األقواس أو‬
‫‪.‬األقواس المتعرجة‬

‫يتم استدعاء الطريقة لكائن المولد (بنفس طريقة المولدات)(__‪ __next‬يتم تقييم المتغيرات المستخدمة في تعبير المولد بتكاسل عندما‬
‫يتم تقييم‪  ‬التعبير القابل للتكرار في الجملة الموجودة في أقصى اليسار‪ ‬على الفور ‪ ،‬بحيث يتم إصدار خطأ ‪ ، for‬العادية)‪ .‬ومع ذلك‬
‫‪  for‬ناتج عن ذلك عند النقطة التي يتم فيها تعريف تعبير المولد ‪ ،‬بدالً من النقطة التي يتم فيها استرداد القيمة األولى‪ .‬ال يمكن تقييم‬
‫في نطاق التضمين ألنها قد تعتمد على القيم التي تم ‪ for‬الجمل‪ ‬الالحقة‪  ‬وأي شرط تصفية في الجملة الموجودة في أقصى اليسار‬
‫))‪: .(x*y for x in range(10) for y in range(x, x+10‬الحصول عليها من أقصى اليسار قابلة للتكرار‪ .‬على سبيل المثال‬

‫‪.‬يمكن حذف األقواس في المكالمات ذات وسيطة واحدة فقط‪ .‬انظر قسم‪ ‬المكالمات‪ L‬للحصول على التفاصيل‬

‫‪.yield from‬و‪ ‬يحظر التعبيرات في مولد يعرف ضمنا‪، yield‬لتجنب التدخل في العملية المتوقعة للتعبير مولد نفسها‬

‫إذا احتوى تعبير المولد على‪ ‬جمل أو‪ ‬تعبيرات ‪ ،‬فإنه يسمى‪ ‬تعبير منشئ غير متزامن‪ . ‬يعيد تعبير المولد غير المتزامن كائن مولد‬
‫‪.async forawait‬غير متزامن جديد ‪ ،‬وهو مكرر غير متزامن (انظر‪ ‬التكرارات غير المتزامنة‪) ‬‬

‫‪.‬الجديد في اإلصدار ‪ :3.6‬تم تقديم تعبيرات المولد غير المتزامن‬

‫بدءًا من‪ coroutines. ‬يمكن أن تظهر تعبيرات المولد غير المتزامن فقط في ‪ Python 3.7 ،‬تم التغيير في اإلصدار ‪ :3.7‬قبل‬
‫‪ ، 3.7.async def‬يمكن ألي وظيفة استخدام تعبيرات المولد غير المتزامن‬

‫‪.yield from‬و‪ ‬يحظر في نطاق متداخلة ضمنا‪:yield ‬تغير في اإلصدار ‪3.8‬‬

‫‪ ‬تعبيرات الخضوع‪6.2.9. ‬‬

‫‪Pg. 69‬‬
‫العائد_الذرة‬ ‫")"‪:: = "(" yield_expression‬‬

‫]‪" expression‬من" |‪" [ expression_list‬العائد" = ‪_expression ::‬العائد‬

‫يتم استخدام تعبير العائد عند تحديد‪ ‬وظيفة‪ ‬المولد‪ ‬أو وظيفة‪ ‬المولد‪ ‬غير المتزامن‪ ‬وبالتالي ال يمكن استخدامها إال في جسم تعريف‬
‫الوظيفة‪  .‬يؤدي استخدام تعبير العائد في جسم الوظيفة إلى أن تكون هذه الوظيفة مول ًدا ‪ ،‬كما يؤدي استخدامها في‪ ‬جسم الوظيفة إلى أن‬
‫‪:async def‬بمثابة مولد غير متزامن‪ .‬على سبيل المثال ‪ coroutine‬تكون وظيفة‬

‫‪def gen(): # defines a generator function‬‬

‫‪yield 123‬‬

‫‪async def agen(): # defines an asynchronous generator function‬‬

‫‪yield 123‬‬

‫ال يُسمح بالتعبيرات كجزء من النطاقات المعرفة ضمنيًا المستخدمة‪ L‬لتنفيذ عمليات‪ ، yield‬نظرً ا آلثارها الجانبية على النطاق المحتوي‬
‫‪.‬الفهم وتعبيرات المولد‬

‫تم التغيير في اإلصدار ‪ :3.8‬تعبيرات اإلنتاجية المحظورة في النطاقات المتداخلة ضمنيًا المستخدمة‪ L‬لتنفيذ عمليات الفهم وتعبيرات‬
‫‪.‬المولد‬

‫‪  .‬يتم وصف وظائف المولد أدناه ‪ ،‬بينما يتم وصف وظائف المولد غير المتزامن بشكل منفصل في قسم‪ ‬وظائف المولد غير المتزامن‬

‫عندما يتم استدعاء وظيفة المولد ‪ ،‬فإنها ُترجع مكررً ا يُعرف باسم المولد‪ .‬ثم يتحكم هذا المولد في تنفيذ وظيفة المولد‪ .‬يبدأ التنفيذ عند‬
‫استدعاء إحدى طرق المولد‪  .‬في ذلك الوقت ‪ ،‬ينتقل التنفيذ إلى تعبير العائد األول ‪ ،‬حيث يتم تعليقه مرة أخرى ‪ ،‬مع إعادة‬
‫لمتصل المولد‪  .‬من خالل التعليق ‪ ،‬فإننا نعني أنه يتم االحتفاظ بجميع الحاالت المحلية ‪ ،‬بما في ذلك ‪expression_list‬قيمة‬
‫االرتباطات الحالية للمتغيرات المحلية ‪ ،‬ومؤشر التعليمات ‪ ،‬ومكدس التقييم الداخلي ‪ ،‬وحالة أي معالجة استثناء‪ .‬عندما يتم استئناف‬
‫التنفيذ عن طريق استدعاء إحدى طرق المولد ‪ ،‬يمكن أن تستمر الوظيفة تمامًا كما لو كان تعبير العائد مجرد مكالمة خارجية‬
‫عاد ًة عبر إما عن ( تم استخدامه)(__‪ __next‬أخرى‪  .‬تعتمد قيمة تعبير العائد بعد االستئناف على الطريقة التي استأنفت التنفيذ‪ .‬إذا‬
‫تم استخدامه ‪ ،‬فستكون النتيجة هي القيمة التي تم )(‪ send‬خالف ذلك ‪ ،‬إذا‪ None. ‬فإن النتيجة هي ‪) ،‬المدمج)(‪ next‬أو‪ a for‬طريق‬
‫‪.‬تمريرها إلى تلك الطريقة‬

‫؛‪ ‬تسفر عدة مرات ‪ ،‬ولديها أكثر من نقطة دخول ويمكن تعليق ‪ coroutines‬كل هذا يجعل وظائف المولد تشبه إلى حد كبير‬
‫تنفيذها‪  .‬االختالف الوحيد هو أن وظيفة المولد ال يمكنها التحكم في المكان الذي يجب أن يستمر فيه التنفيذ بعد أن ينتج ؛‪ ‬يتم دائمًا نقل‬
‫‪.‬التحكم إلى متصل المولد‬

‫اإلنشاء‪  .‬إذا لم يتم استئناف المولد قبل االنتهاء منه (من خالل الوصول إلى عدد مرجعي ‪ try‬يُسمح بتعبيرات العائد في أي مكان في‬
‫‪ .‬بتنفيذ‪ ‬أي‪ ‬بنود‪ ‬معلقة‪ finally‬فسيتم استدعاء طريقة‪ ‬المولد المكرر‪ ، ‬مما يسمح)(‪ ، close‬صفري أو عن طريق جمع القمامة)‬

‫عند‪ ‬استخدامه ‪ ،‬يجب أن يكون التعبير المقدم قابالً للتكرار‪  .‬القيم الناتجة عن التكرار أن التكرارات يتم تمريرها مباشرة إلى من‬
‫يستدعي طرق المولد الحالي‪ .‬يتم تمرير أي قيم تم تمريرها مع‪ ‬وأي استثناءات تم‪ ‬تمريرها إلى المكرر األساسي إذا كان يحتوي على‬
‫الطرق المناسبة‪ .‬إذا لم يكن األمر كذلك ‪ ،‬فسيتم رفع‪ ‬أو‪ ، ‬بينما‪ ‬سيرفع‪ ‬الوقت‪ ‬الذي تم تمريره بشكل استثنائي على‬
‫)(‪.yield from <expr>send()throw()send()AttributeErrorTypeErrorthrow‬الفور‬

‫المثيل البارز هي قيمة تعبير العائد‪ .‬يمكن ضبطه إما بشكل ‪ StopIteration‬سمة‪ value ‬عند اكتمال المكرر األساسي ‪ ،‬تصبح‬
‫أو تلقائيًا عندما يكون المولد الفرعي عبارة عن مولد (عن طريق إرجاع قيمة من المولد ‪ StopIteration،‬صريح عند الرفع‬
‫‪.‬الفرعي)‬

‫>‪.yield from <expr‬تم التغيير في اإلصدار ‪ :3.3‬تمت اإلضافة‪ ‬لتفويض تدفق التحكم إلى المترجم الفرعي‬

‫‪.‬يمكن حذف األقواس عندما يكون تعبير العائد هو التعبير الوحيد على الجانب األيمن من بيان اإلسناد‬

‫أنظر أيضا‬

‫‪Pg. 70‬‬
‫مولدات بسيطة ‪PEP 255 -‬‬

‫‪.‬والبيان إلى بايثون‪ yield‬اقتراح إضافة المولدات‬

‫عبر المولدات المحسنة ‪PEP 342 - Coroutines‬‬

‫‪.‬وبناء جملة المولدات ‪ ،‬مما يجعلها قابلة لالستخدام ككروتينات بسيطة )‪ (API‬اقتراح تحسين واجهة برمجة التطبيقات‬

‫بناء الجملة للتفويض إلى مولد فرعي ‪PEP 380 -‬‬

‫‪.‬التركيب اللغوي ‪ ،‬مما يسهل التفويض للمولدين الفرعيين‪ yield_from‬اقتراح إدخال‬

‫المولدات غير المتزامنة ‪PEP 525 -‬‬

‫‪ coroutine.‬عن طريق إضافة قدرات المولد إلى وظائف‪ PEP 492 ‬االقتراح الذي توسع‬

‫‪ ‬طرق المولد المكرر‪6.2.9.1. ‬‬

‫‪.‬يصف هذا القسم الفرعي طرق مولد المولد‪ .‬يمكن استخدامها للتحكم في تنفيذ وظيفة المولد‬

‫‪.‬استثناءً‪ ValueError‬الحظ أن استدعاء أي من طرق المولد أدناه عندما يكون المولد قيد التنفيذ بالفعل يثير‬

‫)(__‪generator.__next‬‬

‫بطريقة ما ‪ ،‬يتم تقييم تعبير)(__‪  __next‬يبدأ تنفيذ وظيفة المولد أو يستأنفها عند آخر تعبير ناتج تم تنفيذه‪ .‬عند استئناف وظيفة المولد‬
‫ويتم ‪ ، expression_list‬ثم يستمر التنفيذ إلى تعبير العائد التالي ‪ ،‬حيث يتم تعليق المولد مرة أخرى‪ None. ‬العائد الحالي دائمًا إلى‬
‫‪.‬فسيتم رفع استثناء‪ ، StopIteration ‬المتصل‪ ‬إلى‪ ‬المتصل‪ .‬إذا خرج المولد دون إعطاء قيمة أخرى)(__‪ __next‬إرجاع‪ ‬قيمة‬

‫‪.‬الوظيفة المضمنة)(‪ next‬حلقة ‪ ،‬أو عن طريق‪ for‬عادة ما تسمى هذه الطريقة ضمنيًا ‪ ،‬على سبيل المثال عن طريق‬

‫‪ ) ‬القيمة ‪generator.send( ‬‬

‫األسلوب بإرجاع القيمة )(‪ send‬يستأنف التنفيذ و "يرسل" قيمة إلى وظيفة المولد‪ .‬و‪ ‬قيمة‪ ‬حجة تصبح نتيجة للتعبير العائد الحالي‪ .‬و‬
‫يتم استدعاؤها لبدء )(‪ send‬إذا مخارج مولد دون الرضوخ قيمة أخرى‪ .‬عندما ‪ StopIteration‬التالية التي تجنى من المولد‪ ،‬أو يثير‬
‫‪.‬كوسيطة ‪ ،‬ألنه ال يوجد تعبير محصول يمكن أن يتلقى القيمة‪ None‬المولد ‪ ،‬يجب استدعائها‬

‫‪generator.throw( type  [ ، value  [ ، traceback  ] ] ) ‬‬

‫عند النقطة التي تم فيها إيقاف المولد مؤق ًتا ‪ ،‬وإرجاع القيمة التالية الناتجة عن وظيفة المولد‪ .‬إذا خرج ‪ type‬رفع استثناء من النوع‬
‫فسيتم رفع استثناء‪  .‬إذا لم تلتقط وظيفة المولد االستثناء الذي تم تمريره ‪ ،‬أو قامت‪ ، StopIteration L‬المولد دون إعطاء قيمة أخرى‬
‫‪.‬بإثارة استثناء مختلف ‪ ،‬فإن هذا االستثناء ينتشر إلى المستدعي‬

‫)(‪generator.close‬‬

‫النقطة التي توقفت عندها وظيفة المولد مؤق ًتا‪ .‬إذا خرجت وظيفة المولد بعد ذلك بأمان ‪ ،‬أو كانت مغلقة بالفعل‪ GeneratorExit‬يرفع‬
‫فإن العودة قريبة إلى المتصل بها‪ .‬إذا كان المولد ينتج ‪) ،‬من خالل عدم التقاط االستثناء(‪ ، GeneratorExit‬أو ترفع‬
‫ال يفعل شي ًئا إذا كان المولد قد)(‪. close‬إذا أثار المولد أي استثناء آخر ‪ ،‬فسيتم نشره إلى المتصل‪ a. ‬يتم رفع‪ ، RuntimeError‬قيمة‬
‫‪.‬خرج بالفعل بسبب استثناء أو خروج عادي‬

‫‪6.2.9.2. Examples‬‬

‫‪:‬فيما يلي مثال بسيط يوضح سلوك المولدات ووظائف المولدات‬

‫>>>‬

‫‪>>> def echo(value=None):‬‬

‫‪...‬‬ ‫)"‪print("Execution starts when 'next()' is called for the first time.‬‬

‫‪Pg. 71‬‬
‫‪...‬‬ ‫‪try:‬‬

‫‪...‬‬ ‫‪while True:‬‬

‫‪...‬‬ ‫‪try:‬‬

‫‪...‬‬ ‫)‪value = (yield value‬‬

‫‪...‬‬ ‫‪except Exception as e:‬‬

‫‪...‬‬ ‫‪value = e‬‬

‫‪...‬‬ ‫‪finally:‬‬

‫‪...‬‬ ‫)"‪print("Don't forget to clean up when 'close()' is called.‬‬

‫‪...‬‬

‫)‪>>> generator = echo(1‬‬

‫))‪>>> print(next(generator‬‬

‫‪Execution starts when 'next()' is called for the first time.‬‬

‫‪1‬‬

‫))‪>>> print(next(generator‬‬

‫‪None‬‬

‫))‪>>> print(generator.send(2‬‬

‫‪2‬‬

‫)"‪>>> generator.throw(TypeError, "spam‬‬

‫)‪TypeError('spam',‬‬

‫)(‪>>> generator.close‬‬

‫‪Don't forget to clean up when 'close()' is called.‬‬

‫‪ Python."yield from‬بناء الجملة للتفويض إلى مولد فرعي‪ ‬في "ما الجديد في ‪ PEP 380:‬للحصول على أمثلة الستخدام‪ ، ‬راجع‬

‫‪ ‬وظائف المولد غير المتزامن‪6.2.9.3. ‬‬

‫‪ .async def‬إن وجود تعبير العائد في دالة أو طريقة محددة باستخدام تعريف‪ ‬إضافي للوظيفة كوظيفة‪ ‬مولد غير متزامن‬

‫عندما يتم استدعاء وظيفة المولد غير المتزامن ‪ ،‬فإنها ُترجع مكررً ا غير متزامن يُعرف باسم كائن منشئ غير متزامن‪ .‬يتحكم هذا‬
‫بشكل مشابه ‪ coroutine‬الكائن بعد ذلك في تنفيذ وظيفة المولد‪ .‬عاد ًة ما يتم استخدام كائن منشئ غير متزامن في‪ ‬عبارة في دالة‬
‫‪.async forfor‬لكيفية استخدام كائن منشئ في‪ ‬بيان‬

‫يؤدي استدعاء إحدى طرق المولد غير المتزامن إلى إرجاع‪ ‬كائن‪ ‬منتظر‪ ، ‬ويبدأ التنفيذ عندما يكون هذا الكائن قيد‪ ‬االنتظار‪ . ‬في ذلك‬
‫إلى الكوروتين المنتظر‪ expression_list.‬الوقت ‪ ،‬ينتقل التنفيذ إلى تعبير العائد األول ‪ ،‬حيث يتم تعليقه مرة أخرى ‪ ،‬مع إعادة قيمة‬
‫‪  ‬كما هو الحال مع المولد ‪ ،‬يعني التعليق أنه يتم االحتفاظ بجميع الحاالت المحلية ‪ ،‬بما في ذلك االرتباطات الحالية للمتغيرات‬
‫المحلية ‪ ،‬ومؤشر التعليمات ‪ ،‬ومكدس التقييم الداخلي ‪ ،‬وحالة أي معالجة‪ L‬استثناء‪ .‬عندما يتم استئناف التنفيذ عن طريق انتظار الكائن‬
‫التالي الذي يتم إرجاعه بواسطة طرق المولد غير المتزامن ‪ ،‬يمكن للوظيفة المضي قدمًا تمامًا كما لو كان تعبير العائد مجرد مكالمة‬
‫تم استخدام )(__‪ __anext‬خارجية أخرى‪  .‬تعتمد قيمة تعبير العائد بعد االستئناف على الطريقة التي استأنفت التنفيذ‪ .‬إذا‬
‫‪.‬تم استخدامه ‪ ،‬فستكون النتيجة هي القيمة التي تم تمريرها إلى تلك الطريقة)(‪ asend‬خالف ذلك ‪ ،‬إذا‪ None. ‬النتيجة‬

‫‪Pg. 72‬‬
‫أو تم إلغاء مهمة المتصل ‪ ،‬أو استثناءات أخرى ‪ ،‬فسيتم تشغيل رمز التنظيف ‪ break،‬إذا حدث خروج مُنشئ غير متزامن مبكرً ا‬
‫غير المتزامن للمولد وربما يزيد من االستثناءات أو متغيرات سياق الوصول في سياق غير متوقع ‪ -‬ربما بعد عمر المهام الذي يعتمد‬
‫عليه ‪ ،‬أو أثناء إيقاف تشغيل حلقة الحدث عند استدعاء خطاف جمع القمامة غير المتزامن‪ .‬لمنع ذلك ‪ ،‬يجب على المتصل إغالق‬
‫ً‬
‫صراحة عن طريق استدعاء‬ ‫‪.‬الطريقة إلنهاء المولد وفصله في النهاية عن حلقة الحدث)(‪ aclose‬المولد غير المتزامن‬

‫اإلنشاء‪  .‬ومع ذلك ‪ ،‬إذا لم يتم استئناف المولد غير ‪ try‬في وظيفة المولد غير المتزامن ‪ ،‬يُسمح بتعبيرات العائد في أي مكان في‬
‫المتزامن قبل االنتهاء منه (من خالل الوصول إلى عدد مرجعي صفري أو عن طريق جمع البيانات المهملة) ‪ ،‬فقد يؤدي تعبير العائد‬
‫الجمل‪ ‬المعلقة‪  . ‬في هذه الحالة ‪ ،‬تقع على عاتق حلقة الحدث أو المجدول الذي يقوم بتشغيل ‪ finally ‬إلى فشل في تنفيذ‪ try ‬داخل بنية‬
‫بتنفيذ‪ ‬أي‪ finally ‬الناتج ‪ ،‬مما يسمح ‪ coroutine‬وتشغيل كائن)(‪ aclose‬المولد غير المتزامن الستدعاء طريقة المولد غير المتزامن‬
‫‪  .‬فقرات‪ ‬معلقة‬

‫التي تأخذ مولد تكرار غير متزامن ويفترض أن‪ finalizer ‬لرعاية اإلنهاء عند إنهاء حلقة الحدث ‪ ،‬يجب أن تحدد حلقة الحدث‪ ‬وظيفة‬
‫عند‪ sys.set_asyncgen_hooks(). ‬قد يتم تسجيل‪ ‬هذا‪ ‬المصير النهائي‪ ‬عن طريق االتصال‪ coroutine. ‬وتنفذ)(‪ aclose‬تستدعي‬
‫التكرار ألول مرة ‪ ،‬سيقوم المولد غير المتزامن بتخزين المصير‪ ‬النهائي‪ ‬المسجل‪ ‬ليتم استدعاؤه عند اإلنهاء‪ .‬للحصول على مثال‬
‫‪ Lib / asyncio / base_events.py .‬في‪ asyncio.Loop.shutdown_asyncgens‬راجع التنفيذ‪ finalizer ، ‬مرجعي‪ ‬لطريقة‬

‫>‪.yield from <expr‬التعبير‪ ‬عبارة عن خطأ نحوي عند استخدامه في وظيفة منشئ غير متزامن‬

‫‪ ‬طرق المولد غير المتزامن‪6.2.9.4. ‬‬

‫‪.‬يصف هذا القسم الفرعي طرق مولد المولد غير المتزامن ‪ ،‬والتي ُتستخدم للتحكم في تنفيذ وظيفة المولد‬

‫‪ agen.__anext__( ) ‬كوروتين‬

‫إرجاع أمر منتظر والذي عند بدء التشغيل لتنفيذ المولد غير المتزامن أو استئنافه عند آخر تعبير ناتج تم تنفيذه‪ .‬عندما يتم استئناف‬
‫في المنتظر المرتجع ‪ ،‬والذي عند ‪ None‬بأسلوب ما ‪ ،‬يتم تقييم تعبير العائد الحالي دائمًا‪ __anext__() ‬وظيفة المولد غير المتزامن‬
‫االستثناء المرفوعة بواسطة‪ StopIteration‬تعبير العائد هي قيمة‪ expression_list‬التشغيل سيستمر إلى تعبير العائد التالي‪ .‬قيمة‬
‫المكتمل‪  .‬إذا خرج المولد غير المتزامن دون إعطاء قيمة أخرى ‪ ،‬فإن المنتظر بدالً من ذلك ‪coroutine‬‬
‫‪.‬استثناء ‪ ،‬مما يشير إلى أن التكرار غير المتزامن قد اكتمل‪ StopAsyncIteration‬يثير‬

‫‪.async for‬عادة ما يتم استدعاء هذه الطريقة ضمنيًا بواسطة‪ ‬حلقة‬

‫‪ ) ‬القيمة ‪ agen.asend( ‬كوروتين‬

‫طريقة المولد ‪ ،‬فإن هذا "يرسل")(‪  send‬إرجاع أمر منتظر والذي عند التشغيل يستأنف تنفيذ المولد غير المتزامن‪ .‬كما هو الحال مع‬
‫قيمة إلى وظيفة المولد غير المتزامن ‪ ،‬وتصبح وسيطة‪ ‬القيمة‪ ‬نتيجة تعبير العائد الحالي‪ .‬سيعيد المولد المنتظر الذي يتم إرجاعه‬
‫إذا ‪ StopAsyncIteration‬أو يرتفع ‪ StopIteration،‬الطريقة القيمة التالية التي‪ ‬ينتجها‪ ‬المولد كقيمة مرفوعة)(‪ asend‬بواسطة‬
‫يتم استدعاؤها لبدء المولد غير المتزامن ‪ ،‬يجب )(‪ asend‬خرج المولد غير المتزامن دون إعطاء قيمة أخرى‪ .‬عندما‬
‫‪.‬كوسيطة ‪ ،‬ألنه ال يوجد تعبير محصول يمكنه تلقي القيمة‪ None‬استدعائها‬

‫‪ ) ‬النوع‪ ، [  ‬القيمة‪ ، [  ‬التتبع‪ agen.athrow( ] ]  ‬كوروتين‬

‫عند النقطة التي تم فيها إيقاف المولد غير المتزامن مؤق ًتا ‪ ،‬ويعيد القيمة التالية‪ ‬الناتجة عن‪ type‬يُرجع أمرً ا منتظرً ا يثير استثنا ًء للنوع‬
‫خرج‪ ‬المولد غير المتزامن دون إعطاء قيمة ‪ StopAsyncIteration‬إذا‪ StopIteration. ‬وظيفة المولد كقيمة االستثناء المرتفع‬
‫أخرى ‪ ،‬فسيتم رفع استثناء بواسطة المنتظر‪  .‬إذا لم تلتقط وظيفة المولد االستثناء الذي تم تمريره ‪ ،‬أو أثارت استثناءًا مختل ًفا ‪ ،‬فعند‬
‫‪.‬تشغيل المنتظر ينتشر هذا االستثناء إلى المتصل المنتظر‬

‫‪ agen.aclose( ) ‬كوروتين‬

‫في وظيفة المولد غير المتزامن عند النقطة التي تم إيقافها‪ L‬فيها ‪ a GeneratorExit‬يُرجع أمرً ا منتظرً ا عندما يؤدي التشغيل إلى إلقاء‬
‫من خالل عدم اصطياد (‪ GeneratorExit‬مؤق ًتا‪  .‬إذا خرجت وظيفة المولد غير المتزامن بأمان ‪ ،‬أو كانت مغلقة بالفعل ‪ ،‬أو ترفع‬
‫استثناءً‪ .‬أي طلبات انتظار أخرى يتم إرجاعها من خالل ‪ StopIteration‬فإن الوظيفة المنتظرة المرتجعة ستثير ‪) ،‬االستثناء‬
‫أعطى‪ ‬المولد غير المتزامن ‪ RuntimeError‬استثناءً‪ .‬إذا‪ StopAsyncIteration‬االستدعاءات الالحقة للمولد غير المتزامن ستثير‬
‫بواسطة المنتظر‪  .‬إذا أثار المولد غير المتزامن أي استثناء آخر ‪ ،‬فسيتم نشره للمستدعي المنتظر‪ .‬إذا كان المولد ‪ a ‬قيمة ‪ ،‬يتم رفع‬
‫‪.‬ستعيد انتظارً ا ال يفعل شي ًئا)(‪ aclose‬غير المتزامن قد خرج بالفعل بسبب استثناء أو خروج عادي ‪ ،‬فإن المكالمات األخرى إلى‬

‫‪Pg. 73‬‬
‫‪6.3. Primaries‬‬

‫‪:‬تمثل االنتخابات التمهيدية أكثر عمليات اللغة تقيي ًدا بإحكام‪ .‬تركيبها هو‬

‫‪ :: = atom| attributeref| subscription| slicing|call‬أساسي‬

‫‪ ‬مراجع السمات‪6.3.1. ‬‬

‫‪:‬مرجع السمة هو مرجع أساسي متبوع بنقطة واسم‬

‫‪attributeref :: = primary"."identifier‬‬

‫يجب أن يتم تقييم األساسي إلى كائن من نوع يدعم مراجع السمات ‪ ،‬وهو ما تفعله معظم الكائنات‪ .‬ثم يُطلب من هذا الكائن إنتاج‬
‫الطريقة‪ .‬إذا لم تكن هذه السمة )(__‪ __getattr‬السمة التي يكون اسمها هو المعرف‪ .‬يمكن تخصيص هذا اإلنتاج من خالل تجاوز‬
‫خالف ذلك ‪ ،‬يتم تحديد نوع الكائن وقيمته بواسطة الكائن‪ .‬قد تؤدي التقييمات المتعددة ‪ AttributeError. ‬متاحة ‪ ،‬يظهر االستثناء‬
‫‪.‬لنفس مرجع السمة إلى كائنات مختلفة‬

‫‪6.3.2. Subscriptions‬‬

‫‪:‬عاد ًة ما يؤدي االشتراك في تسلسل (سلسلة أو مجموعة أو قائمة) أو كائن تعيين (قاموس) إلى تحديد عنصر من المجموعة‬

‫"]"‪ :: = primary"[" expression_list‬االشتراك‬

‫يجب أن يتم تقييم األساسي إلى كائن يدعم االشتراك (قوائم أو قواميس على سبيل المثال)‪ .‬يمكن أن تدعم الكائنات المعرفة من قبل‬
‫‪.‬طريقة)(__‪ __getitem‬المستخدم االشتراك عن طريق تحديد‬

‫‪:‬بالنسبة للكائنات المضمنة ‪ ،‬هناك نوعان من العناصر التي تدعم االشتراك‬

‫إذا كان األساسي عبارة عن تعيين ‪ ،‬فيجب أن تقيّم قائمة التعبيرات كائ ًن ا تكون قيمته أحد مفاتيح التعيين ‪ ،‬ويحدد االشتراك القيمة في‬
‫التعيين التي تتوافق مع هذا المفتاح‪(  .‬قائمة التعبيرات عبارة عن مجموعة إال إذا كانت تحتوي على عنصر واحد بالضبط‪).‬‬

‫‪.‬إذا كان األساسي عبارة عن تسلسل ‪ ،‬فيجب تقييم قائمة التعبيرات إلى عدد صحيح أو شريحة (كما تمت مناقشته في القسم التالي)‬

‫ال تنص الصيغة الرسمية على أي حكم خاص للمؤشرات السلبية في المتتاليات ؛‪ ‬ومع ذلك ‪ ،‬فإن جميع التسلسالت المضمنة‬
‫يحدد العنصر ]‪ x[-1‬بحيث( طريقة تفسر المؤشرات السالبة عن طريق إضافة طول التسلسل إلى الفهرس‪ __getitem__() ‬توفر‬
‫عددا صحيحً ا غير سالب أقل من عدد العناصر في التسلسل ‪ ،‬ويحدد االشتراك العنصر ‪ x). ‬األخير من‬‫يجب أن تكون القيمة الناتجة ً‬
‫طريقة‪ ‬ال )(__‪ __getitem‬الذي يكون فهرسه هو تلك القيمة (العد من الصفر)‪ .‬نظرً ا ألن دعم المؤشرات السلبية والتقطيع يحدث في‬
‫‪.‬كائن‪ ،  ‬فإن الفئات الفرعية التي تتجاوز هذه الطريقة ستحتاج إلى إضافة هذا الدعم بشكل صريح‬

‫‪.‬عناصر السلسلة هي أحرف‪  .‬الحرف ليس نوع بيانات منفصل ولكنه سلسلة من حرف واحد بالضبط‬

‫يؤدي االشتراك في‪ ‬فئات‪ ‬أو‪ ‬أنواع‪ ‬معينة إلى‪ ‬إنشاء‪ ‬اسم مستعار عام‪ . ‬في هذه الحالة ‪ ،‬يمكن للفئات المعرفة من قبل المستخدم‪ L‬دعم‬
‫‪.‬الفصل)(__‪ __class_getitem‬االشتراك من خالل توفير أسلوب‬

‫‪6.3.3. Slicings‬‬

‫يحدد التقطيع مجموعة من العناصر في كائن تسلسل (على سبيل المثال ‪ ،‬سلسلة أو مجموعة أو قائمة)‪ .‬يمكن استخدام الشرائح‬
‫‪:‬العبارات‪ .‬بناء الجملة للتقطيع‪ del‬كتعبيرات أو كأهداف في التعيين أو‬

‫تشريح‬ ‫"]"‪:: = primary"[" slice_list‬‬

‫]"‪slice_list :: = slice_item("،" slice_item) * ["،‬‬

‫‪slice_item :: = expression|proper_slice‬‬

‫]]‪Proper_slice :: = [ lower_bound] ":" [ upper_bound] [":" [ stride‬‬

‫‪Lower_bound :: = expression‬‬

‫‪Pg. 74‬‬
‫‪top_bound :: = expression‬‬

‫خطوة‬ ‫‪:: = expression‬‬

‫يوجد غموض في البنية الرسمية هنا‪ :‬أي شيء يشبه قائمة التعبير يبدو أيضً ا كقائمة شرائح ‪ ،‬لذلك يمكن تفسير أي اشتراك على أنه‬
‫تقسيم‪ .‬بدالً من زيادة تعقيد البنية ‪ ،‬يتم توضيح ذلك من خالل تحديد أنه في هذه الحالة ‪ ،‬يكون للتفسير كاشتراك أولوية على التفسير‬
‫‪.‬كتقسيم (هذا هو الحال إذا كانت قائمة‪ L‬الشرائح ال تحتوي على شريحة مناسبة)‬

‫بمفتاح تم إنشاؤه من قائمة )طريقة االشتراك العادي)(__‪ __getitem‬باستخدام نفس( دالالت التقطيع هي كما يلي‪ .‬األساسي مفهرس‬
‫الشرائح ‪ ،‬على النحو التالي‪  .‬إذا كانت قائمة الشرائح تحتوي على فاصلة واحدة على األقل ‪ ،‬فإن المفتاح هو مجموعة تحتوي على‬
‫تحويل عناصر الشرائح ؛‪ ‬خالف ذلك ‪ ،‬فإن تحويل عنصر الشريحة المنفردة هو المفتاح‪ .‬إن تحويل عنصر شريحة يمثل تعبيرً ا هو‬
‫سمات ‪ step‬و‪ start، stop‬هذا التعبير‪  .‬تحويل شريحة المناسبة هو كائن شريحة (انظر القسم‪ ‬نوع التسلسل الهرمي القياسية‪ ) ‬التي‬
‫‪.‬عن التعبيرات في عداد المفقودين‪ None‬هي قيم تعبيرات معينة كنسبة ملزمة أقل‪ ،‬الحد األعلى واسعة‪ ،‬على التوالي‪ ،‬واالستعاضة‬

‫‪6.3.4. Calls‬‬

‫‪ :‬استدعاء يستدعي كائ ًنا قابالً لالستدعاء (على سبيل المثال ‪ ،‬دالة‪ ) ‬مع سلسلة من‪ ‬الوسائط‪ ‬ربما تكون فارغة‬

‫استدعاء‬ ‫")" ]‪:: = primary"(" [ argument_list["،"] | comprehension‬‬

‫‪arguments_list‬‬ ‫]‪:: = positional_arguments["،" starred_and_keywords‬‬

‫]‪["،" keywords_arguments‬‬

‫]‪| starred_and_keywords["،" keywords_arguments‬‬

‫‪| keywords_arguments‬‬

‫* )‪positional_arguments :: = positional_item ("،" positional_item‬‬

‫‪positional_item‬‬ ‫‪:: = assignment_expression| "*"expression‬‬

‫)‪starred_and_keywords :: = ("*" expression| keyword_item‬‬

‫* )‪("،" "*" expression| "،" keyword_item‬‬

‫)‪Keywords_arguments :: = ( keyword_item| "**" expression‬‬

‫* )‪("،" keyword_item| "،" "**" expression‬‬

‫‪keyword_item‬‬ ‫‪:: = identifier"="expression‬‬

‫‪.‬قد توجد فاصلة الحقة اختيارية بعد الوسائط الموضعية والكلمات‪ L‬األساسية ولكنها ال تؤثر على الدالالت‬

‫الوظائف المعرفة من قبل المستخدم ‪ ،‬والوظائف المضمنة ‪ ،‬وطرق الكائنات ( يجب أن يتم تقييم األساسي إلى كائن قابل لالستدعاء‬
‫يتم تقييم ‪). ‬طريقة قابلة لالستدعاء)(__‪ __call‬المضمنة ‪ ،‬وكائنات الفئة ‪ ،‬وطرق مثيالت الفئة ‪ ،‬وجميع الكائنات التي تحتوي على‬
‫كافة التعبيرات الوسيطة قبل محاولة االستدعاء‪ .‬يرجى الرجوع إلى قسم‪ ‬تعريفات الوظائف‪ ‬للحصول على‬
‫‪ .‬صياغة‪ ‬قوائم‪ ‬المعلمات‪ ‬الرسمية‬

‫في حالة وجود وسيطات الكلمات األساسية ‪ ،‬يتم تحويلها أوالً إلى وسيطات موضعية ‪ ،‬على النحو التالي‪ .‬أوالً ‪ ،‬يتم إنشاء قائمة‬
‫األولى‪ .‬بعد ‪ N‬يتم وضعها في الخانات ‪ N ،‬بالفواصل الزمنية غير المملوءة للمعلمات‪ L‬الرسمية‪ .‬إذا كانت هناك وسيطات موضعية‬
‫ذلك ‪ ،‬بالنسبة لكل وسيطة كلمة رئيسية ‪ ،‬يتم استخدام المعرف لتحديد الفتحة المقابلة (إذا كان المعرف هو نفسه اسم المعلمة الرسمية‬
‫استثناء‪ .‬خالف ذلك ‪ ،‬يتم وضع ‪ TypeError‬األولى ‪ ،‬فسيتم استخدام الفتحة األولى ‪ ،‬وهكذا)‪ .‬إذا كانت الفتحة ممتلئة بالفعل ‪ ،‬يظهر‬
‫عندما تتم معالجة جميع الوسائط ‪ ،‬يتم ملء الفواصل ‪). ‬تمأل الفتحة ‪ None،‬حتى لو كان التعبير( قيمة الوسيطة في الفتحة ‪ ،‬وتعبئتها‬
‫الزمنية التي ال تزال شاغرة بالقيمة االفتراضية المقابلة من تعريف الوظيفة‪( .‬يتم حساب‪ L‬القيم االفتراضية ‪ ،‬مرة واحدة ‪ ،‬عند تحديد‬
‫الوظيفة ؛ وبالتالي ‪ ،‬ستتم مشاركة كائن قابل للتغيير مثل القائمة أو القاموس المستخدم كقيمة افتراضية بواسطة جميع االستدعاءات‬

‫‪Pg. 75‬‬
‫التي ال تحدد قيمة وسيطة للفتحة المقابلة ؛ هذا يجب عاد ًة ما يتم تجنبه‪ ).‬إذا كانت هناك أية خانات زمنية غير مملوءة لم يتم تحديد‬
‫‪.‬استثناء‪ .‬خالف ذلك ‪ ،‬يتم استخدام قائمة الفتحات المملوءة كقائمة وسيطة للمكالمة‪ TypeErrorL‬قيمة افتراضية لها ‪ ،‬فسيتم إصدار‬

‫قد يوفر التنفيذ وظائف مضمنة ال تحتوي معلماتها‪ L‬الموضعية على أسماء ‪ ،‬حتى لو تم تسميتها لغرض ‪ CPython: ‬تفاصيل تنفيذ‬
‫والتي ‪ C‬هذا هو الحال بالنسبة للوظائف المنفذة في ‪ CPython ،‬التوثيق ‪ ،‬وبالتالي ال يمكن توفيرها بواسطة الكلمات‪ L‬الرئيسية‪ .‬في‬
‫‪.‬لتحليل وسيطاتها)(‪ PyArg_ParseTuple‬تستخدم‬

‫استثناء ‪ ،‬ما لم ‪ TypeError‬إذا كان هناك وسيطات موضعية أكثر من تلك الموجودة في خانات المعلمات الرسمية ‪ ،‬فسيتم إصدار‬
‫؛‪ ‬في هذه الحالة ‪ ،‬يتلقى هذا المعامل الرسمي مجموعة تحتوي على الوسائط ‪ *identifier‬يكن هناك معلمة رسمية تستخدم الصيغة‬
‫‪.‬الموضعية الزائدة (أو مجموعة فارغة إذا لم تكن هناك وسيطات موضعية زائدة)‬

‫فسيتم‪ ‬إصدار‪ ‬استثناء ‪ ،‬ما لم يكن هناك معلمة ‪ ، TypeError‬إذا كانت أي وسيطة كلمة أساسية ال تتوافق مع اسم معلمة رسمي‬
‫؛‪ ‬في هذه الحالة ‪ ،‬تتلقى هذه المعلمة الرسمية قامو ًسا يحتوي على وسيطات الكلمات ‪ **identifier‬رسمية تستخدم بناء الجملة‬
‫الرئيسية الزائدة (باستخدام الكلمات األساسية كمفاتيح وقيم الوسيطة كقيم مقابلة) ‪ ،‬أو قاموس فارغ (جديد) إذا لم يكن هناك وسيطات‬
‫‪.‬أساسية زائدة‬

‫فيجب تقييمه إلى صيغة قابلة‪ ‬للتكرار‪ . ‬يتم التعامل مع ‪ ، expression‬ظهر‪ ‬بناء الجملة‪ ‬في استدعاء الوظيفة‪ *expression‬إذا‬
‫‪ y1 ، ...‬إلى تسلسل‪ y ‬العناصر من هذه العناصر المتكررة كما لو كانت حجج موضعية إضافية‪ .‬بالنسبة للمكالمة‪ ، ‬إذا تم‪ ‬تقييم‬
‫)‪ x1 ، x2 ، y1 ، ... ، yM ، x3 ، x4 .f(x1, x2, *y, x3, x4‬وسيطات‪ ‬موضعية ‪ M + 4‬فهذا يعادل استدعاء مع ‪، yM ،‬‬

‫بناء الجملة قد يظهر‪ ‬بعد‪  ‬وسيطات الكلمات الرئيسية الواضحة ‪ ،‬إال أنه تتم ‪ *expression‬والنتيجة هي أنه على الرغم من أن‬
‫‪:‬وبالتالي‪). ‬وسيطات ‪ -‬انظر أدناه‪ **expression‬وأي( معالجتها‪ L‬قبل‪ ‬وسيطات الكلمات‪ L‬الرئيسية‬

‫>>>‬

‫‪>>> def f(a, b):‬‬

‫‪...‬‬ ‫)‪print(a, b‬‬

‫‪...‬‬

‫))‪>>> f(b=1, *(2,‬‬

‫‪21‬‬

‫))‪>>> f(a=1, *(2,‬‬

‫‪Traceback (most recent call last):‬‬

‫>‪File "<stdin>", line 1, in <module‬‬

‫'‪TypeError: f() got multiple values for keyword argument 'a‬‬

‫))‪>>> f(1, *(2,‬‬

‫‪12‬‬

‫الجملة في نفس المكالمة ‪ ،‬لذلك ال ينشأ هذا االلتباس‪ *expression‬من غير المعتاد استخدام كل من وسيطات الكلمات الرئيسية وبناء‬
‫‪.‬عمليًا‬

‫فيجب تقييم‪ ‬التعيين‪ ، ‬حيث يتم التعامل مع محتوياته ‪ ، expression‬ظهر‪ ‬بناء الجملة‪ ‬في استدعاء الوظيفة‪ **expression‬إذا‬
‫كوسائط إضافية للكلمات‪ L‬األساسية‪  .‬إذا كانت الكلمة األساسية موجودة بالفعل (كوسيطة صريحة للكلمة الرئيسية ‪ ،‬أو من عملية تفريغ‬
‫‪.‬استثناء‪ TypeError‬أخرى) ‪ ،‬فسيتم طرح‬

‫ال يمكن استخدامها كخانات وسيطة موضعية أو كأسماء ‪ **identifier‬أو‪ *identifier‬تستخدم المعلمات الرسمية بناء الجملة‬
‫‪.‬وسيطات كلمات رئيسية‬

‫‪Pg. 76‬‬
‫‪ unpackings‬قد الحجج الموضعية متابعة ‪ **unpackings،‬تغير في اإلصدار ‪ :3.5‬المكالمات وظيفة تقبل أي عدد من‪* ‬و‬
‫‪ .‬القاموس (‪ .)** ‬تم اقتراحه في األصل بواسطة‪ unpackings 448‬والحجج الكلمة قد اتبع ‪iterable ( *)،‬‬

‫ما لم تثير استثناءً‪  .‬تعتمد كيفية حساب هذه القيمة على نوع الكائن القابل ‪ None،‬تقوم المكالمة‪ L‬دائمًا بإرجاع بعض القيمة ‪ ،‬ربما‬
‫‪.‬لالستدعاء‬

‫‪-‬اذا كانت‬

‫‪:‬وظيفة محددة من قبل المستخدم‬

‫يتم تنفيذ كتلة التعليمات البرمجية للوظيفة ‪ ،‬وتمريرها إلى قائمة الوسائط‪ .‬أول شيء ستفعله كتلة الكود هو ربط المعلمات‪ L‬الرسمية‬
‫عبارة ‪ ،‬فإن هذا يحدد قيمة ‪ return‬بالوسيطات ؛‪ ‬هذا موضح في قسم‪ ‬تعريفات الوظائف‪ . ‬عندما تقوم كتلة التعليمات البرمجية بتنفيذ‬
‫‪.‬اإلرجاع الستدعاء الوظيفة‬

‫‪:‬وظيفة أو طريقة مضمنة‬

‫‪.‬والنتيجة متروكة للمترجم ؛‪ ‬انظر‪ ‬الوظائف‪ ‬المضمنة لوصف الوظائف والطرق المضمنة‬

‫‪:‬كائن فئة‬

‫‪.‬يتم إرجاع مثيل جديد من تلك الفئة‬

‫‪:‬طريقة مثيل الفئة‬

‫يتم استدعاء الوظيفة المقابلة المعرفة من قبل المستخدم ‪ ،‬مع قائمة وسيطات أطول من قائمة وسيطات االستدعاء‪ :‬المثيل يصبح‬
‫‪.‬الوسيطة األولى‬

‫‪:‬مثيل فئة‬

‫‪.‬طريقة ؛‪ ‬التأثير هو نفسه كما لو تم استدعاء هذه الطريقة)(__‪ __call‬يجب أن يحدد الفصل‬

‫‪ ‬انتظر التعبير‪6.4. ‬‬

‫‪ coroutine .‬على‪ ‬كائن‪ ‬منتظر‪ . ‬ال يمكن استخدامها إال داخل‪ ‬وظيفة‪ coroutine ‬تعليق تنفيذ‬

‫‪"primary‬انتظار" = ‪await_expr ::‬‬

‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫‪ ‬مشغل الطاقة‪6.5. ‬‬

‫المشغل ذو القدرة يربط بقوة أكبر من المشغلين األحاديين على يساره ؛‪ ‬يرتبط بشكل أقل إحكا ًما‪ L‬من المشغلين األحاديين على‬
‫‪:‬يمينه‪ .‬الصيغة هي‬

‫]‪ :: = ( await_expr| primary) ["**" u_expr‬الطاقة‬

‫وبالتالي ‪ ،‬في تسلسل غير محصور للقوة والمشغلين األحاديين ‪ ،‬يتم تقييم المشغلين من اليمين إلى اليسار (هذا ال يقيد ترتيب تقييم‬
‫‪.‬المعامالت)‪2**1- :‬ينتج عنه‪1- ‬‬

‫الوظيفة المضمنة ‪ ،‬عندما يتم استدعاؤه بواسطة وسيطين‪ :‬إنه يعطي حجته اليسرى مرفوعة إلى )(‪ pow‬عامل القوة له نفس دالالت‬
‫‪.‬قوة حجته اليمنى‪ .‬يتم تحويل الوسائط الرقمية أوالً إلى نوع شائع ‪ ،‬وتكون النتيجة من هذا النوع‬

‫يكون للنتيجة نفس نوع المعامالت‪ L‬ما لم تكن الوسيطة الثانية سالبة ؛‪ ‬في هذه الحالة ‪ ،‬يتم تحويل جميع ‪ int ،‬بالنسبة لمعامالت‪L‬‬
‫‪.‬الوسائط إلى عدد عشري ويتم تسليم نتيجة عائمة‪ .‬على سبيل المثال ‪2**10 ،‬يعود‪ ،100 ‬لكنه‪2-**10 ‬يعود‪0.01 ‬‬

‫في (‪. ‬عدد‪ complex ‬ينتج عن رفع رقم سالب إلى قوة كسرية‪ ZeroDivisionError. ‬رفع‪0.0 ‬إلى قوة سالبة يؤدي إلى أ‬
‫)‪ ValueError.‬اإلصدارات السابقة أثار أ‬

‫‪ .‬الطريقة‪ ‬الخاصة )(__‪ __pow‬يمكن تخصيص هذه العملية باستخدام‬

‫‪Pg. 77‬‬
‫‪ ‬العمليات الحسابية األحادية والعمليات األحادية‪6.6. ‬‬

‫‪:‬جميع العمليات الحسابية األحادية والعمليات الحسابية األحادية لها نفس األولوية‬

‫‪u_expr :: = power| "-" u_expr| "+" u_expr| "~"u_expr‬‬

‫‪.‬بالطريقة الخاصة)(__‪ __neg‬ينتج عن عامل التشغيل‪ ‬أحادي‪( ‬ناقص) نفي الوسيطة الرقمية الخاصة به ؛‪ ‬يمكن تجاوز العملية‪-‬‬

‫‪.‬بالطريقة الخاصة)(__‪ __pos‬ينتج عامل التشغيل‪ ‬أحادي‪( ‬زائد) الوسيطة الرقمية الخاصة به دون تغيير ؛‪ ‬يمكن تجاوز العملية‪+‬‬

‫إنه ينطبق ‪ -(x+1). ‬يتم تعريف‪ ‬انعكاس‪ L‬البت‪ ‬على أنه‪. x‬ينتج عن العامل‪ ‬األحادي‪( ‬المقلوب) انعكاس‪ L‬البت في وسيطته الصحيحة~‬
‫‪.‬الطريقة الخاصة)(__‪ __invert‬فقط على األرقام المتكاملة أو على الكائنات المخصصة التي تتجاوز‬

‫‪.‬فسيتم طرح استثناء‪ ، TypeError‬في جميع الحاالت الثالث ‪ ،‬إذا كانت الوسيطة ال تحتوي على النوع المناسب‬

‫‪ ‬عمليات حسابية ثنائية‪6.7 ‬‬


‫العمليات الحسابية الثنائية لها مستويات األولوية التقليدية‪ .‬الحظ أن بعض هذه العمليات تنطبق أي ً‬
‫ضا على أنواع معينة غير‬
‫‪:‬رقمية‪  .‬بصرف النظر عن مشغل القدرة ‪ ،‬يوجد مستويان فقط ‪ ،‬أحدهما لمشغلي الضرب واآلخر لمشغلي اإلضافات‪L‬‬

‫|‪m_expr :: = u_expr| m_expr"*" u_expr| m_expr"@" m_expr‬‬

‫|‪m_expr"//" u_expr| m_expr"/" u_expr‬‬

‫‪m_expr"٪"u_expr‬‬

‫‪a_expr :: = m_expr| a_expr"+" m_expr| a_expr"-"m_expr‬‬


‫و‪(* ‬الضرب) عامل ينتج نتاج حججها‪ .‬يجب أن تكون الوسيطات إما أرقامًا ‪ ،‬أو يجب أن تكون إحدى الوسيطة ً‬
‫عددا صحيحً ا‬
‫واألخرى يجب أن تكون سلسلة‪  .‬في الحالة األولى ‪ ،‬يتم تحويل األرقام إلى نوع شائع ثم يتم ضربها معًا‪ .‬في الحالة األخيرة ‪ ،‬يتم‬
‫‪.‬إجراء تكرار التسلسل ؛‪ ‬ينتج عن عامل التكرار السلبي تسلسل فارغ‬

‫‪.‬األساليب)(__‪ __rmul‬و)(__‪ __mul‬هذه العملية يمكن أن تكون مخصصة باستخدام الخاصة‬

‫‪.‬الستخدامه في ضرب المصفوفة‪ .‬ال توجد أنواع بايثون مضمنة تقوم بتنفيذ هذا المشغل )‪ (at‬تم تصميم‪@ ‬عامل التشغيل‬

‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫و‪(/ ‬تقسيم) و‪(// ‬تقسيم الكلمة) مشغلي تسفر حاصل حججهم‪ .‬يتم أوالً تحويل الوسيطات الرقمية إلى نوع شائع‪ .‬ينتج عن تقسيم‬
‫عددا عشريًا ‪ ،‬بينما ينتج عن تقسيم األعداد الصحيحة عد ًدا صحيحً ا ؛‪ ‬والنتيجة هي القسمة الرياضية مع تطبيق‬
‫األعداد الصحيحة ً‬
‫‪.‬االستثناء‪ ZeroDivisionError ‬وظيفة "األرضية" على النتيجة‪ .‬القسمة على الصفر تثير‬

‫‪.‬األساليب)(__‪ __floordiv‬و)(__‪ __truediv‬هذه العملية يمكن أن تكون مخصصة باستخدام الخاصة‬

‫و‪(%  ‬مودولو) عامل ينتج ما تبقى من تقسيم الحجة األولى والثانية‪ .‬يتم أوالً تحويل الوسيطات الرقمية إلى نوع شائع‪ .‬حجة الصفر‬
‫االستثناء‪ .‬قد تكون الوسيطات عبارة عن أرقام فاصلة عائمة ‪ ،‬على سبيل المثال ‪ ZeroDivisionError%3.14 ،‬الصحيح تثير‬
‫دائمًا نتيجة بنفس عالمة المعامل الثاني (أو صفر) ؛‪ ‬القيمة ‪0.7 modulo‬يساوي‪( 0.34 ‬بما أن‪3.14 ‬يساوي‪ ). ‬ينتج عن عامل‬
‫المطلقة للنتيجة أصغر تمامًا من القيمة المطلقة للمعامل الثاني‪0.34 + 0.7*4. 1 ‬‬
‫يتم توصيل مشغلي تقسيم األرض ومودولو من هوية التالية‪ . :‬ترتبط تقسيم األرض ومودولو أيضا مع وظيفة المدمج‬
‫)‪ .x == (x//y)*y + (x%y)divmod()divmod(x, y) == (x//y, x%y‬في‪2 . : ‬‬

‫على األرقام ‪ ،‬فإن‪% ‬المشغل مثقل أي ً‬


‫ضا بكائنات السلسلة ألداء تنسيق السلسلة القديمة ‪ modulo‬باإلضافة إلى إجراء عملية‬
‫‪ printf .‬قسم‪ ‬تنسيق السلسلة بنمط ‪( Python ،‬المعروف أيضً ا باسم االستيفاء)‪ .‬تم وصف صيغة تنسيق السلسلة في مرجع مكتبة‬

‫‪.‬األسلوب)(__‪ __mod‬و‪ ‬مودولو‪ ‬العملية يمكن أن تكون مخصصة باستخدام خاص‬

‫والوظيفة لألرقام المركبة‪ .‬بدالً من ذلك ‪ ،‬قم بالتحويل إلى رقم فاصلة ‪ divmod() ‬لم يتم تحديد عامل تقسيم الطوابق ومشغل النموذج‬
‫‪.‬الوظيفة إذا كان ذلك مناسبًا)(‪ abs‬عائمة باستخدام‬

‫‪Pg. 78‬‬
‫و‪(+ ‬إضافة) عامل ينتج مجموع حججها‪ .‬يجب أن تكون الوسيطات إما أرقامًا أو أن تكون كالهما متواليات من نفس النوع‪ .‬في الحالة‬
‫‪.‬األولى ‪ ،‬يتم تحويل األرقام إلى نوع شائع ثم يتم جمعها‪ L‬معًا‪ .‬في الحالة األخيرة ‪ ،‬يتم تسلسل التسلسالت‬

‫‪.‬األساليب)(__‪ __radd‬و)(__‪ __add‬هذه العملية يمكن أن تكون مخصصة باستخدام الخاصة‬

‫‪.‬و‪(- ‬الطرح) عامل ينتج اختالف حججها‪ .‬يتم أوالً تحويل الوسيطات الرقمية إلى نوع شائع‬

‫‪ .‬الطريقة‪ ‬الخاصة)(__‪ __sub‬يمكن تخصيص هذه العملية باستخدام‬

‫‪ ‬عمليات التحول‪6.8 ‬‬

‫‪:‬عمليات التحويل لها أولوية أقل من العمليات الحسابية‬

‫‪shift_expr :: = a_expr| shift_expr("<<" | ">>")a_expr‬‬

‫هذه العوامل تقبل األعداد الصحيحة كوسيطات‪  .‬يقومون بتحويل الوسيطة األولى إلى اليسار أو اليمين بعدد البتات المعطاة بواسطة‬
‫‪.‬الوسيطة الثانية‬

‫‪.‬األساليب)(__‪ __rshift‬و)(__‪ __lshift‬هذه العملية يمكن أن تكون مخصصة باستخدام الخاصة‬

‫بت على ‪ n ‬يتم تعريف‪ ‬إزاحة اليسار بمقدار‪ pow(2,n). ‬بت على أنها قسمة‪ L‬األرضية على‪ n ‬يتم تعريف‪ ‬اإلزاحة الصحيحة بمقدار‬
‫‪ pow(2,n).‬أنها عملية ضرب بـ‬

‫‪ ‬عمليات ثنائية البت‪6.9 ‬‬

‫‪:‬لكل عملية من العمليات الثالث التي تتم باستخدام البتات مستوى أولوية مختلف‬

‫‪_expr :: = shift_expr| and_expr"&"shift_expr‬و‬

‫‪xor_expr :: = and_expr| xor_expr"^"and_expr‬‬

‫‪or_expr :: = xor_expr| or_expr"|"xor_expr‬‬

‫الوسائط الخاصة بها‪ ،‬التي يجب أن تكون صحيحة أو واحد منهم يجب أن يكون كائن ‪ AND‬في‪& ‬المشغل ينتج المختصة بالبت‬
‫‪.‬طرق خاصة)(__‪ __rand‬أو)(__‪ __and‬مخصص تجاوز‬

‫من الحجج‪ ،‬والتي يجب أن تكون صحيحة أو واحد منهم يجب أن يكون كائن )‪ OR‬حصري( أحادي المعامل ‪ XOR‬في‪^ ‬المشغل غلة‬
‫‪.‬طرق خاصة)(__‪ __rxor‬أو)(__‪ __xor‬مخصص تجاوز‬

‫في‪|  ‬المشغل ينتج المختصة بالبت (ضمنا) أو الوسائط الخاصة بها‪ ،‬التي يجب أن تكون صحيحة أو واحد منهم يجب أن يكون كائن‬
‫‪.‬طرق خاصة)(__‪ __ror‬أو)(__‪ __or‬مخصص تجاوز‬

‫‪6.10. Comparisons‬‬

‫لها نفس األولوية ‪ ،‬وهي أقل من أي عملية حسابية أو تحويلية أو عملية ‪ Python‬فإن جميع عمليات المقارنة في ‪ C ،‬على عكس لغة‬
‫‪:a < b < c‬فإن التعبيرات مثل‪ ‬لها التفسير التقليدي في الرياضيات ‪ C ،‬أحادي االتجاه‪ .‬أي ً‬
‫ضا على عكس‬

‫المقارنة‬ ‫* ) (‪:: = or_expr‬‬

‫"= !" | "=<" | "= >" | "==" | ">" | "<" = ‪comp_operator or_exprcomp_operator ::‬‬

‫"هو" ["ليس"] | ["ليس في" |‬

‫عرف‪ ‬أساليب المقارنة الغنية‪ ‬قد ترجع القيم غير المنطقية‪ .‬في هذه الحالة ‪ ،‬ستستدعي ‪ False. ‬أو‪: True‬تعطي المقارنات قيمًا منطقية‬
‫‪.‬هذه القيمة في السياقات‪ L‬المنطقية)(‪ bool‬بايثون‬

‫يمكن ربط المقارنات بشكل تعسفي ‪ ،‬على سبيل المثال ‪ ،‬ما يعادل‪ ، ‬باستثناء أنه‪  ‬يتم تقييمه مرة واحدة فقط (ولكن في كلتا الحالتين‪ ‬ال‬
‫‪.x < y <= zx < y and y <= zyzx < y‬يتم تقييمه على اإلطالق عندما‪ ‬يتبين أنه خاطئ)‬

‫‪Pg. 79‬‬
‫هي عوامل مقارنة ‪ ،‬إذن‪ ‬تكون مكافئة‪ L‬لـ‪ op1 ، op2 ، ... ، opN  ، ‬تعبيرات و‪ a ، b ، c ، ... ، y ، z ‬بشكل رسمي ‪ ،‬إذا كانت‬
‫‪.a op1 b op2 c ... y opN za op1 b and b op2 c and ... y opN z‬باستثناء أنه يتم تقييم كل تعبير مرة واحدة على األكثر‬

‫لذلك ‪ ،‬على سبيل المثال ‪ ،‬قانوني تمامًا (على الرغم من أنه قد ال يكون ‪ c ،‬و‪ a ‬الحظ أن‪ ‬هذا ال يعني أي نوع من المقارنة بين‬
‫‪.a op1 b op2 cx < y > z‬جمياًل )‬

‫‪ ‬مقارنات القيمة‪6.10.1. ‬‬

‫‪.‬العوامل‪=! ،=< ،=> ،== ،> ،< ‬ومقارنة قيم كائنين‪ .‬ال تحتاج الكائنات إلى نفس النوع‬

‫الفصل‪ ‬كائنات والقيم وأنواع‪  ‬الدول أن األجسام لها قيمة (باإلضافة إلى كتابة والهوية)‪ .‬قيمة الكائن هي فكرة مجردة إلى حد ما في‬
‫ضا ‪ ،‬ال يوجد أي شرط بأن قيمة الكائن يجب أن ُتبنى‬ ‫بايثون‪ :‬على سبيل المثال ‪ ،‬ال توجد طريقة وصول أساسية لقيمة الكائن‪ .‬أي ً‬
‫بطريقة معينة ‪ ،‬على سبيل المثال تتألف من جميع سمات البيانات الخاصة به‪ .‬تقوم عوامل المقارنة بتنفيذ فكرة معينة عن قيمة‬
‫‪.‬الكائن‪  .‬يمكن للمرء أن يفكر فيها على أنها تحدد قيمة كائن بشكل غير مباشر ‪ ،‬عن طريق تطبيق المقارنة‬

‫فإنها ترث سلوك المقارنة االفتراضي ‪ object،‬نظرً ا ألن جميع األنواع هي أنواع فرعية (مباشرة أو غير مباشرة)‬
‫الموضحة في‪ ‬التخصيص )(__‪ __lt‬يمكن لألنواع تخصيص سلوك المقارنة من خالل تنفيذ‪ ‬أساليب مقارنة غنية‪ ‬مثل‪ object. ‬من‬
‫‪ .‬األساسي‬

‫يعتمد السلوك االفتراضي لمقارنة المساواة (‪== ‬و‪ )=! ‬على هوية الكائنات‪  .‬وبالتالي ‪ ،‬تؤدي مقارنة المساواة بين الحاالت التي لها‬
‫نفس الهوية إلى المساواة ‪ ،‬وتؤدي مقارنة المساواة بين الحاالت بهويات مختلفة إلى عدم المساواة‪ .‬الدافع وراء هذا السلوك‬
‫‪.x is yx == y‬االفتراضي هو الرغبة في أن تكون جميع األشياء انعكاسية (أي‪ ‬يعني ضمنيًا‪) ‬‬

‫الدافع وراء هذا السلوك االفتراضي هو‪ TypeError. ‬لم يتم توفير‪ ‬مقارنة الطلبات االفتراضية (‪> ،< ‬و‪ ،=< ‬و‪ )=> ‬؛‪ ‬محاولة تثير‬
‫‪.‬عدم وجود ثابت مماثل للمساواة‬

‫قد يكون سلوك مقارنة المساواة االفتراضية ‪ ،‬أن الحاالت ذات الهويات المختلفة غير متساوية دائمًا ‪ ،‬على النقيض من األنواع التي‬
‫ستحتاجها‪ L‬والتي لها تعريف معقول لقيمة الكائن والمساواة القائمة على القيمة‪ .‬ستحتاج هذه األنواع إلى تخصيص سلوك المقارنة‬
‫‪.‬الخاص بها ‪ ،‬وفي الواقع ‪ ،‬قام عدد من األنواع المضمنة بذلك‬

‫‪.‬تصف القائمة التالية سلوك المقارنة ألهم األنواع المضمنة‬

‫‪‬‬ ‫‪ fractions.Fraction‬أرقام من المدمج في أنواع رقمية (‪ ‬أنواع الرقمية ‪ -‬كثافة‪ L،‬تطفو‪ ،‬معقدة‪ ) ‬وأنواع المكتبة القياسية‬
‫يمكن مقارنة داخل وعبر أنواعها‪ ،‬مع تقييد أن األعداد المركبة تفعل المقارنة لكي ال الدعم‪ .‬ضمن ‪ decimal.Decimal‬و‬
‫‪.‬حدود األنواع المعنية ‪ ،‬يقارنون رياضيًا (خوارزميًا) بشكل صحيح دون فقدان الدقة‬

‫هي خاصة‪ .‬أي مقارنة مرتبة بين رقم وقيمة ليست رقمًا )'‪ decimal.Decimal('NaN‬و)'‪ float('NaN‬القيم ال واحد في عدد‬
‫خاطئة‪ .‬االستنتاج المضاد للحدس هو أن القيم غير العددية ال تساوي نفسها‪ .‬على سبيل المثال‪ ،‬إذا‪ ، ، ‬و‪ ‬كلها كاذبة‪ ،‬بينما‪ ‬هو‬
‫‪ IEEE 754.x = float('NaN')3 < xx < 3x == xx != x‬صحيح‪ .‬يتوافق هذا السلوك مع‬

‫‪‬‬ ‫بأن المقارنات بين الفرديين يجب أن تتم دائمًا معمشغلي ‪ PEP 8 ‬هم سنغلتونس‪ .‬تنصح ‪ NotImplemented‬و‪None‬‬
‫‪.is not‬أوأب ًدا‪is‬المساواة‬

‫‪‬‬ ‫داخل وعبر أنواعها‪ .‬يقارنون معجمياً‪ L‬باستخدام القيم )‪ bytearray‬أو‪ bytes‬مثيالت( يمكن مقارنة‪ ‬التسلسالت الثنائية‬
‫‪.‬الرقمية لعناصرهم‬

‫‪‬‬ ‫ألحرفها‪ ord()) 3 .‬نتيجة الوظيفة المضمنة( العددية ‪ Unicode‬مقارنة معجمية باستخدام نقاط رمز )‪ str‬مثيالت( سالسل‬

‫‪.‬ال يمكن مقارنة السالسل والتسلسالت الثنائية بشكل مباشر‬

‫‪‬‬ ‫يمكن مقارنة فقط داخل كل أنواعها‪ ،‬مع تقييد أن يتراوح ال تدعم مقارنة )‪ range‬أو‪ tuple، list‬حاالت( تسلسل‬
‫‪ TypeError.‬النظام‪  .‬تؤدي مقارنة المساواة عبر هذه األنواع إلى عدم المساواة ‪ ،‬ويثير طلب المقارنة عبر هذه األنواع‬

‫تقارن المتتاليات في المعجم باستخدام مقارنة العناصر المقابلة‪ .‬تفترض الحاويات المضمنة عاد ًة أن كائنات متطابقة تساوي‬
‫‪.‬نفسها‪  .‬يتيح لهم ذلك تجاوز اختبارات المساواة لألشياء المتطابقة لتحسين األداء والحفاظ على ثوابتهم الداخلية‬

‫‪Pg. 80‬‬
‫‪:‬مقارنة معجمية بين أعمال المجموعات المضمنة على النحو التالي‬

‫‪o‬‬ ‫لمقارنة مجموعتين متساويتين ‪ ،‬يجب أن تكونا من نفس النوع ‪ ،‬ولها نفس الطول ‪ ،‬ويجب أن يقارن كل زوج‬
‫من العناصر المقابلة بالتساوي (على سبيل المثال ‪ ،‬خطأ ألن النوع ليس هو نفسه)‪)1,2( == ]1,2[.‬‬
‫‪o‬‬ ‫يتم ترتيب المجموعات التي تدعم مقارنة الطلبات بنفس ترتيب العناصر غير المتكافئة‪ L‬األولى (على سبيل المثال‬
‫‪ ،‬لها نفس القيمة‪  .) ‬في حالة عدم وجود عنصر مطابق ‪ ،‬يتم ترتيب المجموعة األقصر أوالً (على سبيل‬
‫]‪.[1,2,x] <= [1,2,y]x <= y[1,2] < [1,2,3‬المثال ‪ ،‬صحيحة)‬

‫‪‬‬ ‫تقارن‪ ‬التعيينات (مثيالت‪ ) ‬بالتساوي إذا وفقط إذا كان لديهم‪ ‬أزواج‪ ‬متساوية‪( ‬مفتاح ‪ ،‬قيمة)‪ . ‬تفرض مقارنة المساواة ‪dict‬‬
‫‪.‬بين المفاتيح والقيم االنعكاسية‪L‬‬

‫‪ TypeError.‬أجل المقارنات (‪ ،=< ،> ،< ‬و‪ )=> ‬زيادة‬

‫‪‬‬ ‫‪.‬داخل أنواعها وعبرها )‪ frozenset‬أو‪ set‬مثيالت( يمكن مقارنة‪ ‬المجموعات‬

‫يعرّ فون عوامل مقارنة الطلبات على أنها تعني اختبارات المجموعات الفرعية والمجموعات الفائقة‪ .‬ال تحدد هذه العالقات إجمالي‬
‫الطلبات (على سبيل المثال ‪ ،‬المجموعتان‪}1,2{ ‬وغير‪ }2,3{ ‬متساويتين ‪ ،‬وال مجموعات فرعية من بعضها البعض ‪ ،‬وال‬
‫على ( مجموعات شاملة من بعضها البعض)‪  .‬وفقا لذلك‪ ،‬ومجموعات ليست الحجج المناسبة للوظائف التي تعتمد على إجمالي الطلب‬
‫‪).‬المنتجات غير معرفة النتائج إعطاء قائمة مجموعات كمدخالت)(‪ sorted‬و ‪، min()، max()،‬سبيل المثال‬

‫‪.‬المقارنة بين المجموعات تفرض انعكاسية‪ L‬عناصرها‬

‫‪‬‬ ‫‪.‬معظم األنواع المضمنة األخرى ليس لها طرق مقارنة مطبقة ‪ ،‬لذا فهي ترث سلوك المقارنة االفتراضي‬

‫‪:‬يجب أن تتبع الفئات التي يحددها المستخدم والتي تخصص سلوك المقارنة بعض قواعد التناسق ‪ ،‬إن أمكن‬

‫‪‬‬ ‫‪:‬يجب أن تكون مقارنة المساواة انعكاسية‪ .‬بمعنى آخر ‪ ،‬يجب أن تقارن الكائنات المتطابقة بالتساوي‬

‫‪ x == y‬يدل‪x is y ‬‬

‫‪‬‬ ‫‪:‬يجب أن تكون المقارنة متماثلة‪ .‬بمعنى آخر ‪ ،‬يجب أن يكون للتعبيرات التالية نفس النتيجة‬

‫‪ y == x‬و‪x == y ‬‬

‫‪ y != x‬و‪x != y ‬‬

‫‪ y > x‬و‪x < y ‬‬

‫‪ y >= x‬و‪x <= y ‬‬

‫‪‬‬ ‫‪:‬يجب أن تكون المقارنة متعدية‪ .‬توضح األمثلة (غير الشاملة) التالية ما يلي‬

‫‪ x > z‬يدل‪x > y and y > z ‬‬

‫‪ x < z‬يدل‪x < y and y <= z ‬‬

‫‪‬‬ ‫‪:‬يجب أن تؤدي المقارنة العكسية إلى النفي المنطقي‪ .‬بمعنى آخر ‪ ،‬يجب أن يكون للتعبيرات التالية نفس النتيجة‬

‫‪ not x != y‬و‪x == y ‬‬

‫‪not x >= y‬و‪( ‬للطلب الكلي)‪x < y‬‬

‫‪not x <= y‬و‪( ‬للطلب الكلي)‪x > y‬‬

‫ينطبق التعبيران األخيران على المجموعات المرتبة بالكامل (على سبيل المثال ‪ ،‬للتسلسالت ‪ ،‬ولكن ليس على المجموعات أو‬
‫‪.‬مصمم الديكور)(‪ total_ordering‬التعيينات)‪ .‬انظر أيضا‬

‫‪Pg. 81‬‬
‫‪‬‬ ‫ينبغي أن يكون نتيجة يتفق مع المساواة‪  .‬يجب أن يكون للكائنات المتساوية نفس قيمة التجزئة أو يتم تمييزها )(‪ hash‬و‬
‫‪.‬على أنها غير قابلة للتجزئة‬

‫‪.‬ال تفرض بايثون قواعد التناسق هذه‪ .‬في الواقع ‪ ،‬تعتبر قيم ليست رقمًا مثااًل على عدم اتباع هذه القواعد‬

‫‪ ‬عمليات اختبار العضوية‪6.10.2. ‬‬

‫ً‬
‫‪ s ، ‬عضوا في‪ x ‬و‪ ‬االختبار للحصول على العضوية‪ .‬يقيّم إلى‪ ‬ما إذا كان‪ in‬المشغلين‬ ‫وبخالف ذلك‪ .‬إرجاع نفي‪ . ‬تدعم جميع‬
‫التسلسالت وأنواع المجموعات المضمنة هذا باإلضافة إلى القاموس ‪ ،‬والذي‪ ‬يختبر ما إذا كان القاموس يحتوي على مفتاح‬
‫يكون ‪ collections.deque ،‬أو ‪ict ،‬أو ‪ frozenset ،‬أو ‪ set ،‬أو ‪ tuple ،‬أو ‪ list ،‬معين‪ .‬بالنسبة ألنواع الحاويات مثل‬
‫)‪ .not inx in sTrueFalsex not in sx in sinx in yany(x is e or x == e for e in y‬التعبير‪ ‬مكاف ًئا‪ L‬لـ‬

‫اختبار مكافئ هو‪ . ‬تعتبر السالسل الفارغة دائمًا ‪ y . ‬سلسلة فرعية لـ‪ x ‬بالنسبة ألنواع السلسلة والبايت ‪ ،‬يكون هذا‪ ‬فقط إذا كانت‬
‫‪ .x in yTruey.find(x) != -1"" in "abc"True‬سلسلة فرعية ألي سلسلة أخرى ‪ ،‬لذلك‪ ‬ستعود‬

‫الطريقة ‪ُ  ،‬ترجع‪ ‬إذا كانت‪ُ  ‬ترجع قيمة حقيقية ‪ __contains__() ،‬بالنسبة للفئات المعرفة من قبل المستخدم والتي تحدد‬
‫‪.x in yTruey.__contains__(x)False‬وغير‪ ‬ذلك‬

‫هي‪ ‬إذا تم إنتاج بعض ‪ __iter__()، ‬ولكنها تعرف)(__‪ __contains‬بالنسبة للفئات المعرفة من قبل المستخدم والتي ال تعرف‬
‫القيمة‪ ، ‬التي يكون التعبير‪ ‬فيها صحيحً ا ‪ ،‬أثناء التكرار‪  . ‬إذا تم طرح استثناء أثناء التكرار ‪ ،‬فسيبدو األمر كما لو‪ ‬أنه أثار هذا‬
‫‪.x in yTruezx is z or x == zyin‬االستثناء‬

‫و‪ ‬إذا وفقط إذا كان هناك مؤشر عدد ‪ __getitem__()، ‬وأخيرا‪ ،‬هو حاول بروتوكول التكرار الطراز القديم‪ :‬إذا كان يعرف الطبقة‬
‫صحيح غير سالب‪ ‬ط‪ ‬بحيث‪ ، ‬وليس مؤشر عدد صحيح أقل يثير‪ ‬استثناء‪( .‬إذا تم طرح أي استثناء آخر ‪ ،‬يبدو األمر كما لو‪ ‬أنه أثار‬
‫‪.x in yTruex is y[i] or x == y[i]IndexErrorin‬هذا االستثناء)‬

‫‪ .not inin‬يتم تعريف‪ ‬المشغل‪ ‬على أنه يحتوي على قيمة الحقيقة العكسية‪L‬‬

‫‪ ‬مقارنات الهوية‪6.10.3. ‬‬

‫و‪ ‬اختبار لهوية الكائن‪ :‬صحيح إذا وفقط إذا‪ ‬س‪ ‬و‪ ‬ص‪ ‬هي نفس الكائن‪ .‬يتم تحديد هوية الكائن باستخدام‪ ‬الوظيفة‪ .‬ينتج قيمة‪ is‬المشغلين‬
‫‪is notx is yid()x is not y‬الحقيقة العكسية‪4 .‬‬

‫‪ ‬عمليات منطقية‪6.11. ‬‬

‫‪"and_test‬أو"‪or_test :: = and_test| or_test‬‬

‫‪"not_test‬و"‪and_test :: = not_test| and_test‬‬

‫‪"not_test‬ليس" |‪not_test :: = comparison‬‬

‫في سياق العمليات المنطقية ‪ ،‬وأيضً ا عند استخدام التعبيرات بواسطة عبارات تدفق التحكم ‪ ،‬يتم تفسير القيم التالية على أنها‬
‫بما في ذلك السالسل ‪ ،‬والمجموعات ‪ ( ،‬والصفر الرقمي لجميع األنواع ‪ ،‬والسالسل والحاويات الفارغة‪: False، None‬خاطئة‬
‫يتم تفسير جميع القيم األخرى على أنها صحيحة‪ .‬يمكن للكائنات المعرفة من ‪ frozensets). ‬والقوائم ‪ ،‬والقواميس ‪ ،‬والمجموعات و‬
‫‪.‬طريقة)(__‪ __bool‬قبل المستخدم تخصيص قيمة الحقيقة الخاصة بها من خالل توفير‬

‫‪.‬وإال‪ ، False ‬إذا كانت حجته خاطئة‪ True‬ينتج‪ not‬العامل‬

‫‪.x and y‬ويتم إرجاع القيمة الناتجة‪ y ‬خطأ ‪ ،‬يتم إرجاع قيمتها ؛‪ ‬وإال ‪ ،‬يتم تقييم‪ x ‬؛‪ ‬إذا كانت‪ x ‬يقوم التعبير‪ ‬أوالً بتقييم‬

‫‪.x or y‬ويتم إرجاع القيمة الناتجة‪ y ‬صحيحة ‪ ،‬يتم إرجاع قيمتها ؛‪ ‬وإال ‪ ،‬يتم تقييم‪ x ‬؛‪ ‬إذا كانت‪ x ‬يقوم التعبير‪ ‬أوالً بتقييم‬

‫وإنما يعود الحجة تقييم الماضية‪ .‬هذا مفيد في بعض األحيان ‪ True، ،‬و‪ False‬تقيد قيمة واكتب عودتهم إلى‪ or‬وال‪ and‬الحظ أن ال‬
‫سلسلة يجب استبدالها بقيمة افتراضية إذا كانت فارغة ‪ ،‬فإن التعبير‪ ‬ينتج القيمة المطلوبة‪ .‬نظرً ا ‪ s‬على سبيل المثال ‪ ،‬إذا كانت‬
‫ألنه‪  ‬يتعين عليه إنشاء قيمة جديدة ‪ ،‬فإنه يُرجع قيمة منطقية بغض النظر عن نوع الوسيطة الخاصة بها (على سبيل المثال ‪ ،‬ينتج‪ ‬بدالً‬
‫''‪s or 'foo'notnot 'foo'False‬من‪). ‬‬

‫‪Pg. 82‬‬
‫‪ ‬تعبيرات الواجب‪6.12. ‬‬

‫‪assignment_expression :: = [ identifier": ="]expression‬‬

‫بينما يُرجع أيضًا ‪ a identifier،‬إلى‪ expression‬تعبير اإلسناد (يُسمى أحيا ًنا "تعبير مسمى" أو "فظ") يعين الحرف‬
‫‪ expression.‬قيمة‬

‫‪:‬إحدى حاالت االستخدام الشائعة هي عند التعامل مع التعبيرات العادية المتطابقة‬

‫‪if matching := pattern.search(data):‬‬

‫)‪do_something(matching‬‬

‫‪:‬أو ‪ ،‬عند معالجة دفق ملف في أجزاء‬

‫‪while chunk := file.read(9000):‬‬

‫)‪process(chunk‬‬

‫‪.‬لمزيد من التفاصيل حول تعبيرات الواجب‪: SeePEP 572 ‬الجديد في اإلصدار ‪3.8‬‬

‫‪ ‬التعبيرات الشرطية‪6.13. ‬‬

‫]‪Conditional_expression :: = or_test["if" or_test"else" expression‬‬

‫التعبير‬ ‫‪:: = conditional_expression|lambda_expr‬‬

‫‪ Python.‬التعبيرات الشرطية (تسمى أحيا ًن ا "عامل التشغيل الثالثي") لها أدنى أولوية لجميع عمليات‬

‫وإرجاع ‪ y ‬ويتم إرجاع قيمتها ؛‪ ‬وإال ‪ ،‬يتم تقييم‪ x ‬صحيحة ‪ ،‬يتم تقييم‪ C ‬إذا كانت‪ x . ‬بدالً من‪ ، C ‬يقوم التعبير‪ ‬أوالً بتقييم الشرط‬
‫‪.x if C else y‬قيمته‬

‫‪.‬لمزيد من التفاصيل حول التعبيرات الشرطية‪ PEP 308 ‬ارى‬

‫‪6.14. Lambdas‬‬

‫‪lambda_expr :: = "lambda" [ parameter_list] ":"expression‬‬

‫تستخدم تعبيرات المدا (تسمى أحيا ًنا نماذج المدا) إلنشاء دوال مجهولة المصدر‪ .‬ينتج‪ ‬عن التعبير‪ ‬كائن دالة‪ .‬يتصرف الكائن غير‬
‫‪:lambda parameters: expression‬المسمى ككائن دالة معرف بـ‬

‫‪def <lambda>(parameters):‬‬

‫‪return expression‬‬

‫ال ‪ lambda‬انظر قسم‪ ‬تعريفات الوظائف‪ ‬للحصول على صيغة قوائم المعلمات‪  .‬الحظ أن الداالت التي تم إنشاؤها باستخدام تعبيرات‬
‫‪.‬يمكن أن تحتوي على عبارات أو تعليقات توضيحية‬

‫‪ ‬قوائم التعبيرات‪6.15. ‬‬

‫]"‪Express_list :: = expression("،" expression) * ["،‬‬

‫‪starred_list‬‬ ‫]"‪:: = starred_item("،" starred_item) * ["،‬‬

‫]‪starred_expression :: = expression| ( starred_item"،") * [ starred_item‬‬

‫‪starred_item‬‬ ‫‪:: = assignment_expression| "*"or_expr‬‬

‫باستثناء عندما يكون جزء من قائمة أو عرض مجموعة ‪ ،‬فإن قائمة التعبير التي تحتوي على فاصلة واحدة على األقل ينتج عنها‬
‫‪.‬مجموعة‪ .‬طول المجموعة هو عدد التعبيرات في القائمة‪ .‬يتم تقييم التعبيرات من اليسار إلى اليمين‬

‫‪Pg. 83‬‬
‫تشير‪ ‬عالمة النجمة‪ ‬إلى‪ ‬التفريغ المتكرر‪ . ‬يجب أن يكون‪ ‬معاملها‪ L‬متكررً ا‪ . ‬يتم توسيع العنصر المكرر إلى سلسلة من العناصر ‪* ،‬‬
‫‪.‬والتي يتم تضمينها في المجموعة الجديدة ‪ ،‬أو القائمة ‪ ،‬أو المجموعة ‪ ،‬في موقع التفريغ‬

‫‪ .‬الجديد في اإلصدار ‪ :3.5‬التفريغ المتكرر في قوائم التعبير ‪ ،‬الذي اقترحه في األصل‪448‬‬

‫ضا باسم‪ ‬مفرد‪ ) ‬؛‪ ‬إنه اختياري في جميع الحاالت األخرى‪ .‬ال يُنشئ‬ ‫الفاصلة الالحقة مطلوبة فقط إلنشاء مجموعة واحدة ( ُتعرف أي ً‬
‫تعبير واحد بدون فاصلة الحقة ص ًفا ‪ ،‬بل ينتج عنه قيمة هذا التعبير‪( .‬إلنشاء مجموعة فارغة ‪ ،‬استخدم زوجً ا فار ًغا من‬
‫األقواس‪))( .:‬‬

‫‪ ‬أمر التقييم‪6.16. ‬‬

‫‪.‬تقيم بايثون التعبيرات من اليسار إلى اليمين‪  .‬الحظ أنه أثناء تقييم الواجب ‪ ،‬يتم تقييم الجانب األيمن قبل الجانب األيسر‬

‫‪:‬في السطور التالية ‪ ،‬سيتم تقييم التعبيرات بالترتيب الحسابي للواحق الخاصة بها‬

‫‪expr1, expr2, expr3, expr4‬‬

‫)‪(expr1, expr2, expr3, expr4‬‬

‫}‪{expr1: expr2, expr3: expr4‬‬

‫)‪expr1 + expr2 * (expr3 - expr4‬‬

‫)‪expr1(expr2, expr3, *expr4, **expr5‬‬

‫‪expr3, expr4 = expr1, expr2‬‬

‫‪ ‬أسبقية عامل التشغيل‪6.17. ‬‬


‫ً‬
‫ارتباطا) إلى أسبقية أدنى (أقل ارتباط)‪ .‬العوامل في نفس‬ ‫يلخص الجدول التالي أسبقية المشغل في بايثون ‪ ،‬من أعلى أسبقية (أكثر‬
‫المربع لها نفس األسبقية‪  .‬ما لم يتم إعطاء بناء الجملة بشكل صريح ‪ ،‬تكون العوامل ثنائية‪ .‬عوامل التشغيل في نفس مجموعة‬
‫‪.‬المربعات من اليسار إلى اليمين (باستثناء األس ‪ ،‬التي تتجمع من اليمين إلى اليسار)‬

‫الحظ أن المقارنات ‪ ،‬واختبارات العضوية ‪ ،‬واختبارات الهوية ‪ ،‬جميعها لها نفس األسبقية ولها ميزة تسلسل من اليسار إلى اليمين‬
‫‪ .‬كما هو موضح في‪ ‬قسم‪ ‬المقارنات‬

‫المشغل أو العامل‬ ‫وصف‬

‫‪(expressions...),‬‬ ‫تعبير ملزم أو بين قوسين ‪ ،‬عرض القائمة ‪ ،‬عرض القاموس ‪ ،‬عرض‬
‫}‪[expressions...], {key: value...}, {expressions...‬‬ ‫المجموعة‬

‫‪x[index], x[index:index], x(arguments...), x.attribute‬‬ ‫االشتراك ‪ ،‬التقطيع ‪ ،‬االتصال ‪ ،‬مرجع السمة‬

‫‪await x‬‬ ‫انتظر التعبير‬

‫**‬ ‫األس‪5 ‬‬

‫‪+x, -x, ~x‬‬ ‫موجب ‪ ،‬سلبي ‪ ،‬أحادي ال‬

‫الضرب ‪ ،‬ضرب المصفوفة ‪ ،‬القسمة ‪ ،‬القسمة على‬


‫‪*, @, /, //, %‬‬
‫األرض ‪ ،‬الباقي‪6 ‬‬

‫‪+, -‬‬ ‫جمع وطرح‬

‫‪Pg. 84‬‬
‫المشغل أو العامل‬ ‫وصف‬

‫>>‪<<, ‬‬ ‫التحوالت‬

‫&‬ ‫‪ AND‬أحادي المعامل‬

‫^‬ ‫‪Bitwise XOR‬‬

‫|‬ ‫‪ OR‬أحادي المعامل‬

‫المقارنات ‪ ،‬بما في ذلك اختبارات العضوية واختبارات‬


‫==‪in, not in, is, is not, <, <=, >, >=, !=, ‬‬
‫الهوية‬

‫‪not x‬‬ ‫ال‬

‫‪and‬‬ ‫‪ AND‬منطقية‬

‫‪or‬‬ ‫‪ OR‬منطقي‬

‫‪if – else‬‬ ‫تعبير شرطي‬

‫‪lambda‬‬ ‫تعبير المدا‬

‫=‪:‬‬ ‫تعبير التعيين‬

‫الحواشي‬

‫‪1‬‬

‫في حين أن‪ ‬هذا صحيح رياضيًا ‪ ،‬فقد ال يكون صحيحً ا عدديًا بالنسبة للعوامات بسبب التقريب‪ .‬على سبيل المثال ‪ ،‬بافتراض أن‬
‫مزدوج الدقة ‪ ،‬من أجل أن‪ ‬يكون له نفس عالمة‪ ، ‬فإن النتيجة ‪ IEEE 754‬هو رقم ‪ Python‬النظام األساسي الذي يكون تعويم‬
‫المحسوبة هي‪ ، ‬والتي تساوي عدديًا تمامًا‪ . ‬ترجع‪ ‬الدالة‪  ‬النتيجة التي تطابق عالمتها عالمة الوسيطة األولى بدالً من ذلك ‪ ،‬وبالتالي‬
‫‪.abs(x%y) < abs(y)-1e-100 % 1e1001e100-1e-‬تعود‪ ‬في هذه الحالة‪ .‬أي نهج أكثر مالءمة يعتمد على التطبيق‬
‫‪100 + 1e1001e100math.fmod()-1e-100‬‬

‫‪2‬‬

‫بسبب ‪ (x-x%y)//y‬أن تكون أكبر من‪ ‬عدد صحيح‪ x//y‬فمن الممكن ‪ y ،‬قريبة ج ًدا من عدد صحيح دقيق مضاعف لـ ‪ x‬إذا كانت‬
‫جدا من ‪ Python‬التقريب‪ .‬في مثل هذه الحاالت ‪ُ ،‬ترجع‬
‫)‪ .divmod(x,y‬النتيجة األخيرة ‪ ،‬من أجل الحفاظ على‪ ‬أنها قريبة ً‬
‫‪[0] * y + x % yx‬‬

‫‪3‬‬

‫بينما يتم ‪ "LATIN CAPITAL LETTER A"). ‬مثل(‪ ‬واألحرف المجردة ‪ U + 0041) ‬مثل(‪ ‬بين‪ ‬نقاط الكود ‪ Unicode‬يميز معيار‬
‫فقط باستخدام نقطة رمز واحدة ‪ ،‬إال أن هناك عد ًدا من األحرف المجردة التي يمكن ‪ Unicode‬تمثيل معظم األحرف المجردة في‬
‫‪ CAPITAL‬تمثيلها باإلضافة إلى ذلك باستخدام سلسلة من أكثر من نقطة رمز واحدة‪ .‬على سبيل المثال‪ ،‬فإن الطابع المجرد "الالتينية‬
‫أو على شكل سلسلة ‪ U + 00C7،‬في موقف كود‪ precomposed ‬مع سديال" يمكن أن تكون ممثلة باعتباره احد‪ ‬الطابع ‪ C‬رسالة‬
‫يجمع ( ‪ U + 0327‬يليه‪ ‬حرف الجمع‪ ‬في موقف كود ‪ C)،‬رسالة ‪ CAPITAL‬الالتينية( ‪ U + 0043‬من‪ ‬حرف األساسي‪ ‬في موقف كود‬
‫‪).‬سديال‬

‫‪Pg. 85‬‬
‫قد يكون هذا غير بديهي للبشر‪ .‬على سبيل المثال‪ ،‬هو‪ Unicode.  ، ‬تقارن عوامل المقارنة على السالسل على مستوى نقاط كود‬
‫مع ‪ C‬رسالة ‪ CAPITAL‬على الرغم من أن كال سالسل تمثل نفس الطابع المجرد "الالتينية‬
‫‪"."\u00C7" == "\u0043\u0327"False‬سديال‬

‫‪ unicodedata.normalize().‬لمقارنة السالسل على مستوى األحرف المجردة (أي بطريقة بديهية للبشر) ‪ ،‬استخدم‬

‫‪4‬‬

‫نظرً ا لجمع البيانات المهملة تلقائيًا ‪ ،‬والقوائم الحرة ‪ ،‬والطبيعة الديناميكية للواصفات ‪ ،‬فقد تالحظ سلو ًكا غير معتاد على ما يبدو في‬
‫‪ .‬للمشغل ‪ ،‬مثل تلك التي تتضمن مقارنات بين طرق المثيل ‪ ،‬أو الثوابت‪ .‬تحقق من وثائقهم لمزيد من المعلومات‪ is‬استخدامات معينة‬

‫‪5‬‬

‫‪.‬المشغل السلطة‪** ‬يربط بإحكام‪ L‬أقل من عامل أحادي الحسابي أو أحادي المعامل على حقها‪ ،‬وهذا هو‪1-**2 ،‬هو‪0.5 ‬‬

‫‪6‬‬

‫‪.‬و‪% ‬يستخدم المشغل أيضا تنسيق سلسلة‪ .‬تنطبق نفس األسبقية‬

‫‪ ‬عبارات بسيطة‪7. ‬‬

‫بيان بسيط يتكون من سطر منطقي واحد‪ .‬قد تحدث عدة عبارات بسيطة على سطر واحد مفصول بفواصل منقوطة‪ .‬صيغة العبارات‬
‫‪:‬البسيطة هي‬

‫‪simple_stmt :: = expression_stmt‬‬

‫‪| assert_stmt‬‬

‫‪| assignment_stmt‬‬

‫‪| augmented_assignment_stmt‬‬

‫‪| annotated_assignment_stmt‬‬

‫‪| pass_stmt‬‬

‫‪| del_stmt‬‬

‫‪| return_stmt‬‬

‫‪| yield_stmt‬‬

‫‪| raise_stmt‬‬

‫‪| break_stmt‬‬

‫‪| continue_stmt‬‬

‫‪| import_stmt‬‬

‫‪| future_stmt‬‬

‫‪| global_stmt‬‬

‫‪|nonlocal_stmt‬‬

‫‪ ‬عبارات التعبير‪7.1. ‬‬

‫‪Pg. 86‬‬
‫دالة ال ُترجع أي نتيجة ذات ( ُتستخدم عبارات التعبير (غالبًا بشكل تفاعلي) لحساب قيمة وكتابتها ‪ ،‬أو (عاد ًة) الستدعاء إجراء‬
‫االستخدامات‪ L‬األخرى لعبارات التعبير مسموح بها وتكون مفيدة في بعض ‪ُ  None). ‬ترجع اإلجراءات القيمة ‪ Python ،‬معنى ؛ في‬
‫‪:‬األحيان‪ .‬بناء الجملة لتعبير التعبير هو‬

‫‪Expression_stmt :: = starred_expression‬‬
‫ً‬
‫واحدا)‬ ‫‪.‬تقوم جملة التعبير بتقييم قائمة التعبير (والتي قد تكون تعبيرً ا‬

‫الوظيفة‪ ‬المضمنة‪ ‬ويتم كتابة السلسلة )(‪ repr‬يتم تحويلها إلى سلسلة باستخدام ‪ None،‬في الوضع التفاعلي ‪ ،‬إذا لم تكن القيمة كذلك‬
‫)‪.‬كذلك ‪ ،‬بحيث ال تسبب استدعاءات اإلجراء أي إخراج‪ None‬إال إذا كانت النتيجة( الناتجة إلى اإلخراج القياسي على سطر بمفرده‬

‫‪ ‬بيانات التخصيص‪7.2 ‬‬

‫‪ُ :‬ت ستخدم عبارات التخصيص من أجل (إعادة) ربط األسماء بالقيم ولتعديل سمات أو عناصر كائنات قابلة للتغيير‬

‫)‪assignment_stmt :: = ( target_list"=") + ( starred_expression| yield_expression‬‬

‫‪target_list‬‬ ‫]"‪:: = target("،" target) * ["،‬‬

‫الهدف‬ ‫‪:: = identifier‬‬

‫")" ]‪| "(" [ target_list‬‬

‫"]" ]‪| "[" [ target_list‬‬

‫‪| attributeref‬‬

‫‪| subscription‬‬

‫‪| slicing‬‬

‫‪| "*"target‬‬

‫‪ ).‬االشتراك‪ ، ‬و‪ ‬التقطيع ‪ attributeref ، ‬انظر القسم‪ ‬االنتخابات التمهيدية‪ ‬للتعريفات بناء الجملة من أجل(‬

‫يقوم بيان التخصيص بتقييم قائمة التعبيرات (تذكر أن هذا يمكن أن يكون تعبيرً ا واح ًدا أو قائمة مفصولة بفاصلة ‪ ،‬حيث ينتج األخير‬
‫‪.‬عن مجموعة) ويقوم بتعيين الكائن الناتج الفردي لكل من قوائم الهدف ‪ ،‬من اليسار إلى اليمين‬
‫ً‬
‫اعتمادا على شكل الهدف (القائمة)‪ .‬عندما يكون الهدف جزءًا من كائن قابل للتغيير (مرجع‬ ‫يتم تعريف التخصيص بشكل تكراري‬
‫سمة أو اشتراك أو تقسيم) ‪ ،‬يجب أن يقوم الكائن القابل للتغيير في النهاية بتنفيذ التخصيص واتخاذ قرار بشأن صالحيته ‪ ،‬وقد يثير‬
‫استثنا ًء إذا كان التعيين غير مقبول‪  .‬يتم تقديم القواعد التي تمت مالحظتها من قبل األنواع المختلفة واالستثناءات التي أثيرت مع‬
‫‪.‬تعريف أنواع الكائنات (انظر القسم‪ ‬التسلسل الهرمي للنوع القياسي‪) ‬‬

‫‪.‬يتم تحديد تخصيص كائن لقائمة هدف ‪ ،‬اختياريًا بين أقواس أو أقواس مربعة ‪ ،‬بشكل متكرر على النحو التالي‬

‫‪‬‬ ‫‪.‬إذا كانت قائمة الهدف هد ًفا واح ًدا بدون فاصلة الحقة ‪ ،‬اختياريًا بين قوسين ‪ ،‬يتم تعيين الكائن إلى ذلك الهدف‬

‫‪‬‬ ‫آخر‪ :‬يجب أن يكون الكائن متكررً ا بنفس عدد العناصر حيث توجد أهداف في قائمة الهدف ‪ ،‬ويتم تعيين العناصر ‪ ،‬من‬
‫‪.‬اليسار إلى اليمين ‪ ،‬إلى األهداف المقابلة‬

‫‪o‬‬ ‫إذا كانت قائمة‪ L‬الهدف تحتوي على هدف واحد مسبوق بعالمة النجمة ‪ ،‬يسمى الهدف "المميز بنجمة"‪ :‬يجب أن‬
‫يكون الكائن قاباًل للتكرار مع عدد من العناصر على األقل حيث توجد أهداف في قائمة الهدف ‪ ،‬مطروحً ا منها‬
‫واح ًدا‪  .‬يتم تعيين العناصر األولى من العنصر القابل للتكرار ‪ ،‬من اليسار إلى اليمين ‪ ،‬إلى األهداف قبل الهدف‬
‫المميز بنجمة‪  .‬يتم تعيين العناصر النهائية من القابل للتكرار لألهداف بعد الهدف المميز بنجمة‪ .‬يتم بعد ذلك‬
‫‪.‬تعيين قائمة بالعناصر المتبقية في الملف القابل للتكرار إلى الهدف المميز بنجمة (يمكن أن تكون القائمة فارغة)‬

‫‪o‬‬ ‫آخر‪ :‬يجب أن يكون الكائن متكررً ا بنفس عدد العناصر حيث توجد أهداف في قائمة الهدف ‪ ،‬ويتم تعيين‬
‫‪.‬العناصر ‪ ،‬من اليسار إلى اليمين ‪ ،‬إلى األهداف المقابلة‬

‫‪Pg. 87‬‬
‫‪.‬يتم تعريف إحالة كائن إلى هدف واحد بشكل متكرر على النحو التالي‬

‫‪‬‬ ‫‪:‬إذا كان الهدف عبارة عن معرف (اسم)‬

‫‪o‬‬ ‫في كتلة التعليمات البرمجية الحالية‪ :‬يرتبط االسم بالكائن في‪ nonlocal ‬أو‪ global‬إذا لم يظهر االسم في عبارة‬
‫‪.‬مساحة االسم المحلية الحالية‬

‫‪o‬‬ ‫‪ nonlocal،‬خالف ذلك‪ :‬يرتبط االسم بالكائن في مساحة االسم العامة أو مساحة‪ L‬االسم الخارجية التي تحددها‬
‫‪.‬على التوالي‬

‫مقيدا بالفعل‪  .‬قد يتسبب هذا في وصول عدد المراجع للكائن المرتبط مسب ًقا باالسم إلى الصفر ‪ ،‬مما يتسبب في‬
‫يرتد االسم إذا كان ً‬
‫‪.‬إلغاء تخصيص الكائن واستدعاء المدمر (إذا كان لديه واحد)‬

‫‪‬‬ ‫إذا كان الهدف مرجع سمة‪ :‬يتم تقييم التعبير األساسي في المرجع‪ .‬يجب أن تسفر عن كائن بسمات‪ L‬قابلة للتخصيص ؛‪ ‬إذا لم‬
‫يتم رفعه‪  .‬ثم يُطلب من هذا الكائن تعيين الكائن المعين إلى السمة المحددة ؛‪ ‬إذا لم يتمكن ‪ ، TypeError‬يكن األمر كذلك‬
‫‪ AttributeError).‬عادة ولكن ليس بالضرورة( من أداء المهمة ‪ ،‬فإنه يثير استثناء‬

‫فيمكن‪ ‬لتعبير الجانب ‪ ، a.x‬مالحظة‪ :‬إذا كان الكائن عبارة عن مثيل لفئة وكان مرجع السمة يحدث على جانبي عامل التعيين‬
‫يتم دائمًا تعيين‪ ‬هدف الجانب األيسر ‪. a.x‬األيمن‪ ‬الوصول إما إلى سمة مثيل أو (في حالة عدم وجود سمة مثيل) إلى سمة فئة‬
‫ال يشير تواجدان لـ نفس السمة بالضرورة‪ :‬إذا كان تعبير الجانب األيمن يشير ‪ ، a.x‬كسمة‪ L‬مثيل ‪ ،‬ويتم إنشاؤه إذا لزم األمر‪ .‬وبالتالي‬
‫‪:‬إلى سمة فئة ‪ ،‬فإن الجانب األيسر ينشئ سمة مثيل جديدة كهدف للتخصيص‬

‫‪class Cls:‬‬

‫‪x=3‬‬ ‫‪# class variable‬‬

‫)(‪inst = Cls‬‬

‫‪inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3‬‬

‫‪ property().‬ال ينطبق هذا الوصف بالضرورة على سمات‪ L‬الواصف ‪ ،‬مثل الخصائص التي تم إنشاؤها باستخدام‬

‫‪‬‬ ‫إذا كان الهدف عبارة عن اشتراك‪ :‬يتم تقييم التعبير األساسي في المرجع‪ .‬يجب أن ينتج إما كائن تسلسل قابل للتغيير (مثل‬
‫‪.‬قائمة) أو كائن تعيين (مثل القاموس)‪ .‬بعد ذلك ‪ ،‬يتم تقييم التعبير المنخفض‬

‫إذا كان العنصر األساسي عبارة عن كائن تسلسل قابل للتغيير (مثل قائمة) ‪ ،‬فيجب أن ينتج عن الرمز المنخفض عد ًدا صحيحً ا‪ .‬إذا‬
‫عددا صحيحً ا غير سالب أقل من طول التسلسل ‪ ،‬ويطلب‬ ‫كانت سالبة ‪ ،‬تتم إضافة طول المتسلسلة إليها‪ .‬يجب أن تكون القيمة الناتجة ً‬
‫فسيتم رفعه (ال ‪ ، IndexError‬من التسلسل تعيين الكائن المخصص لعنصره باستخدام هذا الفهرس‪ .‬إذا كان الفهرس خارج النطاق‬
‫‪.‬يمكن أن يؤدي التعيين إلى تسلسل منخفض إلى إضافة عناصر جديدة إلى القائمة)‬

‫إذا كان العنصر األساسي عبارة عن كائن تعيين (مثل القاموس) ‪ ،‬فيجب أن يحتوي الرمز المنخفض على نوع متوافق مع نوع مفتاح‬
‫التعيين ‪ ،‬ثم يُطلب من التعيين إنشاء زوج مفتاح ‪ /‬مرجع يقوم بتعيين الرمز المنخفض إلى الكائن المعين‪ .‬يمكن لهذا إما استبدال زوج‬
‫‪.‬مفتاح ‪ /‬قيمة موجود بنفس قيمة المفتاح ‪ ،‬أو إدراج زوج مفتاح ‪ /‬قيمة جديد (في حالة عدم وجود مفتاح بنفس القيمة)‬

‫‪.‬يتم استدعاء الطريقة بالوسيطات المناسبة)(__‪ ، __setitem‬بالنسبة للكائنات المعرفة من قبل المستخدم‬

‫‪‬‬ ‫إذا كان الهدف عبارة عن شرائح‪ :‬يتم تقييم التعبير األساسي في المرجع‪ .‬يجب أن ينتج عنه كائن تسلسل قابل للتغيير (مثل‬
‫قائمة)‪ .‬يجب أن يكون الكائن المخصص كائن تسلسل من نفس النوع‪ .‬بعد ذلك ‪ ،‬يتم تقييم تعابير الحد األدنى واألعلى ‪ ،‬إذا‬
‫كانت موجودة ؛‪ ‬القيم االفتراضية هي صفر وطول التسلسل‪ .‬يجب أن يتم تقييم الحدود إلى أعداد صحيحة‪ .‬إذا كان أي من‬
‫الحدين سالبًا ‪ ،‬فسيتم إضافة طول التسلسل إليه‪ .‬يتم قص الحدود الناتجة لتقع بين الصفر وطول التسلسل ‪ ،‬شامالً‪ .‬أخيرً ا ‪،‬‬
‫يُطلب من كائن التسلسل استبدال الشريحة بعناصر التسلسل المعين‪ .‬قد يختلف طول الشريحة عن طول التسلسل المخصص‬
‫‪ ،.‬وبالتالي تغيير طول التسلسل المستهدف ‪ ،‬إذا كان التسلسل الهدف يسمح بذلك‬

‫في التنفيذ الحالي ‪ ،‬يتم اعتبار بناء جملة األهداف هو نفسه كما في التعبيرات ‪ ،‬ويتم رفض البنية غير ‪ CPython: ‬تفاصيل تنفيذ‬
‫‪.‬الصالحة أثناء مرحلة إنشاء الكود ‪ ،‬مما يتسبب في ظهور رسائل خطأ أقل تفصيالً‬

‫‪Pg. 88‬‬
‫على الرغم من أن تعريف التخصيص يشير إلى أن التداخل بين الجانب األيسر والجانب األيمن هو "متزامن" (على سبيل‬
‫المثال‪ ‬تبديل متغيرين) ‪ ،‬تحدث التداخالت‪ ‬داخل‪  ‬مجموعة المتغيرات المخصصة إلى اليسار ‪ ،‬مما يؤدي في بعض األحيان في‬
‫]‪ :a, b = b, a[0, 2‬حيرة‪  .‬على سبيل المثال ‪ ،‬يقوم البرنامج التالي بطباعة‬

‫]‪x = [0, 1‬‬

‫‪i=0‬‬

‫‪i, x[i] = 1, 2‬‬ ‫‪# i is updated, then x[i] is updated‬‬

‫)‪print(x‬‬

‫أنظر أيضا‬

‫التفريغ القابل للتكرار الممتد ‪PEP 3132 -‬‬

‫‪.‬بالميزة‪ *target‬المواصفات الخاصة‬

‫‪ ‬بيانات التخصيص المعزز‪7.2.1. ‬‬

‫‪:‬التخصيص المعزز هو الجمع ‪ ،‬في بيان واحد ‪ ،‬من عملية ثنائية وبيان تخصيص‬

‫) | ( = ‪augmented_assignment_stmt ::‬‬

‫‪augtarget augopexpression_listyield_expressionaugtarget‬‬ ‫|‪:: = identifier| attributeref‬‬


‫‪subscription|slicing‬‬

‫‪augop‬‬ ‫"= **" | "= ‪:: = "+ =" | "- =" | "* =" | "@ =" | "/ =" | "// =" | "٪‬‬

‫"= |" | "= ^" | "= &" | "= <<" | "= >>" |‬

‫)‪.‬راجع القسم‪ ‬األساسيات‪ ‬للتعرف على تعريفات بناء الجملة للرموز الثالثة األخيرة(‬

‫تقوم المهمة‪ L‬المتزايدة بتقييم الهدف (الذي ‪ ،‬على عكس عبارات التخصيص العادية ‪ ،‬ال يمكن أن يكون تفري ًغا) وقائمة التعبير ‪ ،‬وتنفذ‬
‫‪.‬العملية الثنائية الخاصة بنوع المهمة‪ L‬في المعاملين ‪ ،‬وتعين النتيجة إلى الهدف األصلي‪ .‬يتم تقييم الهدف مرة واحدة فقط‬

‫يمكن إعادة كتابة‪ ‬تعبير التعيين المعزز‪ ‬لتحقيق تأثير مماثل ‪ ،‬ولكن ليس متساويًا تمامًا‪ .‬في اإلصدار المعزز ‪ ،‬يتم تقييمه مرة واحدة‬
‫فقط‪ .‬أيضً ا ‪ ،‬عندما يكون ذلك ممك ًنا‪ ، L‬يتم تنفيذ العملية الفعلية‪ ‬في نفس المكان‪ ، ‬مما يعني أنه بدالً من إنشاء كائن جديد وتعيين ذلك‬
‫‪.x += 1x = x + 1x‬للهدف ‪ ،‬يتم تعديل الكائن القديم بدالً من ذلك‬

‫على عكس المهام العادية ‪ ،‬تقوم المهام‪ L‬المعززة بتقييم الجانب األيسر‪ ‬قبل‪ ‬تقييم الجانب األيمن‪ .‬على سبيل المثال ‪ ،‬البحث‪ ‬أوالً‪ ، ‬ثم‬
‫]‪ .a[i] += f(x)a[i]f(x)a[i‬يقوم بتقييم‪ ‬اإلضافة وتنفيذها ‪ ،‬وأخيرً ا ‪ ،‬يكتب النتيجة مرة أخرى‬

‫باستثناء التخصيص إلى مجموعات وأهداف متعددة في عبارة واحدة ‪ ،‬تتم معالجة المهمة التي يتم إجراؤها بواسطة عبارات التعيين‬
‫المُزايدة بنفس طريقة التخصيصات العادية‪ .‬وبالمثل‪ ،‬مع استثناء من الممكن‪ ‬في مكان‪ ‬السلوك‪ ،‬وهذه العملية الثنائية التي يقوم بها‬
‫‪.‬االحالة المعزز هو نفس العمليات الثنائية العادية‬

‫‪.‬بالنسبة لألهداف التي تكون مراجع السمات‪ ، L‬ينطبق‪ ‬نفس‪ ‬التحذير حول سمات الفئة‪ ‬والمثيل كما هو الحال بالنسبة للتعيينات العادية‬

‫‪ ‬بيانات التخصيص المشروحة‪7.2.2. ‬‬

‫‪:‬إسناد‪ ‬التعليق التوضيحي‪  ‬هو الجمع ‪ ،‬في بيان واحد ‪ ،‬من تعليق توضيحي متغير أو سمة وبيان تخصيص اختياري‬

‫‪annotated_assignment_stmt :: = augtarget":" expression‬‬

‫])‪["=" ( starred_expression| yield_expression‬‬

‫‪.‬يتمثل االختالف عن‪ ‬عبارات التعيين‪ ‬العادية في‪ ‬أنه يُسمح فقط بهدف واحد‬

‫‪Pg. 89‬‬
‫بالنسبة لألسماء‪ L‬البسيطة كأهداف تعيين ‪ ،‬إذا كانت في نطاق فئة أو وحدة نمطية ‪ ،‬يتم تقييم التعليقات التوضيحية وتخزينها في فئة‬
‫عبارة عن تعيين قاموس من أسماء المتغيرات (مشوهة إذا كانت خاصة) للتعليقات‪ __annotations__ ‬خاصة أو سمة وحدة نمطية‬
‫التوضيحية التي تم تقييمها‪ .‬هذه السمة قابلة للكتابة ويتم إنشاؤها تلقائيًا في بداية فئة أو تنفيذ جسم الوحدة النمطية ‪ ،‬إذا تم العثور على‬
‫‪.‬التعليقات التوضيحية بشكل ثابت‬

‫‪.‬بالنسبة للتعبيرات كأهداف تعيين ‪ ،‬يتم تقييم التعليقات التوضيحية إذا كانت في نطاق فئة أو وحدة نمطية ‪ ،‬ولكن لم يتم تخزينها‬

‫إذا تم التعليق على اسم في نطاق دالة ‪ ،‬فسيكون هذا االسم محليًا لهذا النطاق‪ .‬ال يتم تقييم التعليقات التوضيحية مطل ًقا وتخزينها في‬
‫‪.‬نطاقات‪ L‬الوظائف‬

‫إذا كان الجانب األيمن موجو ًد ا ‪ ،‬فإن التعيين المشروح يؤدي المهمة الفعلية قبل تقييم التعليقات التوضيحية (عند االقتضاء)‪ .‬إذا لم يكن‬
‫)(__‪ __setattr‬أو)(__‪ __setitem‬الجانب األيمن موجو ًد ا لهدف تعبير ‪ ،‬فسيقوم المترجم الفوري بتقييم الهدف باستثناء األخير‬
‫‪.‬المكالمة‪L‬‬

‫أنظر أيضا‬

‫بناء الجملة للتعليقات التوضيحية المتغيرة ‪PEP 526 -‬‬

‫االقتراح الذي أضاف بناء الجملة للتعليق على أنواع المتغيرات (بما في ذلك متغيرات الفئة ومتغيرات الحالة) ‪ ،‬بدالً من التعبير عنها‬
‫‪.‬من خالل التعليقات‬

‫نوع تلميحات ‪PEP 484 -‬‬

‫الوحدة النمطية لتوفير بناء جملة قياسي لشروح النوع التي يمكن استخدامها في أدوات التحليل الثابت و‪ typing‬االقتراح الذي أضاف‬
‫‪IDEs.‬‬

‫تم التغيير في اإلصدار ‪  :3.8‬تتيح التخصيصات المشروحة اآلن نفس التعبيرات في الجانب األيمن مثل التعيينات العادية‪ .‬في‬
‫‪.‬السابق ‪ ،‬تسببت بعض التعبيرات (مثل تعبيرات المجموعة غير المقوسة) في حدوث خطأ في بناء الجملة‬

‫‪ ‬بيان‪ assert‬في‪7.3. ‬‬

‫‪:‬عبارات التأكيد هي طريقة مالئمة إلدراج تأكيدات التصحيح في البرنامج‬

‫]‪" expression["،" expression‬تأكيد" = ‪assert_stmt ::‬‬

‫‪assert expression‬الشكل البسيط‪ ، ‬يعادل‬

‫‪if __debug__:‬‬

‫‪if not expression: raise AssertionError‬‬

‫‪assert expression1, expression2‬الشكل الموسع‪ ، ‬يعادل‬

‫‪if __debug__:‬‬

‫)‪if not expression1: raise AssertionError(expression2‬‬

‫تشير إلى المتغيرات المدمج في مع تلك األسماء‪ .‬في تنفيذ الحالي‪ AssertionError ،‬و__‪ __debug‬تفترض هذه المعادالت التي‬
‫ال يصدر ‪ -O). ‬خيار سطر األوامر( عندما يطلب األمثل‪، False‬ظل الظروف العادية‪ True‬غير__‪ __debug‬المتغير المدمج في‬
‫منشئ الكود الحالي أي رمز لبيان التأكيد عند طلب التحسين في وقت الترجمة‪ .‬الحظ أنه من غير الضروري تضمين التعليمات‬
‫‪.‬البرمجية المصدر للتعبير الذي فشل في رسالة الخطأ ؛‪ ‬سيتم عرضه كجزء من تتبع المكدس‬

‫‪.‬غير قانونية‪  .‬يتم تحديد قيمة المتغير الداخلي عندما يبدأ المترجم__‪ __debug‬التخصيصات إلى‬

‫‪ ‬بيان‪ pass‬في‪7.4. ‬‬

‫"تمرير" = ‪pass_stmt ::‬‬

‫‪Pg. 90‬‬
‫هي عملية الغية ‪ -‬عندما يتم تنفيذها ‪ ،‬ال يحدث شيء‪ .‬يكون مفي ًد ا كعنصر نائب عندما تكون العبارة مطلوبة من الناحية ‪pass‬‬
‫‪:‬التركيبية ‪ ،‬ولكن ال يلزم تنفيذ أي تعليمات برمجية ‪ ،‬على سبيل المثال‬

‫)‪def f(arg): pass # a function that does nothing (yet‬‬

‫‪class C: pass‬‬ ‫)‪# a class with no methods (yet‬‬

‫‪ ‬بيان‪ del‬في‪7.5 ‬‬

‫‪del_stmt :: = "del"target_list‬‬

‫جدا للطريقة التي يتم بها تعريف التخصيص‪ .‬بدالً من تهجئتها بتفاصيل كاملة ‪ ،‬إليك بعض‬
‫يتم تعريف الحذف تكراريًا بشكل مشابه ً‬
‫‪.‬التلميحات‪L‬‬

‫‪.‬يؤدي حذف قائمة األهداف إلى حذف كل هدف بشكل متكرر ‪ ،‬من اليسار إلى اليمين‬

‫في ‪ global‬يؤدي حذف االسم إلى إزالة ارتباط هذا االسم من مساحة االسم المحلية أو العالمية ‪ ،‬اعتما ًدا على ما إذا كان االسم يظهر‬
‫‪.‬فسيظهر استثناء‪ ، NameError‬جملة في نفس كتلة التعليمات البرمجية‪ .‬إذا كان االسم غير منضم‬

‫يتم تمرير حذف مراجع السمات‪ L‬واالشتراكات والتقطيع إلى الكائن األساسي المعني ؛‪ ‬يعد حذف التقطيع بشكل عام مكاف ًئا لتخصيص‬
‫‪.‬شريحة فارغة من النوع الصحيح (ولكن حتى هذا يتم تحديده بواسطة الكائن المقطوع)‬

‫تم التغيير في اإلصدار ‪ :3.2‬في‪ ‬السابق كان من غير القانوني حذف اسم من مساحة‪ L‬االسم المحلية إذا حدث كمتغير مجاني في كتلة‬
‫‪.‬متداخلة‬

‫‪ ‬بيان‪ return‬في‪7.6. ‬‬

‫]‪return_stmt :: = "return" [ expression_list‬‬

‫‪.‬قد تحدث فقط متداخلة نحويًا في تعريف دالة ‪ ،‬وليس ضمن تعريف فئة متداخلة‪return ‬‬

‫‪.‬يتم استبدالها‪ None‬في حالة وجود قائمة تعبير ‪ ،‬يتم تقييمها ‪ ،‬وإال‬

‫‪.‬كقيمة إرجاع )‪ None‬أو( يترك استدعاء الوظيفة الحالي مع قائمة التعبير‪return‬‬

‫‪.‬يتم تنفيذ بند قبل ان يغادر حقا وظيفة‪ finally‬شرط أن‪ finally‬البيان مع‪ try‬تسيطر على ممرات للخروج من‪ return‬عندما‬

‫إلى رفعه‪ .‬يتم استخدام القيمة التي تم ‪ StopIteration‬يشير البيان إلى أن المولد قد اكتمل وسيؤدي‪ ، return‬في وظيفة المولد‬
‫‪.‬سمة‪ StopIteration.value‬وتصبح‪ StopIteration‬إرجاعها (إن وجدت) كوسيطة لبناء‬

‫تشير العبارة‪ ‬الفارغة‪ ‬إلى أن المولد غير المتزامن قد اكتمل ‪ ، return‬في وظيفة المولد غير المتزامن‬
‫‪.‬العبارة غير‪ ‬الفارغة‪ ‬هي خطأ في بناء الجملة في وظيفة منشئ غير متزامن‪. return ‬إلى رفعه‪ StopAsyncIteration‬وسيؤدي‬

‫‪ ‬بيان‪ yield‬في‪7.7 ‬‬

‫‪ :: = yield_expression‬العائد_ستمت‬

‫بيان ما يعادل غويا إلى‪ ‬التعبير العائد‪  . ‬يمكن استخدام بيان العائد لحذف األقواس التي قد تكون مطلوبة في بيان تعبير العائد ‪ yield‬و‬
‫المكافئ‪ .‬على سبيل المثال ‪ ،‬بيانات العائد‬

‫>‪yield <expr‬‬

‫>‪yield from <expr‬‬

‫تعادل عبارات تعبير العائد‬

‫)>‪(yield <expr‬‬

‫‪Pg. 91‬‬
‫)>‪(yield from <expr‬‬

‫ُتستخدم عبارات وعبارات المحصول فقط عند تحديد‪ ‬وظيفة‪ ‬المولد‪ ، ‬وال ُتستخدم إال في جسم وظيفة المولد‪ .‬يعد استخدام العائد في‬
‫‪.‬تعريف دالة كافيًا لجعل هذا التعريف ينشئ وظيفة مولد بدالً من وظيفة عادية‬

‫‪ .‬الدالالت ‪ ،‬راجع‪ ‬قسم‪ ‬تعبيرات العائد‪ yield‬للحصول على تفاصيل كاملة عن‬

‫‪ ‬بيان‪ raise‬في‪7.8 ‬‬

‫]]‪" expression‬من"[‪" [ expression‬رفع" = ‪lift_stmt ::‬‬


‫ً‬
‫نشطا في النطاق الحالي‪ .‬في حالة عدم وجود ‪ raise‬في حالة عدم وجود أي تعبيرات ‪ ،‬يتم‬ ‫إعادة طرح االستثناء األخير الذي كان‬
‫‪.‬استثناء يشير إلى أن هذا خطأ‪ RuntimeError‬استثناء نشط في النطاق الحالي ‪ ،‬يظهر‬

‫إذا كانت ‪ BaseException. ‬تقييم التعبير األول على أنه كائن استثناء‪ .‬يجب أن يكون إما فئة فرعية أو مثيالً لـ‪ raise‬وإال ‪ ،‬يتم‬
‫‪.‬فئة ‪ ،‬فسيتم الحصول على مثيل االستثناء عند الحاجة من خالل إنشاء مثيل للفئة بدون وسيطات‬

‫‪.‬في‪ ‬نوع‪ ‬من االستثناء هو فئة المثال استثناء‪ ،‬فإن‪ ‬القيمة‪ ‬هي المثال نفسه‬

‫والتي يمكن الكتابة عليها‪ .‬يمكنك ‪ __traceback__،‬تلقائيًا عند ظهور استثناء وإرفاقه كسمة ‪ traceback‬عادة ما يتم إنشاء كائن‬
‫التي ُترجع نفس ( طريقة االستثناء)(‪ with_traceback‬الخاص بك في خطوة واحدة باستخدام ‪ traceback‬إنشاء استثناء وتعيين‬
‫‪:‬مثل ‪) ،‬الخاص به على وسيطته ‪ traceback‬مثيل االستثناء ‪ ،‬مع تعيين‬

‫)‪raise Exception("foo occurred").with_traceback(tracebackobj‬‬

‫يستخدم بند لتسلسل استثناء‪ :‬إذا ما أعطيت‪ ،‬والثاني‪ ‬التعبير‪ ‬يجب أن تكون الطبقة استثناء آخر أو مثيل‪ .‬إذا كان التعبير الثاني‪ from‬و‬
‫السمة (وهي قابلة للكتابة)‪ .‬إذا كان التعبير عبارة __‪ __cause‬عبارة عن مثيل استثناء ‪ ،‬فسيتم إرفاقه باالستثناء الذي ظهر على أنه‬
‫السمة‪ .‬إذا لم __‪ __cause‬عن فئة استثناء ‪ ،‬فسيتم إنشاء مثيل للفئة وسيتم إرفاق مثيل االستثناء الناتج باالستثناء الذي ظهر على أنه‬
‫‪:‬تتم معالجة االستثناء الذي تم طرحه ‪ ،‬فستتم طباعة كال االستثناءين‬

‫>>>‬

‫‪>>> try:‬‬

‫‪...‬‬ ‫)‪print(1 / 0‬‬

‫‪... except Exception as exc:‬‬

‫‪...‬‬ ‫‪raise RuntimeError("Something bad happened") from exc‬‬

‫‪...‬‬

‫‪Traceback (most recent call last):‬‬

‫>‪File "<stdin>", line 2, in <module‬‬

‫‪ZeroDivisionError: division by zero‬‬

‫‪The above exception was the direct cause of the following exception:‬‬

‫‪Traceback (most recent call last):‬‬

‫>‪File "<stdin>", line 4, in <module‬‬

‫‪RuntimeError: Something bad happened‬‬

‫‪Pg. 92‬‬
‫تعمل آلية مماثلة ضمنيًا في حالة ظهور استثناء داخل معالج استثناء أو‬ finally ‫ يتم بعد ذلك إرفاق االستثناء السابق كسمة‬:‫جملة‬
‫استثناء جديدة‬ __context__:

>>>

>>> try:

... print(1 / 0)

... except:

... raise RuntimeError("Something bad happened")

...

Traceback (most recent call last):

File "<stdin>", line 2, in <module>

ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File "<stdin>", line 4, in <module>

RuntimeError: Something bad happened

‫يمكن منع تسلسل االستثناءات بشكل صريح من خالل التحديد‬ None‫في‬ from‫الجملة‬:

>>>

>>> try:

... print(1 / 0)

... except:

... raise RuntimeError("Something bad happened") from None

...

Traceback (most recent call last):

File "<stdin>", line 4, in <module>

RuntimeError: Something bad happened

‫ كما توجد معلومات حول معالجة االستثناءات في‬، "‫استثناءات‬ " ‫يمكن العثور على معلومات إضافية حول االستثناءات في قسم‬
‫"بيان المحاولة‬ ‫"قسم‬ .

3.3 ‫تم التغيير في اإلصدار‬:None ‫مسموح به اآلن كما‬ Y‫في‬ .raise X from Y

‫إن‬ :3.3 ‫الجديد في اإلصدار‬ __suppress_context__‫السمة لقمع العرض التلقائي للسياق استثناء‬.

7.9. ‫في‬ break‫بيان‬ 

Pg. 93
‫"استراحة" = ‪break_stmt ::‬‬

‫‪.‬حلقة ‪ ،‬ولكنها غير متداخلة في تعريف دالة أو فئة داخل تلك الحلقة‪ while‬أو‪ for‬قد تحدث فقط متداخلة نحويًا في‪ ‬حلقة‪break‬‬

‫‪.‬إذا كانت الحلقة تحتوي على واحدة‪ else ‬إنها تنهي أقرب حلقة مغلقة ‪ ،‬متخطية الجملة االختيارية‬

‫‪.‬فإن هدف التحكم في الحلقة يحتفظ بقيمته الحالية ‪ break،‬تم إنهاء حلقة بواسطة‪ for‬إذا‬

‫‪.‬يتم تنفيذ بند قبل ان يغادر حقا الحلقة‪ finally‬شرط أن‪ finally‬البيان مع‪ try‬تسيطر على ممرات للخروج من‪ break‬عندما‬

‫‪ ‬بيان‪ continue‬في‪7.10. ‬‬

‫"متابعة" = ‪Continue_stmt ::‬‬

‫حلقة ‪ ،‬ولكنها غير متداخلة في تعريف دالة أو فئة داخل تلك الحلقة‪ while.‬أو‪ for‬قد تحدث فقط متداخلة نحويًا في‪ ‬حلقة‪continue‬‬
‫‪ .‬وتستمر مع الدورة التالية ألقرب حلقة مغلقة‬

‫يتم تنفيذ هذه الجملة قبل البدء الفعلي‪ ، finally‬جملة‪ finally‬عبارة تحتوي على‪ try‬تمرير عنصر التحكم خارج‪ continue‬عندما يتم‬
‫‪.‬في دورة الحلقة التالية‬

‫‪ ‬بيان‪ import‬في‪7.11. ‬‬

‫‪import_stmt‬‬ ‫* )]‪:: = "import" module["as" identifier] ("،" module["as" identifier‬‬

‫]‪" identifier‬كـ"[‪" identifier‬استيراد"‪" relative_module‬من" |‬

‫* )]‪("،" identifier["as" identifier‬‬

‫]‪" identifier‬كـ"[‪" "(" identifier‬استيراد"‪" relative_module‬من" |‬

‫")" ]"‪("،" identifier["as" identifier]) * ["،‬‬

‫" * "" استيراد‪" relative_module‬من" |‬

‫الوحدة النمطية‬ ‫‪:: = ( identifier".") *identifier‬‬

‫‪ :: = "." * module| "." +‬النسبي_النموذجي‬

‫‪:‬يتم تنفيذ جملة‪ ‬االستيراد األساسية (بدون‪ ‬بند) في خطوتين‪from‬‬

‫ابحث عن وحدة وتحميلها وتهيئتها إذا لزم األمر ‪1.‬‬

‫‪.‬يحدث‪ ‬فيه‪ ‬البيان‪ import‬تحديد اسم أو أسماء في مساحة االسم المحلية للنطاق الذي ‪2.‬‬

‫عندما تحتوي العبارة على عبارات متعددة (مفصولة بفواصل) ‪ ،‬يتم تنفيذ الخطوتين بشكل منفصل لكل بند ‪ ،‬تمامًا كما لو تم فصل‬
‫‪.‬الجمل في عبارات استيراد فردية‬

‫يتم وصف تفاصيل الخطوة األولى ‪ ،‬البحث عن الوحدات النمطية وتحميلها بمزيد من التفصيل في القسم الخاص‪ ‬بنظام االستيراد‪، ‬‬
‫والذي يصف أي ً‬
‫ض ا األنواع المختلفة للحزم والوحدات النمطية التي يمكن استيرادها ‪ ،‬باإلضافة إلى جميع الخطافات‪ L‬التي يمكن‬
‫استخدامها تخصيص نظام االستيراد‪  .‬الحظ أن حاالت الفشل في هذه الخطوة قد تشير إما إلى أنه ال يمكن تحديد موقع الوحدة النمطية‬
‫‪ ،.‬أو‪  ‬حدوث خطأ أثناء تهيئة الوحدة ‪ ،‬والذي يتضمن تنفيذ رمز الوحدة النمطية‬

‫‪:‬إذا تم استرداد الوحدة المطلوبة بنجاح ‪ ،‬فسيتم إتاحتها في مساحة‪ L‬االسم المحلية بإحدى الطرق الثالث‬

‫‪‬‬ ‫ً‬
‫‪.‬مرتبطا مباشرة بالوحدة المستوردة‪ as‬فسيكون االسم التالي ‪ as،‬إذا كان اسم الوحدة متبوعًا‬

‫‪‬‬ ‫إذا لم يتم تحديد أي اسم آخر ‪ ،‬وكانت الوحدة النمطية التي يتم استيرادها هي وحدة نمطية ذات مستوى أعلى ‪ ،‬فسيتم ربط‬
‫اسم الوحدة في مساحة االسم المحلية كمرجع إلى الوحدة النمطية المستوردة‬

‫‪Pg. 94‬‬
‫‪‬‬ ‫إذا‪ ‬لم تكن‪ ‬الوحدة النمطية التي يتم استيرادها‪  ‬وحدة نمطية ذات مستوى أعلى ‪ ،‬فسيتم ربط اسم حزمة المستوى األعلى التي‬
‫تحتوي على الوحدة في مساحة‪ L‬االسم المحلية كمرجع إلى حزمة المستوى األعلى‪ .‬يجب الوصول إلى الوحدة التي تم‬
‫استيرادها باستخدام اسمها المؤهل الكامل بدالً من الوصول إليها مباشرة‬

‫‪:‬يستخدم شكل عملية قليال أكثر تعقيدا‪ from‬و‬

‫الفقرة ‪ ،‬وتحميلها وتهيئتها إذا لزم األمر ؛‪ from‬العثور على الوحدة المحددة في ‪1.‬‬

‫‪:‬البنود‪ import‬لكل من المعرفات‪ L‬المحددة في ‪2.‬‬

‫تحقق مما إذا كانت الوحدة التي تم استيرادها لها سمة بهذا االسم ‪1.‬‬

‫إذا لم يكن كذلك ‪ ،‬فحاول استيراد وحدة فرعية بهذا االسم ثم تحقق من الوحدة المستوردة مرة أخرى لتلك السمة ‪2.‬‬

‫‪.‬يتم رفعها‪ ، ImportError‬إذا لم يتم العثور على السمة ‪3.‬‬

‫الجملة إذا كان ‪ as‬خال ًف ا لذلك ‪ ،‬يتم تخزين مرجع لتلك القيمة في مساحة االسم المحلية ‪ ،‬باستخدام االسم في ‪4.‬‬
‫ً‬
‫موجودا ‪ ،‬وإال باستخدام اسم السمة‬

‫‪:‬أمثلة‬

‫‪import foo‬‬ ‫‪# foo imported and bound locally‬‬

‫‪import foo.bar.baz‬‬ ‫‪# foo.bar.baz imported, foo bound locally‬‬

‫‪import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb‬‬

‫‪from foo.bar import baz # foo.bar.baz imported and bound as baz‬‬

‫‪from foo import attr‬‬ ‫‪# foo imported and foo.attr bound as attr‬‬

‫إذا تم استبدال قائمة المعرفات‪ L‬بنجمة (‪ ، )'*' ‬فإن جميع األسماء العامة المحددة في الوحدة تكون ملزمة في مساحة‪ L‬االسم المحلية‬
‫‪.‬يحدث‪ ‬فيه‪ ‬البيان‪ import‬للنطاق الذي‬

‫؛‪ ‬إذا تم __‪ __all‬يتم‪ ‬تحديد‪ ‬األسماء العامة‪  L‬التي تحددها الوحدة النمطية عن طريق التحقق من مساحة‪ L‬اسم الوحدة للمتغير المسمى‬
‫تعريفها ‪ ،‬يجب أن تكون سلسلة من السالسل التي هي أسماء تم تحديدها أو استيرادها بواسطة تلك الوحدة‪ .‬جميع األسماء‬
‫لم يتم تعريفها ‪ ،‬فإن مجموعة األسماء‪ L‬العامة تتضمن جميع __‪ __all‬تعتبر عامة ويجب أن تكون موجودة‪ .‬إذا__‪ __all‬الواردة‬
‫يجب أن يحتوي على واجهة __‪ ( '_'). __all‬األسماء الموجودة في مساحة‪ L‬اسم الوحدة النمطية والتي ال تبدأ بحرف شرطة سفلية‬
‫برمجة التطبيقات العامة بالكامل‪  .‬الغرض منه هو تجنب تصدير العناصر التي ال تشكل جزءًا من واجهة برمجة التطبيقات (مثل‬
‫‪.‬وحدات المكتبة النمطية التي تم استيرادها واستخدامها داخل الوحدة) عن طريق الخطأ‬

‫لالستيراد‪ ‬إال على مستوى الوحدة النمطية‪ .‬ستؤدي محاولة استخدامه في تعريفات الفئة أو ‪ wild card‬ال يُسمح باستخدام‪ ‬نموذج‬
‫‪ .from module import *SyntaxError‬الوظائف إلى رفع أ‬

‫عند تحديد الوحدة المراد استيرادها ‪ ،‬ال يتعين عليك تحديد االسم المطلق للوحدة‪ .‬عندما يتم تضمين وحدة أو حزمة في حزمة أخرى ‪،‬‬
‫فمن الممكن إجراء استيراد نسبي داخل نفس الحزمة األولى دون الحاجة إلى ذكر اسم الحزمة‪ .‬باستخدام النقاط البادئة في الوحدة‬
‫أن يمكنك تحديد مدى االرتفاع لتجاوز التسلسل الهرمي الحالي للحزمة دون تحديد األسماء‪ from L‬النمطية أو الحزمة المحددة بعد‬
‫الدقيقة‪  .‬تعني النقطة البادئة الحزمة الحالية حيث توجد الوحدة النمطية التي تقوم باالستيراد‪ .‬نقطتان تعنيان مستوى حزمة واحد‬
‫أعلى‪ .‬ثالث نقاط في مستويين ‪ ،‬إلخ‪ .‬لذا إذا نفذت‪ ‬من وحدة في‪ ‬الحزمة ‪ ،‬فسوف ينتهي بك األمر باالستيراد‪ . ‬إذا نفذت‪ ‬من‬
‫الداخل‪ ‬فسوف‬
‫يتم ‪from . import modpkgpkg.modfrom ..subpkg2 import modpkg.subpkg1pkg.subpkg2.mod. ‬تستورد‬
‫‪ .‬تضمين مواصفات الواردات‪ ‬النسبية في‪ ‬قسم‪ ‬الواردات النسبية للحزمة‬

‫‪.‬يتم توفيره لدعم التطبيقات التي تحدد بشكل ديناميكي الوحدات المراد تحميلها‪importlib.import_module() ‬‬

‫‪ module، filename، sys.path، sys.meta_path، sys.path_hooks.‬بالحجج‪ import ‬يثير‪ ‬حدث تدقيق‬

‫‪ ‬البيانات المستقبلية‪7.11.1. ‬‬

‫‪Pg. 95‬‬
‫بيان المستقبل‪  ‬هو التوجيه للمترجم أن وحدة نمطية معينة يجب أن يتم تجميعها‪ L‬باستخدام بناء الجملة أو دالالت التي ستكون متاحة ‪A ‬‬
‫‪.‬في بيان المستقبل محددة من بيثون حيث تصبح سمة معيارية‬

‫التي تقدم تغييرات غير متوافقة في اللغة‪ .‬يسمح ‪ Python‬يهدف البيان المستقبلي إلى تسهيل الترحيل إلى اإلصدارات المستقبلية من‬
‫‪.‬باستخدام الميزات الجديدة على أساس كل وحدة قبل اإلصدار الذي تصبح فيه الميزة قياسية‬

‫]‪ " identifier‬كـ "[‪ " feature‬استيراد "" __‪" __future‬من" = ‪Future_stmt ::‬‬

‫* )]‪("،" feature["as" identifier‬‬

‫]‪ " identifier‬كـ "[‪" "" (" feature‬استيراد" "__‪" "__future‬من" |‬

‫")" ]"‪("،" feature["as" identifier]) * ["،‬‬

‫ميزة‬ ‫‪:: = identifier‬‬

‫يجب أن تظهر العبارة المستقبلية بالقرب من الجزء العلوي من الوحدة النمطية‪ .‬األسطر الوحيدة التي يمكن أن تظهر قبل البيان‬
‫‪:‬المستقبلي هي‬

‫‪‬‬ ‫‪) ،‬إن وجدت( ‪ docstring‬الوحدة النمطية‬

‫‪‬‬ ‫‪،‬تعليقات‬
‫‪‬‬ ‫أسطر فارغة و‬

‫‪‬‬ ‫‪.‬بيانات مستقبلية أخرى‬

‫‪PEP 563 ).‬انظر(‪ annotations‬الميزة الوحيدة التي تتطلب استخدام البيان المستقبلي هي‬

‫جميع الميزات التاريخية مكنت من بيان المستقبل ال تزال تعترف بها بيثون ‪ .3‬قائمة‬
‫‪ absolute_import، division، generators، generator_stop، unicode_literals، print_function، nested‬تضم‬
‫‪.‬كلها زائدة عن الحاجة ألنها مم ّكنة دائ ًما ‪ ،‬ويتم االحتفاظ بها فقط للتوافق مع اإلصدارات السابقة‪ with_statement. ‬و‪_scopes‬‬

‫يتم التعرف على البيان المستقبلي ومعالجته بشكل خاص في وقت الترجمة‪ :‬غالبًا ما يتم تنفيذ التغييرات في دالالت التركيبات‬
‫األساسية عن طريق إنشاء رمز مختلف‪  .‬قد يكون األمر كذلك أن تقدم ميزة جديدة بناء جملة غير متوافق جديد (مثل كلمة محجوزة‬
‫‪.‬جديدة) ‪ ،‬وفي هذه الحالة قد يحتاج المترجم إلى تحليل الوحدة بشكل مختلف‪ .‬ال يمكن تأجيل مثل هذه القرارات حتى وقت التشغيل‬

‫بالنسبة ألي إصدار معين ‪ ،‬يعرف المترجم أسماء الميزات التي تم تعريفها ‪ ،‬ويثير خطأ وقت الترجمة إذا احتوى البيان المستقبلي‬
‫‪.‬على ميزة غير معروفة له‬

‫موصوفة ‪ __future__،‬دالالت وقت التشغيل المباشر هي نفسها المستخدمة‪ L‬في أي عبارة استيراد‪ :‬هناك وحدة نمطية قياسية‬
‫‪.‬الح ًق ا ‪ ،‬وسيتم استيرادها بالطريقة المعتادة في وقت تنفيذ البيان المستقبلي‬

‫‪.‬تعتمد دالالت وقت التشغيل المثيرة لالهتمام على الميزة المحددة التي تم تمكينها بواسطة بيان المستقبل‬

‫‪:‬الحظ أنه ال يوجد شيء مميز في البيان‬

‫]‪import __future__ [as name‬‬

‫‪.‬هذا ليس بيانا في المستقبل‪  .‬إنه بيان استيراد عادي بدون قيود دالالت خاصة أو نحوية‬

‫تحتوي على بيان‪ M‬التي تحدث في وحدة نمطية‪ compile() ‬و)(‪ exec‬التعليمات البرمجية المترجمة دعوات إلى المدمج في وظائف‬
‫المستقبل‪ ،‬افتراضيا‪ ،‬استخدم بناء الجملة جديد أو دالالت المرتبطة بيان المستقبل‪ .‬يمكن التحكم في ذلك بواسطة وسيطات اختيارية‬
‫‪.‬راجع توثيق تلك الوظيفة للحصول على التفاصيل ‪ compile()-‬لـ‬

‫بالخيار ‪ ،‬وتم ‪  -i‬البيان المستقبلي المكتوب في موجه المترجم التفاعلي ساري المفعول لبقية جلسة المترجم الفوري‪ .‬إذا بدأ المترجم‬
‫تمرير اسم البرنامج النصي لتنفيذه ‪ ،‬ويتضمن البرنامج النصي بيا ًنا مستقبليًا ‪ ،‬فسيكون ساري المفعول في الجلسة التفاعلية التي تبدأ‬
‫‪.‬بعد تنفيذ البرنامج النصي‬

‫‪Pg. 96‬‬
‫أنظر أيضا‬

‫__العودة إلى __المستقبل ‪PEP 236 -‬‬

‫‪_.‬االقتراح األصلي آللية __المستقبل‬

‫‪ ‬بيان‪ global‬في‪7.12. ‬‬

‫* )‪global_stmt :: = "global" identifier("،" identifier‬‬

‫بيان هو اإلعالن الذي يحمل لكتلة القانون الحالي بأكمله‪  .‬وهذا يعني أنه يجب تفسير المعرفات المدرجة على أنها ‪ global‬في‬
‫على الرغم من أن المتغيرات المجانية قد تشير إلى ‪ global،‬جلوبالس‪ .‬سيكون من المستحيل التخصيص إلى متغير عالمي بدونه‬
‫‪.‬دون اإلعالن عن كونها عالمية ‪globals‬‬

‫‪ .‬العبارة‪ ‬نصًا‪ global‬يجب عدم استخدام‪ ‬األسماء‪ L‬المدرجة في‪ ‬بيان في نفس كتلة التعليمات البرمجية التي تسبق هذه‪global‬‬

‫جمل ‪ ،‬أو‪ except‬عبارات أو‪ with‬يجب أال يتم تعريف‪ ‬األسماء‪ L‬المدرجة في‪ ‬بيان على أنها معلمات رسمية ‪ ،‬أو كأهداف في‪global‬‬
‫‪.‬أو‪ ‬تعريف الوظيفة‪ ، ‬أو البيان ‪ ،‬أو التعليق التوضيحي المتغير ‪ import،‬أو التعريف‪ ، class ‬قائمة الهدف‪ for‬في‬

‫ال يفرض التنفيذ الحالي بعض هذه القيود ‪ ،‬ولكن يجب أال تسيء البرامج إساءة استخدام هذه الحرية ‪ CPython:  ،‬تفاصيل تنفيذ‬
‫‪.‬حيث قد تفرضها عمليات التنفيذ المستقبلية أو تغير معنى البرنامج بصمت‬

‫البيان‪ .‬عل‪ global‬هي توجيه إلى المحلل اللغوي‪  .‬إنه ينطبق فقط على الكود الذي تم تحليله في نفس وقت‪: global ‬مالحظة المبرمج‬
‫للدالة المضمنة على كتلة التعليمات )(‪ exec‬العبارة المضمنة في سلسلة أو كائن رمز يتم توفيره‪ global‬ى وجه الخصوص ‪ ،‬ال تؤثر‬
‫بعبارات في الكود الذي يحتوي ‪ global‬البرمجية‪ ‬التي تحتوي‪  ‬على استدعاء الوظيفة ‪ ،‬وال يتأثر الكود الموجود في مثل هذه السلسلة‬
‫‪ compile().‬و)(‪ eval‬على استدعاء الوظيفة‪ .‬األمر نفسه ينطبق على‪ ‬وظائف‬

‫‪ ‬بيان‪ nonlocal‬في‪7.13. ‬‬

‫* )‪nonlocal_stmt :: = "nonlocal" identifier("،" identifier‬‬

‫يسبب بيان معرفات‪ L‬المدرجة اإلشارة إلى المتغيرات ملزمة سابقا في أقرب نطاق إرفاق باستثناء غلوبالس‪ .‬هذا مهم ألن‪ nonlocal‬و‬
‫السلوك االفتراضي للربط هو البحث في مساحة‪ L‬االسم المحلية أوالً‪ .‬تسمح العبارة للكود المغلف بإعادة ربط المتغيرات خارج النطاق‬
‫‪.‬المحلي إلى جانب النطاق العام (الوحدة النمطية)‬

‫البيان ‪ ،‬إلى االرتباطات الموجودة مسب ًقا ‪ global‬بيان ‪ ،‬على عكس تلك المدرجة في‪ nonlocal‬يجب أن تشير‪ ‬األسماء المدرجة في‬
‫‪.‬في نطاق مُرفق (ال يمكن تحديد النطاق الذي يجب إنشاء ارتباط جديد فيه بشكل ال لبس فيه)‬

‫‪.‬يجب أال تتعارض‪ ‬األسماء المدرجة في‪ ‬بيان مع االرتباطات الموجودة مسب ًقا في النطاق المحلي‪nonlocal‬‬

‫‪ ‬البيانات المركبة‪8. ‬‬

‫تحتوي العبارات المركبة على (مجموعات) عبارات أخرى ؛‪  ‬تؤثر أو تتحكم في تنفيذ تلك البيانات األخرى بطريقة ما‪ .‬بشكل عام ‪،‬‬
‫تمتد العبارات المركبة على عدة أسطر ‪ ،‬على الرغم من أنه في التجسيدات البسيطة ‪ ،‬يمكن تضمين بيان مركب كامل في سطر‬
‫‪.‬واحد‬

‫تحدد معالجات‪ L‬االستثناء و ‪ /‬أو رمز التنظيف لمجموعة من ‪. try‬بيانات تنفيذ البنى التحكم في التدفق التقليدية‪ for‬و‪ if، while‬و‬
‫تسمح العبارة بتنفيذ رمز التهيئة واإلنهاء حول كتلة من التعليمات البرمجية‪ .‬تعريفات الوظائف والفئات هي ‪ with‬العبارات ‪ ،‬بينما‬
‫ضا عبارات مركبة من الناحية النحوية‬‫‪.‬أي ً‬

‫تتكون العبارة المركبة من "جملة" واحدة أو أكثر‪ .‬تتكون الجملة من رأس و "جناح"‪ .‬رؤوس الجمل الخاصة ببيان مركب معين كلها‬
‫في نفس مستوى المسافة‪ L‬البادئة‪  .‬يبدأ كل رأس جملة بكلمة أساسية محددة بشكل فريد وينتهي بنقطتين‪ .‬الجناح عبارة عن مجموعة من‬
‫العبارات التي يتحكم فيها بند‪  .‬يمكن أن تكون المجموعة عبارة واحدة أو أكثر من العبارات البسيطة المفصولة بفاصلة منقوطة على‬
‫نفس السطر مثل الرأس ‪ ،‬بعد نقطتي الرأس ‪ ،‬أو يمكن أن تكون عبارة واحدة أو أكثر ذات مسافة‪ L‬بادئة في األسطر الالحقة‪ .‬يمكن أن‬
‫‪ if‬يحتوي الشكل األخير فقط من المجموعة على عبارات مركبة متداخلة ؛‪ ‬ما يلي غير قانوني ‪ ،‬غالبًا ألنه لن يكون واضحً ا أي‬
‫‪ :‬تنتمي الجملة‪ ‬التالية‪ else‬بند‬

‫‪Pg. 97‬‬
‫)‪if test1: if test2: print(x‬‬

‫يتم تنفيذ كل االستدعاءات‪ ‬أو )(‪ print‬الحظ أيضً ا أن الفاصلة المنقوطة ترتبط بشكل أكثر إحكامًا من النقطتين في هذا السياق ‪ ،‬بحيث‬
‫‪ :‬عدم‪ ‬تنفيذها‪ ‬في المثال التالي‬

‫)‪if x < y < z: print(x); print(y); print(z‬‬

‫‪:‬تلخيص‬

‫‪ :: = if_stmt‬مجمع_ستمت‬

‫‪| while_stmt‬‬

‫‪| for_stmt‬‬

‫‪| try_stmt‬‬

‫‪| with_stmt‬‬

‫‪| match_stmt‬‬

‫‪| funcdef‬‬

‫‪| classdef‬‬

‫‪| async_with_stmt‬‬

‫‪| async_for_stmt‬‬

‫‪|async_funcdef‬‬

‫جناح‬ ‫‪ NEWLINE + DEDEN‬مسافة‪ L‬بادئة‪:: = stmt_listNEWLINE | statement‬‬

‫البيان‬ ‫‪:: = stmt_listNEWLINE |compound_stmt‬‬

‫‪stmt_list‬‬ ‫]"؛"[ * )‪" simple_stmt‬؛"(‪:: = simple_stmt‬‬

‫الحظ أيضً ا أن عبارات المتابعة االختيارية تبدأ ‪ DEDENT. ‬بحرف ربما متبوعً ا بامتداد‪ NEWLINE‬الحظ أن العبارات تنتهي دائمًا‬
‫من خالل ‪ Python‬يتم حل مشكلة‪ ‬التعلق‪ ‬في‪ ( else‬دائ ًم ا بكلمة رئيسية ال يمكن أن تبدأ عبارة ‪ ،‬وبالتالي ال توجد أي غموض‬
‫‪).‬عبارات‪ ‬متداخلة‪ ‬لتكون مسافة‪ L‬بادئة‪ if‬طلب‬

‫‪.‬يؤدي تنسيق القواعد النحوية في األقسام التالية إلى وضع كل عبارة في سطر منفصل للتوضيح‬

‫‪ ‬بيان‪ if‬في‪8.1 ‬‬

‫‪:‬البيان للتنفيذ الشرطي‪ if‬يستخدم‬

‫‪if_stmt :: = "if" assignment_expression":" suite‬‬

‫* )‪("elif" assignment_expression":" suite‬‬

‫]‪" ":" suite‬آخر"[‬


‫ً‬
‫واحد ا تلو اآلخر حتى يتم العثور على واحد ليكون صحيحً ا (راجع‬ ‫ً‬
‫واحدا من المجموعات من خالل تقييم التعبيرات‬ ‫يختار بالضبط‬
‫إذا كانت‪). ‬يتم تنفيذ أو تقييم‪ ‬أي جزء آخر من‪ ‬البيان‪ if‬وال( قسم‪ ‬العمليات المنطقية‪ ‬لتعريف الصواب والخطأ) ؛‪ ‬ثم يتم تنفيذ هذا الجناح‬
‫‪.‬الجملة ‪ ،‬إن وجدت‪ else‬جميع التعبيرات خاطئة ‪ ،‬فسيتم تنفيذ مجموعة‬

‫‪ ‬بيان‪ while‬في‪8.2 ‬‬

‫‪:‬يستخدم بيان لتنفيذ المتكررة طالما تعبيرا صحيحا‪ while‬و‬

‫‪Pg. 98‬‬
‫‪while_stmt :: = "while" assignment_expression":" suite‬‬

‫]‪["else" ":" suite‬‬

‫هذا يختبر التعبير بشكل متكرر ‪ ،‬وإذا كان صحيحً ا ‪ ،‬يتم تنفيذ المجموعة األولى ؛‪ ‬إذا كان التعبير خاط ًئا (والتي قد تكون المرة األولى‬
‫‪.‬يتم تنفيذ‪ ‬مجموعة‪ ‬الجملة ‪ ،‬إن وجدت ‪ ،‬وتنتهي الحلقة ‪ else،‬التي يتم اختبارها فيها)‬

‫بيان تنفيذها في الجناح األول يتخطى‪. A continue ‬جناح شرط ل‪ else‬بيان تنفيذها في الجناح األول إنهاء حلقة دون تنفيذ‪A break‬‬
‫‪.‬بقية جناح ويعود الى اختبار التعبير‬

‫‪ ‬بيان‪ for‬في‪8.3 ‬‬

‫‪:‬العبارة للتكرار على عناصر تسلسل (مثل سلسلة أو مجموعة أو قائمة) أو كائن آخر قابل للتكرار‪ُ  for‬تستخدم‬

‫‪" expression_list":" suite‬في"‪" target_list‬لـ" = ‪for_stmt ::‬‬

‫]‪["else" ":" suite‬‬

‫ثم يتم ‪ expression_list. ‬يتم تقييم قائمة التعبير مرة واحدة ؛‪ ‬يجب أن ينتج عنه كائن قابل للتكرار‪ .‬يتم إنشاء مكرر لنتيجة ملف‬
‫تنفيذ المجموعة مرة واحدة لكل عنصر يوفره المكرر ‪ ،‬بالترتيب الذي يتم إرجاعه بواسطة المكرر‪ .‬يتم تعيين كل عنصر بدوره إلى‬
‫قائمة الهدف باستخدام القواعد القياسية للتخصيصات (انظر‪ ‬عبارات التخصيص‪ ، ) ‬ثم يتم تنفيذ المجموعة‪ .‬عندما يتم استنفاد‬
‫‪ else‬يتم تنفيذ المجموعة في ‪) ،‬استثناءً‪ StopIteration‬وهو ما يحدث فورً ا عندما يكون التسلسل فار ًغا أو يثير المكرر( العناصر‬
‫‪.‬الجملة ‪ ،‬إن وجدت ‪ ،‬وتنتهي الحلقة‬

‫بيان تنفيذها في الجناح األول يتخطى‪. A continue ‬جناح شرط ل‪ else‬بيان تنفيذها في الجناح األول إنهاء حلقة دون تنفيذ‪A break‬‬
‫‪.‬الشرط إذا كان هناك أي بند المقبل‪ else‬بقية جناح ويستمر مع البند التالي‪ ،‬أو مع‬

‫بتخصيصات للمتغيرات في قائمة الهدف‪  .‬يؤدي هذا إلى استبدال جميع التعيينات السابقة لتلك المتغيرات بما في ‪ for-loop‬تقوم حلقة‬
‫‪ for-loop:‬ذلك تلك التي تم إجراؤها في مجموعة‬

‫‪for i in range(10):‬‬

‫)‪print(i‬‬

‫‪i=5‬‬ ‫‪# this will not affect the for-loop‬‬

‫‪# because i will be overwritten with the next‬‬

‫‪# index in the range‬‬

‫ال يتم حذف األسماء الموجودة في قائمة‪ L‬الهدف عند انتهاء الحلقة ‪ ،‬ولكن إذا كان التسلسل فار ًغا ‪ ،‬فلن يتم تعيينها على اإلطالق‬
‫بإرجاع مكرر من األعداد الصحيحة المناسبة لمحاكاة تأثير باسكال‪ ‬؛‪ ‬على سبيل )(‪ range‬بواسطة الحلقة‪ .‬تلميح‪ :‬تقوم الدالة المضمنة‬
‫]‪ .for i := a to b dolist(range(3))[0, 1, 2‬المثال ‪ ،‬إرجاع القائمة‬

‫ملحوظة‬

‫‪ ‬‬

‫هناك دقة عندما يتم تعديل التسلسل بواسطة الحلقة (يمكن أن يحدث هذا فقط للتسلسالت‪ L‬القابلة للتغيير ‪ ،‬مثل القوائم)‪ .‬يتم استخدام‬
‫عداد داخلي لتتبع العنصر الذي سيتم استخدامه بعد ذلك ‪ ،‬ويتم زيادة هذا في كل تكرار‪ .‬عندما يصل هذا العداد إلى طول التسلسل ‪،‬‬
‫تنتهي الحلقة‪  .‬هذا يعني أنه إذا حذفت المجموعة العنصر الحالي (أو العنصر السابق) من التسلسل ‪ ،‬فسيتم تخطي العنصر التالي‬
‫(نظرً ا ألنه يحصل على فهرس العنصر الحالي الذي تمت معالجته بالفعل)‪ .‬وبالمثل ‪ ،‬إذا قامت‪ L‬المجموعة بإدراج عنصر في التسلسل‬
‫قبل العنصر الحالي ‪ ،‬فسيتم التعامل مع العنصر الحالي مرة أخرى في المرة التالية من خالل الحلقة‪ .‬يمكن أن يؤدي هذا إلى أخطاء‬
‫‪ ،‬سيئة يمكن تجنبها عن طريق عمل نسخة مؤقتة باستخدام شريحة من التسلسل بأكمله ‪ ،‬على سبيل المثال‬

‫‪for x in a[:]:‬‬

‫)‪if x < 0: a.remove(x‬‬

‫‪Pg. 99‬‬
‫‪ ‬بيان‪ try‬في‪8.4 ‬‬

‫‪:‬بيان يحدد معالجات‪ L‬استثناء و ‪ /‬أو رمز تنظيف لمجموعة من البيانات‪ try‬في‬

‫‪try_stmt :: = try1_stmt|try2_stmt‬‬

‫‪try1_stmt :: = "try" ":" suite‬‬

‫‪" [ expression["as" identifier]] ":" suite) +‬باستثناء"(‬

‫]‪" ":" suite‬آخر"[‬

‫]‪": " suite‬أخيرً ا"[‬

‫‪": " suite‬جرب" = ‪try2_stmt ::‬‬

‫‪ "": "suite‬أخيرً ا "‬

‫الجملة ‪ ،‬ال يتم تنفيذ أي معالج ‪ try‬البند (ق) تحدد واحدة أو أكثر من معالجات‪ L‬استثناء‪ .‬عند عدم حدوث استثناء في‪ except‬في‬
‫المجموعة ‪ ،‬يتم بدء البحث عن معالج استثناء‪  .‬يقوم هذا البحث بفحص عبارات االستثناء بدورها ‪ try‬استثناء‪ .‬عند حدوث استثناء في‬
‫حتى يتم العثور على واحدة تطابق االستثناء‪  .‬يجب أن تكون الجملة التي ال تحتوي على تعبير ‪ ،‬إذا كانت موجودة ‪ ،‬أخيرة ؛‪ ‬يطابق‬
‫أي استثناء‪  .‬بالنسبة لبند باستثناء مع تعبير ‪ ،‬يتم تقييم هذا التعبير ‪ ،‬وتتطابق الجملة مع االستثناء إذا كان الكائن الناتج "متواف ًقا" مع‬
‫االستثناء‪ .‬يكون الكائن متواف ًقا مع استثناء إذا كان هو الفئة أو الفئة األساسية‪ L‬لكائن االستثناء ‪ ،‬أو مجموعة تحتوي على عنصر يمثل‬
‫‪.‬فئة أو فئة أساسية لعنصر االستثناء‬

‫تتطابق مع االستثناء ‪ ،‬فسيستمر البحث عن معالج استثناء في الكود المحيط وفي مكدس‪ L‬االستدعاء‪ no except 1 .‬إذا كانت عبارة‬

‫إذا أثار تقييم تعبير في رأس بند "استثناء" استثنا ًء ‪ ،‬يتم إلغاء البحث األصلي عن المعالج ويبدأ البحث عن االستثناء الجديد في الكود‬
‫‪).‬أثار البيان االستثناء‪ try‬يتم التعامل معه كما لو كان الكل( المحيط وفي مكدس االستدعاءات‬

‫الكلمة األساسية في عبارة "باستثناء" ‪ ،‬إن ‪ as‬عند العثور على عبارة مطابقة باستثناء ‪ ،‬يتم تعيين االستثناء للهدف المحدد بعد‬
‫وجدت ‪ ،‬ويتم تنفيذ مجموعة عبارة "استثناء"‪  .‬يجب أن تحتوي جميع البنود باستثناء البنود على كتلة قابلة للتنفيذ‪ .‬عند الوصول إلى‬
‫هذا يعني أنه في حالة وجود معالِجين متداخلين لنفس (‪. ‬بأكملها ‪ try‬نهاية هذه الكتلة ‪ ،‬يستمر التنفيذ بشكل طبيعي بعد تعليمة‬
‫)‪.‬من المعالج الداخلي ‪ ،‬فلن يعالج المعالج الخارجي االستثناء ‪ try‬االستثناء ‪ ،‬وحدث االستثناء في جملة‬

‫‪as target‬عند تعيين استثناء باستخدام‪ ، ‬يتم مسحه في نهاية بند االستثناء‪ .‬هذا كما لو‬

‫‪except E as N:‬‬

‫‪foo‬‬

‫تمت ترجمته إلى‬

‫‪except E as N:‬‬

‫‪try:‬‬

‫‪foo‬‬

‫‪finally:‬‬

‫‪del N‬‬

‫هذا يعني أنه يجب تعيين االستثناء إلى اسم مختلف لتتمكن من الرجوع إليه بعد شرط االستثناء‪ .‬يتم مسح االستثناءات نظرً ا ألنه مع‬
‫بها ‪ ،‬فإنها‪ L‬تشكل دورة مرجعية مع إطار المكدس ‪ ،‬مما يبقي جميع السكان المحليين في هذا اإلطار على قيد ‪ traceback‬إرفاق‬
‫‪.‬الحياة حتى تحدث المجموعة المهملة التالية‬

‫الوحدة ويمكن الوصول إليها ‪ sys‬قبل تنفيذ مجموعة بند باستثناء ‪ ،‬يتم تخزين تفاصيل االستثناء في‬
‫راجع( ‪ traceback‬تتكون من فئة االستثناء ومثيل االستثناء وكائن ‪-tuple‬تقوم بإرجاع ‪ sys.exc_info(). sys.exc_info()3‬عبر‬

‫‪Pg. 100‬‬
‫تتم استعادة‪ ‬التفاصيل )(‪. sys.exc_info‬لتحديد النقطة في البرنامج التي حدث فيها االستثناء )‪ ‬قسم‪ ‬التدرج الهرمي للنوع القياسي‬
‫‪:‬المتعلقة باالستثناء الذي تم الوصول إليه عبر‪ ‬قيمها السابقة عند ترك معالج استثناء‬

‫>>>‬

‫))(‪>>> print(sys.exc_info‬‬

‫)‪(None, None, None‬‬

‫‪>>> try:‬‬

‫‪...‬‬ ‫‪raise TypeError‬‬

‫‪... except:‬‬

‫‪...‬‬ ‫))(‪print(sys.exc_info‬‬

‫‪...‬‬ ‫‪try:‬‬

‫‪...‬‬ ‫‪raise ValueError‬‬

‫‪...‬‬ ‫‪except:‬‬

‫‪...‬‬ ‫))(‪print(sys.exc_info‬‬

‫‪...‬‬ ‫))(‪print(sys.exc_info‬‬

‫‪...‬‬

‫)>‪(<class 'TypeError'>, TypeError(), <traceback object at 0x10efad080‬‬

‫)>‪(<class 'ValueError'>, ValueError(), <traceback object at 0x10efad040‬‬

‫)>‪(<class 'TypeError'>, TypeError(), <traceback object at 0x10efad080‬‬

‫))(‪>>> print(sys.exc_info‬‬

‫)‪(None, None, None‬‬

‫أعدم ‪ break‬أو‪ return، continue‬جناح‪ ،‬أثيرت يست استثناء‪ ،‬وليس‪ try‬يتم تنفيذ الشرط إذا ترك تدفق سيطرة‪ else‬اختياري‬
‫‪ .‬البنود‪ ‬السابقة‪ except ‬ال يتم التعامل مع‪ ‬االستثناءات الواردة في‪ ‬الجملة من خالل‪. else‬بيان‬

‫البنود‪ .‬إذا حدث استثناء في ‪ else‬و‪ except‬يتم تنفيذ بند‪ ،‬بما في ذلك أي‪ try‬موجو ًدا ‪ ،‬فإنه يحدد معالج "تنظيف"‪ .‬و‪ finally‬إذا كان‬
‫يتم تنفيذ الشرط‪ .‬إذا كان هناك استثناء محفوظ ‪ ،‬فسيتم إعادة ‪ finally‬أي من الجمل ولم تتم معالجته ‪ ،‬فسيتم حفظ االستثناء مؤق ًتا‪ .‬و‬
‫أثارت الجملة استثنا ًء آخر ‪ ،‬فسيتم تعيين االستثناء المحفوظ كسياق االستثناء الجديد‪ .‬إذا ‪ finally‬الجملة‪ .‬إذا‪ finally‬إظهاره في نهاية‬
‫‪:‬بيان‪ ،‬يتم تجاهل استثناء المحفوظة‪ continue‬أو‪ return، break ‬تنفيذ بند و‪ finally‬كان‬

‫>>>‬

‫‪>>> def f():‬‬

‫‪...‬‬ ‫‪try:‬‬

‫‪...‬‬ ‫‪1/0‬‬

‫‪...‬‬ ‫‪finally:‬‬

‫‪...‬‬ ‫‪return 42‬‬

‫‪...‬‬

‫‪Pg. 101‬‬
‫)(‪>>> f‬‬

‫‪42‬‬

‫‪.‬الجملة‪ finally‬ال تتوفر معلومات االستثناء للبرنامج أثناء تنفيذ‬

‫يتم تنفيذ الشرط أيضا "على ‪ finally‬بيان‪ ،‬و‪ try... finally ‬جناح من‪ try‬يتم تنفيذ بيان في‪ continue‬أو‪ return، break‬عندما‬
‫"‪.‬طريقة للخروج‬

‫تنفيذها‪ ‬دائمًا ‪ ،‬فإن ‪ return‬الجملة يتم‪ finally‬عبارة تم تنفيذها‪ .‬نظرً ا ألن‪ return ‬يتم تحديد قيمة اإلرجاع للدالة من خالل آخر‬
‫‪:‬الجملة ستكون دائمًا آخر جملة يتم تنفيذها‪ finally‬الجملة‪ ‬المنفذة في‬

‫>>>‬

‫‪>>> def foo():‬‬

‫‪...‬‬ ‫‪try:‬‬

‫‪...‬‬ ‫'‪return 'try‬‬

‫‪...‬‬ ‫‪finally:‬‬

‫‪...‬‬ ‫'‪return 'finally‬‬

‫‪...‬‬

‫)(‪>>> foo‬‬

‫'‪'finally‬‬

‫‪ raise‬يمكن العثور على معلومات إضافية حول االستثناءات في قسم‪ ‬االستثناءات‪ ، ‬ويمكن العثور‪ ‬على معلومات حول استخدام‬
‫‪ .‬العبارة إلنشاء استثناءات في القسم‪ ‬بيان الزيادة‬

‫الفقرة نظرً ا لوجود مشكلة في ‪ finally‬كانت العبارة غير قانونية في‪ Python 3.8 ، continue‬تم التغيير في اإلصدار ‪ :3.8‬قبل‬
‫‪.‬التنفيذ‬

‫‪ ‬بيان‪ with‬في‪8.5 ‬‬

‫يستخدم بيان لاللتفاف على تنفيذ كتلة مع األساليب التي يعرفها مدير السياق (انظر القسم‪ ‬مع مدراء بيان السياق‪ .) ‬وهذا ‪ with‬و‬
‫‪.‬أنماط االستخدام لتكون مغلفة إلعادة استخدامها مريحة‪ try... except... finally ‬يسمح مشترك‬

‫‪with_stmt‬‬ ‫‪ ")" | with_stmt_contents) ":"suite‬؟"‪:: = "with" ("(" with_stmt_contents"،‬‬

‫* )‪with_stmt_contents :: = with_item("،" with_item‬‬

‫‪with_item‬‬ ‫]‪:: = expression["as" target‬‬

‫‪:‬البيان ب "عنصر" واحد على النحو التالي‪ with‬يتم تنفيذ‬

‫‪.‬للحصول على مدير سياق )‪ with_item‬التعبير الوارد في( يتم تقييم تعبير السياق ‪1.‬‬

‫‪.‬يتم تحميل‪ ‬مدير السياق‪ ‬الستخدامه الح ًقا)(__‪2. __enter‬‬

‫‪.‬يتم تحميل‪ ‬مدير السياق‪ ‬الستخدامه الح ًقا)(__‪3. __exit‬‬

‫‪ .‬تم استدعاء طريقة‪ ‬مدير السياق)(__‪4. __enter‬‬

‫‪.‬يتم تعيين‪ ‬قيمة اإلرجاع من‪ ‬إليه)(__‪ ، __enter‬العبارة‪ with‬إذا تم تضمين هدف في ‪5.‬‬

‫ملحوظة‬

‫‪Pg. 102‬‬
‫‪ ‬‬

‫سوف دائما يتم استدعاؤها‪ .‬وبالتالي ‪ __exit__() ،‬إرجاع األسلوب دون خطأ‪ ،‬ثم‪ __enter__() ‬تضمن البيان أنه إذا كان‪ with‬و‬
‫إذا حدث خطأ أثناء التخصيص لقائمة الهدف ‪ ،‬فسيتم التعامل معه بنفس طريقة التعامل مع الخطأ الذي يحدث داخل المجموعة‪ .‬انظر‬
‫‪.‬الخطوة ‪ 6‬أدناه‬

‫‪.‬تم تنفيذ الجناح ‪6.‬‬

‫تم استدعاء طريقة‪ ‬مدير السياق‪  . ‬إذا تسبب أحد االستثناءات في خروج المجموعة ‪ ،‬فسيتم تمرير نوعها )(__‪7. __exit‬‬
‫‪.‬يتم توفير‪ ‬ثالث‪ ‬حجج‪ ، None‬خالف ذلك‪ __exit__(). ‬كوسيطات إلى ‪ traceback‬وقيمتها و‬

‫الطريقة خاطئة ‪ ،‬تتم إعادة االستثناء‪ .‬إذا كانت )(__‪ __exit‬إذا تم الخروج من المجموعة بسبب استثناء ‪ ،‬وكانت القيمة المعادة من‬
‫‪.‬العبارة‪ with‬قيمة اإلرجاع صحيحة ‪ ،‬يتم منع االستثناء ‪ ،‬ويستمر التنفيذ مع العبارة التي تلي‬

‫يتم تجاهل‪ ‬قيمة اإلرجاع من‪ ، ‬ويستمر التنفيذ في الموقع )(__‪ ، __exit‬إذا تم الخروج من المجموعة ألي سبب بخالف االستثناء‬
‫‪.‬الطبيعي لنوع المخرج الذي تم اتخاذه‬

‫‪:‬الكود التالي‬

‫‪with EXPRESSION as TARGET:‬‬

‫‪SUITE‬‬

‫‪:‬يعادل لغويًا‬

‫)‪manager = (EXPRESSION‬‬

‫__‪enter = type(manager).__enter‬‬

‫__‪exit = type(manager).__exit‬‬

‫)‪value = enter(manager‬‬

‫‪hit_except = False‬‬

‫‪try:‬‬

‫‪TARGET = value‬‬

‫‪SUITE‬‬

‫‪except:‬‬

‫‪hit_except = True‬‬

‫‪if not exit(manager, *sys.exc_info()):‬‬

‫‪raise‬‬

‫‪finally:‬‬

‫‪if not hit_except:‬‬

‫)‪exit(manager, None, None, None‬‬

‫‪:‬عبارات متداخلة‪ with‬مع وجود أكثر من عنصر واحد ‪ ،‬تتم معالجة مديري السياق كما لو كانت عدة‬

‫‪with A() as a, B() as b:‬‬

‫‪Pg. 103‬‬
‫‪SUITE‬‬

‫‪:‬يعادل لغويًا‬

‫‪with A() as a:‬‬

‫‪with B() as b:‬‬

‫‪SUITE‬‬

‫‪:‬يمكنك أي ً‬
‫ض ا كتابة مديري سياق متعدد العناصر في سطور متعددة إذا كانت العناصر محاطة بأقواس‪ .‬على سبيل المثال‬

‫( ‪with‬‬

‫‪A() as a,‬‬

‫‪B() as b,‬‬

‫‪):‬‬

‫‪SUITE‬‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.1‬دعم تعبيرات سياق متعددة‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.10‬دعم استخدام أقواس التجميع لكسر العبارة في أسطر متعددة‬

‫أنظر أيضا‬

‫"بيان "مع ‪PEP 343 -‬‬

‫‪ .‬لبيان‪ ‬بايثون‪ with ‬المواصفات والخلفية واألمثلة‬

‫‪ ‬بيان‪ match‬في‪8.6 ‬‬

‫الجديد في اإلصدار ‪3.10.1‬‬

‫‪:‬بيان المطابقة يستخدم لمطابقة النمط‪ .‬بناء الجملة‬

‫‪match_stmt :: = 'match' subject_expr":" NEWLINE case_blockINDENT + DEDENT‬‬

‫؟‪subject_expr :: = star_named_expression"،" star_named_expressions‬‬

‫‪| named_expression‬‬

‫‪case_block :: = 'case' patterns[ guard] ":"block‬‬

‫ملحوظة‬

‫‪ ‬‬

‫‪ .‬يستخدم هذا القسم عالمات االقتباس المفردة لإلشارة إلى‪ ‬الكلمات الرئيسية الناعمة‬
‫تتم مطابقة النمط (الذي قد يحتوي على أنماط فرعية) ‪ match). ‬تالي( وقيمة موضوع )‪ case‬يلي( تأخذ مطابقة النمط ً‬
‫نمطا كمدخل‬
‫‪:‬مع قيمة الموضوع‪ .‬النتائج هي‬

‫‪‬‬ ‫‪.‬نجاح المباراة أو فشلها (يُطلق عليه أي ً‬


‫ضا نجاح أو فشل النمط)‬

‫‪‬‬ ‫‪.‬ربط محتمل للقيم المتطابقة باسم‪ .‬تتم مناقشة‪ L‬المتطلبات المسبقة لذلك أدناه‬

‫‪ .‬كلمات و‪ ‬كلمات ناعمة ‪ case‬و‪ match‬و‬

‫أنظر أيضا‬

‫‪Pg. 104‬‬
‫‪‬‬ ‫مطابقة األنماط الهيكلية‪ :‬المواصفات ‪PEP 634 -‬‬

‫‪‬‬ ‫مطابقة األنماط الهيكلية‪ :‬البرنامج التعليمي ‪PEP 636 -‬‬

‫‪8.6.1. Overview‬‬

‫‪:‬فيما يلي نظرة عامة على التدفق المنطقي لبيان المطابقة‬

‫يتم تقييم‪ ‬تعبير‪ ‬الموضوع والحصول على قيمة الموضوع الناتجة‪ .‬إذا احتوى تعبير الموضوع على فاصلة ‪1. subject_expr‬‬
‫‪ ، .‬يتم إنشاء مجموعة باستخدام‪ ‬القواعد القياسية‬

‫ليتطابق مع قيمة الموضوع‪ .‬القواعد المحددة للنجاح أو الفشل موضحة أدناه‪ .‬يمكن‪ a ‬تتم محاولة‪ ‬كل نمط في‪2. case_block‬‬
‫أن تربط محاولة المطابقة أيضً ا بعض أو كل األسماء المستقلة داخل النمط‪ .‬تختلف قواعد ربط النمط الدقيقة حسب‪ L‬نوع‬
‫النمط وهي محددة أدناه‪  .‬روابط االسم التي تم إجراؤها أثناء مطابقة النمط الناجحة تتجاوز الكتلة المنفذة ويمكن‬
‫‪ .‬استخدامها بعد بيان المطابقة‬

‫ملحوظة‬

‫‪ ‬‬

‫أثناء تطابق النمط الفاشل ‪ ،‬قد تنجح بعض األنماط الفرعية‪ .‬ال تعتمد على االرتباطات التي يتم إجراؤها لمباراة فاشلة‪ .‬على العكس‬
‫من ذلك ‪ ،‬ال تعتمد على المتغيرات التي تظل دون تغيير بعد مطابقة فاشلة‪ .‬يعتمد السلوك الدقيق على التنفيذ وقد يختلف‪ .‬هذا قرار‬
‫‪.‬مقصود تم اتخاذه للسماح بالتطبيقات المختلفة إلضافة تحسينات‬

‫‪.‬إذا نجح النمط ‪ ،‬يتم تقييم الحارس المقابل (إن وجد)‪ .‬في هذه الحالة ‪ ،‬يتم ضمان حدوث جميع عمليات ربط األسماء‪3. L‬‬

‫‪o‬‬ ‫‪ .‬تنفيذ‪ ‬الداخل‪ case_block‬فسيتم‪ ، block‬إذا كان الحارس صحيحً ا أو مفقو ًدا‬

‫‪o‬‬ ‫‪.‬يتم محاولة‪ ‬التالي‪ ‬كما هو موضح أعاله‪ ، case_block‬خالف ذلك‬

‫‪o‬‬ ‫‪.‬إذا لم تكن هناك كتل حالة أخرى ‪ ،‬يتم إكمال بيان المباراة‬

‫ملحوظة‬

‫‪ ‬‬

‫اعتماد ا على التنفيذ ‪ ،‬قد يقوم المترجم بتخزين القيم مؤق ًتا أو استخدام‬
‫ً‬ ‫يجب أال يعتمد المستخدمون بشكل عام على نمط يتم تقييمه‪ .‬‬
‫‪.‬تحسينات أخرى تتخطى التقييمات‪ L‬المتكررة‬

‫‪:‬نموذج بيان المطابقة‬

‫>>>‬

‫‪>>> flag = False‬‬

‫‪>>> match (100, 200):‬‬

‫‪... case (100, 300): # Mismatch: 200 != 300‬‬

‫‪...‬‬ ‫)'‪print('Case 1‬‬

‫‪... case (100, 200) if flag: # Successful match, but guard fails‬‬

‫‪...‬‬ ‫)'‪print('Case 2‬‬

‫‪... case (100, y): # Matches and binds y to 200‬‬

‫‪...‬‬ ‫)'}‪print(f'Case 3, y: {y‬‬

‫‪... case _: # Pattern not attempted‬‬

‫‪Pg. 105‬‬
‫‪...‬‬ ‫)'!‪print('Case 4, I match anything‬‬

‫‪...‬‬

‫‪Case 3, y: 200‬‬

‫‪.if flag‬في هذه الحالة ‪ ،‬هو حارس‪ .‬اقرأ المزيد عن ذلك في القسم التالي‬

‫‪8.6.2. Guards‬‬

‫‪"named_expression‬حارس ‪" = ::‬إذا‬

‫متبوعًا ‪: if‬حتى يتم تنفيذ‪ ‬التعليمات البرمجية داخل‪ ‬الكتلة‪ .‬يأخذ الشكل‪ case) case‬الذي يعد جزءًا من(‪ A guard‬يجب أن ينجح‬
‫‪.‬بتعبير‬

‫‪:‬يلي‪ guard‬للكتلة مع ما‪ case‬التدفق المنطقي‬

‫‪ .‬ويتم فحص الكتلة‪ ‬التالية‪ case‬فلن يتم تقييمه‪ ، guard‬الكتلة‪ .‬إذا فشل النمط‪ case‬تحقق من نجاح النمط في ‪1.‬‬

‫‪ guard.‬إذا نجح النمط ‪ ،‬فقم بتقييم ‪2.‬‬

‫‪o‬‬ ‫‪.‬تقييم الشرط على أنه صحيح ‪ ،‬يتم تحديد كتلة الحالة‪ guard‬إذا تم‬

‫‪o‬‬ ‫‪.‬تقييم الشرط على أنه خطأ ‪ ،‬فلن يتم تحديد كتلة الحالة‪ guard‬إذا تم‬

‫‪o‬‬ ‫‪.‬االستثناء أثناء التقييم إلى ظهور فقاعات االستثناء‪ guard‬إذا أدى‬

‫يسمح للحراس بالتعرض آلثار جانبية ألنها تعبيرات‪  .‬يجب أن ينتقل تقييم الحراسة من أول كتلة حالة إلى أخرى ‪ ،‬واحدة تلو األخرى‬
‫‪ ،‬مع تخطي كتل الحالة التي ال ينجح نمطها (أنماطها) كلها‪(  .‬أي ‪ ،‬تقييم الحارس يجب أن يتم بالترتيب)‪ .‬يجب أن يتوقف تقييم‬
‫‪.‬الحراسة بمجرد تحديد مجموعة حالة‬

‫‪ ‬كتل القضية التي ال يمكن دحضها‪8.6.3. ‬‬

‫كتلة الحالة التي ال يمكن دحضها هي كتلة حالة تطابق جميع‪  .‬قد يحتوي بيان المطابقة على مجموعة حالة واحدة على األكثر ال يمكن‬
‫‪.‬دحضها ‪ ،‬ويجب أن تكون أخيرً ا‬

‫تعتبر كتلة العلبة غير قابلة للدحض إذا لم يكن بها حراسة وكان نمطها غير قابل للدحض‪ .‬يعتبر النمط غير قابل للدحض إذا استطعنا‬
‫‪:‬أن نثبت من تركيبه وحده أنه سينجح دائمًا‪ .‬فقط األنماط التالية ال يمكن دحضها‬

‫‪‬‬ ‫التي ال يمكن دحض جانبها األيسر‪ AS ‬أنماط‬

‫‪‬‬ ‫أو األنماط‪ ‬التي تحتوي على نمط واحد على األقل ال يمكن دحضه‬
‫‪‬‬ ‫التقاط األنماط‬
‫‪‬‬ ‫أنماط البدل‬
‫‪‬‬ ‫أنماط ال يمكن دحضها بين قوسين‬

‫‪8.6.4. Patterns‬‬

‫ملحوظة‬

‫‪ ‬‬

‫‪ EBNF:‬يستخدم هذا القسم تدوينات النحو التي تتجاوز معيار‬

‫‪‬‬ ‫*)‪RULE (SEP RULE‬هو اختصار ل‪ SEP.RULE+‬التدوين‬

‫‪‬‬ ‫هو اختصار لتأكيد إلقاء نظرة سلبية‪ !RULE‬الترميز‬

‫‪Pg. 106‬‬
‫‪:‬هي‪ patterns‬صيغة المستوى األعلى لـ‬

‫األنماط‬ ‫‪:: = open_sequence_pattern|pattern‬‬

‫نمط‬ ‫‪:: = as_pattern|or_pattern‬‬

‫‪ :: = | literal_pattern‬مغلق_باترن‬

‫‪| capture_pattern‬‬

‫‪| wildcard_pattern‬‬

‫‪| value_pattern‬‬

‫‪| group_pattern‬‬

‫‪| sequence_pattern‬‬

‫‪| mapping_pattern‬‬

‫‪|class_pattern‬‬

‫لمستند ‪ Raymond Hettinger‬اعتمادات لـ( ستتضمن األوصاف أدناه وص ًف ا "بعبارات بسيطة" لما يفعله النمط ألغراض التوضيح‬
‫الحظ أن هذه األوصاف هي ألغراض التوضيح فقط‪ ‬وقد ال‪ ‬تعكس التنفيذ األساسي‪ .‬عالوة على ذلك ‪ ،‬فهي ال‪). ‬ألهم معظم األوصاف‬
‫‪.‬تغطي جميع النماذج الصالحة‬

‫‪ ‬أنماط ‪8.6.4.1. OR‬‬

‫‪:‬عبارة عن نمطين أو أكثر مفصولة بأشرطة عمودية‪ .| ‬بناء الجملة ‪ OR‬نمط‬

‫‪or_pattern :: = "|". closed_pattern+‬‬

‫‪.‬قد يكون النمط الفرعي األخير فقط غير قابل‪ ‬للدحض‪ ، ‬ويجب أن يربط كل نمط فرعي نفس مجموعة األسماء‪ L‬لتجنب الغموض‬

‫ناجحً ا‪ .‬وإال ‪ ،‬إذا لم ينجح أي ‪ OR‬مع كل نمط فرعي بدوره مع قيمة الموضوع ‪ ،‬حتى ينجح أحدها‪ .‬ثم يعتبر نمط ‪ OR‬يتطابق نمط‬
‫‪ OR.‬من األنماط الفرعية ‪ ،‬يفشل النمط‬

‫بعبارات بسيطة ‪ ،‬ستحاول المطابقة‪ ، ‬إذا فشلت ‪ ،‬ستحاول المطابقة‪ ، ‬وتنجح على الفور إذا نجح أي منها ‪ ،‬وتفشل على‪ ‬خالف‬
‫‪.P1 | P2 | ...P1P2‬ذلك‬

‫‪ ‬أنماط ‪8.6.4.2. AS‬‬

‫‪:‬الكلمة الرئيسية مقابل موضوع‪ .‬بناء الجملة‪ as ‬الموجود على يسار ‪ OR‬نمط ‪ AS‬يطابق نمط‬

‫‪as_pattern :: = or_pattern"as"capture_pattern‬‬

‫‪ as‬يربط الموضوع باالسم الموجود على يمين الكلمة األساسية ‪ AS‬وإال ‪ ،‬فإن نمط‪ AS. ‬يفشل نمط ‪ OR ،‬إذا فشل النمط‬
‫‪ aa _.‬ال يمكن أن يكون‪. capture_pattern‬وينجح‬

‫>‪ .P as NAMEPNAME = <subject‬بعبارات بسيطة‪ ‬سوف تتطابق مع‪ ، ‬وعند النجاح ستحدد‬

‫‪ ‬األنماط الحرفية‪8.6.4.3. ‬‬

‫‪:‬يتوافق النمط الحرفي مع معظم‪ ‬األحرف‪ ‬في بايثون‪ .‬بناء الجملة‬

‫‪literal_pattern :: = signed_number‬‬

‫‪| signed_number"+" NUMBER‬‬

‫عدد "‪| signed_number"-‬‬

‫‪Pg. 107‬‬
‫‪| strings‬‬

‫"ال أحد" |‬

‫"حقيقي" |‬

‫"خاطئة" |‬

‫عدد "‪| signed_number: NUMBER | "-‬‬

‫في‪ ‬قواعد لغة بايثون القياسية‪ . ‬يتم دعم السالسل الثالثية بين عالمات ‪ NUMBER‬والرمز المميز‪ strings‬يتم تعريف‪ ‬القاعدة‬
‫‪.‬االقتباس‪ .‬يتم دعم السالسل األولية وسالسل البايت‪ .‬القيم الحرفية للسلسلة المنسقة‪ ‬غير مدعومة‬

‫أشكال‪ ‬و‪ ‬هي للتعبير عن‪ ‬األعداد المركبة‪ . ‬تتطلب رقمًا حقيقيًا على اليسار ورقمًا وهميًا على اليمين‪ .‬على سبيل‬
‫‪ .signed_number '+' NUMBERsigned_number '-' NUMBER3 + 4j‬المثال‬

‫‪.<subject> == LITERALNoneTrueFalseis‬لن تنجح إال إذا‪ . ‬لسنغلتونس‪ ، ‬و‪ ، ‬و‪ ‬يستخدم المشغل‪ ، LITERAL‬بعبارات بسيطة‬

‫‪ ‬أنماط القبض‪8.6.4.4. ‬‬

‫‪:‬نمط االلتقاط يربط قيمة الموضوع باالسم‪ .‬بناء الجملة‬

‫‪Capture_pattern :: =! '_' NAME‬‬

‫الشرطة السفلية المفردة‪_ ‬ليست نمط التقاط (هذا ما‪ '_'! ‬يعبر عنه)‪ .‬بدالً من ذلك يتم التعامل معها‪ L‬على أنها‬
‫‪ wildcard_pattern.‬ملف‬

‫في نمط معين ‪ ،‬ال يمكن ربط االسم المحدد إال مرة واحدة‪ .‬على سبيل المثال‪ ‬غير صالح بينما‪ ‬مسموح‬
‫‪.case x, x: ...case [x] | x: ...‬به‬

‫؛‪ ‬يصبح االسم متغيرً ا ‪PEP 572 ‬تنجح أنماط االلتقاط دائمًا‪  .‬يتبع االرتباط قواعد تحديد النطاق التي وضعها عامل تعبير اإلسناد في‬
‫‪.‬عبارةقابلة للتطبيق‪nonlocal‬أو‪global‬محليًا في أقرب نطاق وظيفي يحتوي على ما لم يكن هناك تطبيق‬

‫>‪ .NAME = <subject‬ستنجح دائمًا وستحدد‪ NAME‬بعبارات بسيطة‬

‫‪ ‬أنماط البدل‪8.6.4.5. ‬‬

‫‪:‬ينجح نمط أحرف البدل دائمًا (يتطابق مع أي شيء) وال يربط أي اسم‪ .‬بناء الجملة‬

‫'_' = ‪wildcard_pattern ::‬‬

‫تعبيرات ‪ match‬هي‪ ‬كلمة رئيسية ناعمة‪ ‬داخل أي نمط ‪ ،‬ولكن فقط ضمن األنماط‪ .‬إنه معرف ‪ ،‬كالعادة ‪ ،‬حتى داخل_‬
‫‪.‬والكتل‪ ، guards ، case‬الموضوع‬

‫‪.‬بعبارات بسيطة ‪_ ،‬سوف تنجح دائمًا‬

‫‪ ‬أنماط القيمة‪8.6.4.6. ‬‬

‫‪:‬يمثل نمط القيمة قيمة مسماة في بايثون‪ .‬بناء الجملة‬

‫‪ :: = attr‬نمط_قيمة‬

‫‪attr‬‬ ‫اسم "‪:: = name_or_attr".‬‬

‫اسم |‪name_or_attr :: = attr‬‬

‫القياسية‪ . ‬ينجح النمط إذا كانت القيمة التي تم العثور عليها ‪ Python‬يتم البحث عن االسم المنقط في النموذج باستخدام‪ ‬قواعد دقة اسم‬
‫‪.‬تقارن بقيمة الموضوع (باستخدام‪== ‬عامل المساواة)‬

‫‪<subject> == NAME1.NAME2‬ستنجح فقط إذا‪ NAME1.NAME2‬بعبارات بسيطة‬

‫‪Pg. 108‬‬
‫ملحوظة‬

‫‪ ‬‬

‫إذا حدثت نفس القيمة عدة مرات في نفس عبارة المطابقة ‪ ،‬فقد يقوم المترجم بتخزين القيمة األولى الموجودة مؤق ًتا وإعادة استخدامها‬
‫ً‬
‫ارتباطا صارمًا بتنفيذ معين لعبارة مطابقة معينة‬ ‫‪.‬بدالً من تكرار البحث نفسه‪ .‬ترتبط ذاكرة التخزين المؤقت هذه‬

‫‪ ‬أنماط المجموعة‪8.6.4.7. ‬‬

‫يسمح نمط المجموعة للمستخدمين بإضافة أقواس حول األنماط للتأكيد على التجميع المقصود‪ .‬خالف ذلك ‪ ،‬فإنه ال يحتوي على بناء‬
‫‪:‬جملة إضافي‪ .‬بناء الجملة‬

‫")"‪group_pattern :: = "(" pattern‬‬

‫‪ P.‬لها نفس التأثير مثل)‪ (P‬بعبارات بسيطة‬

‫‪ ‬أنماط التسلسل‪8.6.4.8. ‬‬

‫‪ .‬يحتوي نمط التسلسل على عدة أنماط فرعية ليتم مطابقتها مع عناصر التسلسل‪ .‬بناء الجملة مشابه لتفريغ قائمة أو مجموعة‬

‫‪Sequ_pattern‬‬ ‫"]" ]‪:: = "[" [ maybe_sequence_pattern‬‬

‫")" ]‪| "(" [ open_sequence_pattern‬‬

‫]‪open_sequence_pattern :: = maybe_star_pattern"،" [ maybe_sequence_pattern‬‬

‫؟"‪might_sequence_pattern :: = "،". maybe_star_pattern+ "،‬‬

‫‪_star_pattern‬ربما‬ ‫‪:: = star_pattern|pattern‬‬

‫‪star_pattern‬‬ ‫)‪:: = "*" ( capture_pattern| wildcard_pattern‬‬

‫‪ .‬ال يوجد فرق إذا تم استخدام األقواس أو األقواس المربعة ألنماط التسلسل (على سبيل المثال‪)...( ‬مقابل‪)]...[ ‬‬

‫ملحوظة‬

‫‪ ‬‬

‫النمط الفردي المحاط بأقواس بدون فاصلة الحقة (على سبيل المثال‪ ) ‬هو‪ ‬نمط مجموعة‪ . ‬في حين أن النمط الفردي المحاط بأقواس‬
‫مربعة (على سبيل المثال‪ ) ‬ال يزال نمط تسلسل‪]4 | 3[)4 | 3(.‬‬
‫ً‬
‫واحدا على األكثر في نمط تسلسلي‪ .‬قد يحدث النمط الفرعي النجمي في أي موضع‪ .‬في حالة عدم‬ ‫قد يكون النمط الفرعي النجمي‬
‫‪ .‬وجود نمط فرعي نجمي ‪ ،‬يكون نمط التسلسل هو نمط تسلسل ثابت الطول ؛‪ ‬وإال فهو نمط تسلسل متغير الطول‬

‫‪:‬ما يلي هو التدفق المنطقي لمطابقة نمط تسلسل مقابل قيمة موضوع‬

‫‪.‬إذا لم تكن قيمة الموضوع عبارة عن تسلسل‪ ، 2 ‬يفشل نمط التسلسل ‪1.‬‬

‫‪.‬فشل نمط التسلسل‪ bytearray ‬أو‪ str، bytes‬إذا كانت قيمة الموضوع مثيالً لـ ‪2.‬‬

‫‪.‬تعتمد الخطوات الالحقة على ما إذا كان نمط التسلسل ثاب ًتا أم متغير الطول ‪3.‬‬

‫‪:‬إذا كان نمط التسلسل ثابت الطول‬

‫إذا كان طول تسلسل الموضوع ال يساوي عدد األنماط الفرعية ‪ ،‬يفشل نمط التسلسل ‪1.‬‬

‫‪2.‬‬ ‫يتم مطابقة األنماط الفرعية في نمط التسلسل مع العناصر المقابلة لها في تسلسل الموضوع من اليسار إلى‬
‫اليمين‪ .‬تتوقف المطابقة بمجرد فشل النمط الفرعي‪ .‬إذا نجحت جميع األنماط الفرعية في مطابقة العنصر المقابل‬
‫‪.‬لها ‪ ،‬ينجح نمط التسلسل‬

‫‪Pg. 109‬‬
‫‪:‬خالف ذلك ‪ ،‬إذا كان نمط التسلسل متغير الطول‬

‫‪.‬إذا كان طول تسلسل الموضوع أقل من عدد األنماط الفرعية غير النجمية ‪ ،‬يفشل نمط التسلسل ‪3.‬‬

‫‪4.‬‬ ‫تتم مطابقة األنماط الفرعية غير النجمية البادئة مع العناصر المقابلة لها كما هو الحال بالنسبة للتسلسالت ذات‬
‫‪.‬الطول الثابت‬

‫‪5.‬‬ ‫إذا نجحت الخطوة السابقة ‪ ،‬فإن النمط الفرعي النجمة يطابق قائمة مكونة من عناصر الموضوع المتبقية ‪،‬‬
‫‪.‬باستثناء العناصر المتبقية المقابلة لألنماط الفرعية غير النجمية التي تتبع النمط الفرعي النجمة‬

‫‪6.‬‬ ‫تتم مطابقة األنماط الفرعية غير النجمية المتبقية مع عناصر الموضوع المقابلة لها ‪ ،‬كما هو الحال بالنسبة‬
‫‪.‬للتسلسل ذي الطول الثابت‬

‫ملحوظة‬

‫‪ ‬‬

‫قد يتم تخزين هذا الطول مؤق ًتا بواسطة ‪). ‬البروتوكول)(__‪ __len‬أي عبر()(‪ len‬يتم الحصول على طول تسلسل الموضوع عبر‬
‫‪ .‬المترجم بطريقة مماثلة‪ ‬ألنماط القيمة‬

‫]>‪:[P1, P2, P3,, P<N‬بعبارات بسيطة‪ ... ‬يطابق فقط إذا حدث كل ما يلي‬

‫‪‬‬ ‫هو تسلسل>‪ <subject‬االختيار‬

‫‪‬‬ ‫>‪len(subject) == <N‬‬

‫‪‬‬ ‫)الحظ أن هذه المطابقة يمكن أن تربط أيضً ا األسماء(]‪ <subject>[0‬المطابقات‪P1‬‬

‫‪‬‬ ‫)الحظ أن هذه المطابقة يمكن أن تربط أيضً ا األسماء(]‪ <subject>[1‬المطابقات‪P2‬‬

‫‪‬‬ ‫‪.‬وما إلى ذلك بالنسبة للنمط ‪ /‬العنصر المقابل …‬

‫‪ ‬أنماط رسم الخرائط‪8.6.4.9. ‬‬

‫‪ :‬يحتوي نمط التعيين على واحد أو أكثر من أنماط القيمة الرئيسية‪ .‬بناء الجملة مشابه لبناء القاموس‪ .‬بناء الجملة‬

‫‪mapping_pattern‬‬ ‫"}" ]‪:: = "{" [ items_pattern‬‬

‫‪items_pattern‬‬ ‫؟"‪:: = "،". key_value_pattern+ "،‬‬

‫‪key_value_pattern :: = ( literal_pattern| value_pattern) ":" pattern‬‬

‫‪|double_star_pattern‬‬

‫‪double_star_pattern :: = "**"capture_pattern‬‬

‫قد يكون نمط النجمة المزدوجة على األكثر في نمط الخرائط‪  .‬يجب أن يكون نمط النجمة المزدوجة هو النمط الفرعي األخير في نمط‬
‫‪.‬التعيين‬

‫مفتاحان لهما نفس ‪ SyntaxError. ‬ال يُسمح بالمفاتيح المكررة في أنماط التعيين‪ .‬ستؤدي المفاتيح الحرفية المكررة إلى رفع ملف‬
‫‪.‬في وقت التشغيل‪ a ValueError‬القيمة بخالف ذلك سيرفعان‬

‫‪:‬ما يلي هو التدفق المنطقي لمطابقة نمط تعيين مقابل قيمة موضوع‬

‫‪.‬إذا لم تكن قيمة الموضوع عبارة عن تعيين‪ ، 3 ‬يفشل نمط التعيين ‪1.‬‬

‫‪2.‬‬ ‫ً‬
‫موجود ا في تعيين الموضوع ‪ ،‬وكان نمط كل مفتاح يطابق العنصر المقابل في‬ ‫إذا كان كل مفتاح معطى في نمط التعيين‬
‫‪.‬تعيين الموضوع ‪ ،‬فإن نمط التعيين ينجح‬

‫‪Pg. 110‬‬
‫للقيم الحرفية ‪ A ‬يتم رفع‪. SyntaxError‬إذا تم اكتشاف مفاتيح مكررة في نمط التعيين ‪ ،‬فسيتم اعتبار النمط غير صالح ‪3.‬‬
‫‪.‬للمفاتيح المسماة‪ L‬بنفس القيمة‪ ValueError‬المكررة؛‪ ‬أو‬

‫ملحوظة‬

‫‪ ‬‬

‫لطريقة‪ ‬موضوع التعيين‪ . ‬يجب أن تكون أزواج القيمة الرئيسية )(‪ get‬تتم مطابقة أزواج القيمة والمفتاح باستخدام نموذج الوسيطتين‬
‫‪ __getitem__().‬أو)(__‪ __missing‬المتطابقة موجودة بالفعل في التعيين ‪ ،‬وال يتم إنشاؤها أثناء التنقل عبر‬

‫}‪:{KEY1: P1, KEY2: P2, ... ‬بعبارات بسيطة‪ ‬تتطابق فقط إذا حدث كل ما يلي‬

‫‪‬‬ ‫هو تعيين>‪ <subject‬االختيار‬

‫‪‬‬ ‫>‪KEY1 in <subject‬‬

‫‪‬‬ ‫]‪ <subject>[KEY1‬اعواد الكبريت‪P1 ‬‬

‫‪‬‬ ‫‪.‬وما إلى ذلك بالنسبة لزوج المفتاح ‪ /‬النمط المقابل ‪...‬‬

‫‪ ‬أنماط الطبقة‪8.6.4.10. ‬‬

‫‪:‬يمثل نمط الفصل فئة وحججها الموضعية والكلمات الرئيسية (إن وجدت)‪ .‬بناء الجملة‬

‫‪class_pattern‬‬ ‫")" ]؟"‪:: = name_or_attr"(" [ pattern_arguments"،‬‬

‫]‪pattern_arguments :: = positional_patterns["،" keyword_patterns‬‬

‫‪| keyword_patterns‬‬

‫‪positional_patterns :: = "،". pattern+‬‬

‫‪keyword_patterns :: = "،". keyword_pattern+‬‬

‫‪keyword_pattern‬‬ ‫‪:: = NAME "="pattern‬‬

‫‪.‬ال ينبغي أن تتكرر نفس الكلمة الرئيسية في أنماط الفصل‬

‫‪:‬ما يلي هو التدفق المنطقي لمطابقة نمط فئة مقابل قيمة موضوع‬

‫‪ TypeError.‬فقم‪ ‬برفع‪ type، ‬لم يكن مثياًل للمُدمج‪ name_or_attr‬إذا ‪1.‬‬

‫‪.‬يفشل نمط الفئة ‪ isinstance()) ،‬تم اختباره عبر(‪ name_or_attr‬إذا لم تكن قيمة الموضوع مثيالً لـ ‪2.‬‬

‫‪3.‬‬ ‫في حالة عدم وجود وسيطات للنمط ‪ ،‬ينجح النمط‪  .‬بخالف ذلك ‪ ،‬تعتمد الخطوات الالحقة على ما إذا كانت الكلمات‬
‫‪.‬األساسية‪ L‬أو أنماط الوسيطة الموضعية موجودة‬

‫بالنسبة لعدد من األنواع المضمنة (المحددة أدناه) ‪ ،‬يتم قبول نمط فرعي موضعي واحد يتطابق مع الموضوع بأكمله ؛‪ ‬بالنسبة لهذه‬
‫ضا مع األنواع األخرى‬ ‫‪.‬األنواع ‪ ،‬تعمل أنماط الكلمات الرئيسية أي ً‬

‫‪:‬في حالة وجود أنماط الكلمات الرئيسية فقط ‪ ،‬تتم معالجتها على النحو التالي ‪ ،‬واح ًدا تلو اآلخر‬

‫‪.‬تم البحث عن الكلمة األساسية كسمة‪ L‬للموضوع ‪1.‬‬

‫‪o‬‬ ‫‪.‬فإن االستثناء ينفجر ‪ AttributeError،‬إذا كان هذا يثير استثنا ًء بخالف ذلك‬

‫‪o‬‬ ‫‪.‬زاد‪ ‬هذا‪ ، ‬فقد فشل النمط الطبقي‪ AttributeError‬إذا‬

‫‪o‬‬ ‫وإال ‪ ،‬فإن النمط الفرعي المرتبط بنمط الكلمة الرئيسية يطابق قيمة سمة الموضوع‪ .‬إذا فشل هذا ‪ ،‬فإن نمط‬
‫‪.‬الفصل يفشل ؛‪ ‬إذا نجح ذلك ‪ ،‬تنتقل المطابقة إلى الكلمة الرئيسية التالية‬

‫‪Pg. 111‬‬
‫‪.‬إذا نجحت جميع أنماط الكلمات الرئيسية ‪ ،‬فإن نمط الفصل ينجح‪II. ‬‬

‫السمة الموجودة في __‪ __match_args‬في حالة وجود أي أنماط موضعية ‪ ،‬يتم تحويلها إلى أنماط كلمات رئيسية باستخدام‬
‫‪:‬قبل المطابقة‪ name_or_attr‬الفئة‬

‫))(‪ .getattr(cls, "__match_args__", ‬ما يعادل ‪I.‬‬

‫‪o‬‬ ‫‪.‬إذا كان هذا يثير استثنا ًء ‪ ،‬فإن االستثناء يطفو على السطح‬

‫‪o‬‬ ‫‪.‬ويتم رفعه‪ TypeError‬إذا لم تكن القيمة التي تم إرجاعها عبارة عن مجموعة ‪ ،‬يفشل التحويل‬

‫‪o‬‬ ‫‪.‬يتم رفعها‪ len(cls.__match_args__)، TypeError‬إذا كان هناك أنماط موضعية أكثر من‬

‫‪o‬‬ ‫الكلمة ]‪ __match_args__[i‬يتم تحويل‪ ‬النمط‪ ‬الموضعي إلى نمط كلمة رئيسية باستخدام‪ ، i‬خالف ذلك‬
‫‪.‬يتم رفعه‪ TypeError‬يجب أن يكون سلسلة ؛‪ ‬إذا لم]‪. __match_args__[i‬األساسية‪L‬‬

‫‪o‬‬ ‫‪.‬يتم رفعها‪ ، TypeError‬إذا كانت هناك كلمات مكررة‬

‫أنظر أيضا‬

‫‪ ‬‬

‫تخصيص الحجج الموضعية في مطابقة نمط الفصل‬

‫‪ ،‬بمجرد تحويل جميع األنماط الموضعية إلى أنماط الكلمات الرئيسية‪II. ‬‬

‫‪.‬تستمر المطابقة كما لو كانت هناك أنماط كلمات رئيسية فقط‬

‫‪:‬بالنسبة لألنواع المضمنة التالية ‪ ،‬يختلف التعامل مع األنماط الفرعية الموضعية‬

‫‪o‬‬ ‫‪bool‬‬

‫‪o‬‬ ‫‪bytearray‬‬

‫‪o‬‬ ‫‪bytes‬‬

‫‪o‬‬ ‫‪dict‬‬

‫‪o‬‬ ‫‪float‬‬

‫‪o‬‬ ‫‪frozenset‬‬

‫‪o‬‬ ‫‪int‬‬

‫‪o‬‬ ‫‪list‬‬

‫‪o‬‬ ‫‪set‬‬

‫‪o‬‬ ‫‪str‬‬

‫‪o‬‬ ‫‪tuple‬‬

‫يتطابق)‪ ، int(0|1‬تقبل هذه الفئات حجة موضعية واحدة ‪ ،‬ويتم مطابقة النمط هناك مع الكائن بأكمله بدالً من سمة‪ .‬على سبيل المثال‬
‫‪ False.‬مع القيمة‪ ،0 ‬ولكن ال‪ ‬يتطابق مع‪ ‬القيم‪0.0 ‬أو‬

‫)‪:CLS(P1, attr=P2‬بعبارات بسيطة‪ ‬تتطابق فقط إذا حدث ما يلي‬

‫‪‬‬ ‫)‪isinstance(<subject>, CLS‬‬

‫‪‬‬ ‫__‪CLS.__match_args‬إلى نمط الكلمات‪ L‬الرئيسية باستخدام‪ P1‬تحويل‬

‫‪Pg. 112‬‬
‫‪‬‬ ‫‪ attr=P2:‬لكل وسيطة كلمة رئيسية‬

‫‪o‬‬ ‫)"‪hasattr(<subject>, "attr‬‬

‫‪o‬‬ ‫‪ <subject>.attr‬اعواد الكبريت‪P2 ‬‬

‫‪‬‬ ‫‪.‬وما إلى ذلك بالنسبة إلى زوج الكلمات الرئيسية ‪ /‬النمط المقابل ‪...‬‬

‫أنظر أيضا‬

‫‪‬‬ ‫مطابقة األنماط الهيكلية‪ :‬المواصفات ‪PEP 634 -‬‬

‫‪‬‬ ‫مطابقة األنماط الهيكلية‪ :‬البرنامج التعليمي ‪PEP 636 -‬‬

‫‪ ‬تعريفات الوظائف‪8.7 ‬‬

‫‪:‬يعرّ ف تعريف الوظيفة كائن دالة مع ّرف من قبل المستخدم (راجع قسم‪ ‬التدرج الهرمي للنوع القياسي‪) ‬‬

‫‪funcdef‬‬ ‫")" ]‪:: = [ decorators] "def" funcname"(" [ parameter_list‬‬

‫‪["->" expression] ":"suite‬‬

‫الديكور‬ ‫‪:: = decorator+‬‬

‫مصمم‬ ‫‪:: = "@" assignment_expressionNEWLINE‬‬

‫‪parameter_list‬‬ ‫[" ‪:: = defparameter("،" defparameter) * "،" / "["،‬‬


‫]]‪parameter_list_no_posonly‬‬

‫‪| parameter_list_no_posonly‬‬

‫]]‪parameter_list_no_posonly :: = defparameter("،" defparameter) * ["،" [ parameter_list_starargs‬‬

‫‪| parameter_list_starargs‬‬

‫]]]"‪parameter_list_starargs :: = "*" [ parameter] ("،" defparameter) * ["،" ["**" parameter["،‬‬

‫]"‪| "**" parameter["،‬‬

‫المعلمة‬ ‫]‪:: = identifier[":" expression‬‬

‫‪defparameter‬‬ ‫]‪:: = parameter["=" expression‬‬

‫‪funcname‬‬ ‫‪:: = identifier‬‬

‫تعريف الدالة هو بيان قابل للتنفيذ‪  .‬يؤدي تنفيذها إلى ربط اسم الوظيفة في مساحة االسم المحلية الحالية بكائن دالة (غالف حول الكود‬
‫القابل للتنفيذ للوظيفة)‪ .‬يحتوي كائن الوظيفة هذا على مرجع إلى مساحة‪ L‬االسم العمومية الحالية كمساحة االسم العمومية التي سيتم‬
‫‪.‬استخدامها عند استدعاء الوظيفة‬

‫تعريف الوظيفة ال ينفذ الجسم الوظيفي ؛‪ ‬يتم تنفيذ هذا فقط عندما يتم استدعاء الوظيفة‪4 .‬‬

‫عند تحديد الوظيفة ‪ ،‬في ‪ Decorator‬يمكن تغليف تعريف الوظيفة بواسطة‪ ‬تعبير‪ ‬أو أكثر من‪ ‬تعبيرات‪ ‬الزخرفة‪ . ‬يتم تقييم تعبيرات‬
‫النطاق الذي يحتوي على تعريف الوظيفة‪  .‬يجب أن تكون النتيجة قابلة لالستدعاء ‪ ،‬والتي يتم استدعاؤها باستخدام كائن الوظيفة‬
‫باعتباره الوسيطة الوحيدة‪  .‬ترتبط القيمة التي تم إرجاعها باسم الوظيفة بدالً من كائن الوظيفة‪ .‬يتم تطبيق العديد من الزخارف بطريقة‬
‫متداخلة‪ .‬على سبيل المثال ‪ ،‬الكود التالي‬

‫)‪@f1(arg‬‬

‫‪@f2‬‬

‫‪Pg. 113‬‬
‫‪def func(): pass‬‬

‫يعادل تقريبًا‬

‫‪def func(): pass‬‬

‫))‪func = f1(arg)(f2(func‬‬

‫‪ func.‬فيما عدا أن الوظيفة األصلية غير مرتبطة مؤق ًتا باالسم‬

‫في السابق ‪ ،‬كانت القواعد أكثر ‪ assignment_expression. ‬تم التغيير في اإلصدار ‪ :3.9‬يمكن تزيين الوظائف بأي منها صالح‬
‫‪.‬لمزيد من التفاصيل‪PEP 614 ‬تقيي ًدا ؛‪ ‬ارى‬

‫عندما‪ ‬تحتوي‪ ‬معلمة‪ ‬واحدة أو أكثر‪ ‬على‪ ‬تعبير‪  ‬معلمة‪ ‬النموذج‪ ، ‬يُقال أن الوظيفة لها "قيم المعلمات‪ L‬االفتراضية‪ ".‬بالنسبة إلى المعلمة‬
‫ذات القيمة االفتراضية ‪ ،‬يمكن حذف‪ ‬الوسيطة‪ ‬المقابلة‪ ‬من االستدعاء ‪ ،‬وفي هذه الحالة يتم استبدال القيمة االفتراضية للمعامل‪ .‬إذا‬
‫ضا على قيمة افتراضية ‪ -‬وهذا قيد‬ ‫كانت المعلمة تحتوي على قيمة افتراضية ‪ ،‬فيجب أن تحتوي‪ ‬جميع المعلمات‪ L‬التالية حتى "‪ " ‬أي ً‬
‫*‪.= ‬نحوي ال يتم التعبير عنه بواسطة القواعد النحوية‬

‫يتم تقييم قيم المعلمات االفتراضية من اليسار إلى اليمين عند تنفيذ تعريف الوظيفة‪  .‬هذا يعني أنه يتم تقييم التعبير مرة واحدة ‪،‬‬
‫عندما يتم تحديد الوظيفة ‪ ،‬ويتم استخدام نفس القيمة "المحسوبة مسب ًقا" لكل استدعاء‪ .‬هذا مهم بشكل خاص لفهم متى تكون قيمة‬
‫المعلمة االفتراضية كائ ًن ا قابل للتغيير ‪ ،‬مثل قائمة أو قاموس‪ :‬إذا كانت الوظيفة تعدل الكائن (على سبيل المثال عن طريق إلحاق‬
‫عنصر بقائمة) ‪ ،‬يتم تعديل قيمة المعلمة االفتراضية في الواقع‪ .‬هذا بشكل عام ليس ما كان المقصود‪ .‬هناك طريقة للتغلب على ذلك‬
‫‪:‬الوضع االفتراضي واختباره بشكل صريح في جسم الوظيفة ‪ ،‬على سبيل المثال‪ None‬وهي استخدام‬

‫‪def whats_on_the_telly(penguin=None):‬‬

‫‪if penguin is None:‬‬

‫][ = ‪penguin‬‬

‫)"‪penguin.append("property of the zoo‬‬

‫‪return penguin‬‬

‫تم وصف دالالت استدعاء الوظائف بمزيد من التفصيل في قسم‪ ‬المكالمات‪ . L‬يقوم استدعاء الوظيفة دائمًا بتعيين القيم لجميع المعلمات‬
‫المذكورة في قائمة المعلمات‪ ، L‬إما من الوسائط الموضعية أو من وسيطات الكلمات‪ L‬الرئيسية أو من القيم االفتراضية‪ .‬إذا كان النموذج‬
‫موجود ا ‪ ،‬فسيتم تهيئته إلى المجموعة التي تتلقى أي معامالت موضعية زائدة ‪ ،‬بشكل افتراضي إلى المجموعة "‪" *identifier‬‬ ‫ً‬
‫موجو ًد ا ‪ ،‬فسيتم تهيئته إلى تعيين مرتب جديد يتلقى أي وسيطات أساسية زائدة ‪ ،‬ويتم "‪ " **identifier‬الفارغة‪ .‬إذا كان النموذج‬
‫هي معلمات للكلمات الرئيسية فقط وال "‪ " *identifier‬تعيينه افتراضيًا على تعيين فارغ جديد من نفس النوع‪ .‬المعلمات‪ L‬بعد "‪ "* ‬أو‬
‫يمكن تمريرها إال من خالل وسيطات الكلمات الرئيسية‪ .‬المعلمات التي تسبق "‪ "/ ‬هي معلمات موضعية فقط وال يجوز تمريرها إال‬
‫‪.‬من خالل الوسائط الموضعية‬

‫‪PEP‬تغير في اإلصدار ‪ :3.8‬و‪/ ‬ظيفة المعلمة في بناء الجملة يمكن أن تستخدم لإلشارة إلى معلمات‪ L‬الموضعية فقط‪ .‬ارى‬
‫‪.‬للحصول على التفاصيل‪570 ‬‬

‫قد تحتوي المعلمات على‪ ‬تعليق توضيحي‪ ‬على النموذج "‪ " ‬بعد اسم المعلمة‪ .‬قد تحتوي أي معلمة على تعليق توضيحي ‪ ،‬حتى تلك‬
‫الموجودة في النموذج‪ ‬أو‪ . ‬قد يكون للوظائف تعليق توضيحي "رجوع" على شكل "‪ " ‬بعد قائمة المعلمات‪ L.‬يمكن أن تكون هذه‬
‫التعليقات التوضيحية أي تعبير صالح للبايثون‪  .‬ال يؤدي وجود التعليقات التوضيحية إلى تغيير دالالت الوظيفة‪ .‬تتوفر قيم التعليق‬
‫التوضيحي كقيم لقاموس يتم تمييزها بواسطة أسماء المعلمات في‪ ‬سمة كائن الوظيفة‪ .‬إذا كان‪ ‬االستيراد‬
‫يتم استخدام __‪ : expression*identifier**identifier-> expression__annotations__annotations__future‬من‬
‫التعليقات التوضيحية كسالسل في وقت التشغيل مما يتيح التقييم المؤجل‪ .‬خالف ذلك ‪ ،‬يتم تقييمها عند تنفيذ تعريف الوظيفة‪ .‬في هذه‬
‫‪.‬الحالة ‪ ،‬قد يتم تقييم التعليقات التوضيحية بترتيب مختلف عما يظهر في شفرة المصدر‬

‫من الممكن أيضً ا إنشاء وظائف مجهولة (وظائف غير مرتبطة باالسم) ‪ ،‬لالستخدام الفوري في التعبيرات‪ .‬يستخدم هذا تعبيرات المدا‬
‫يمكن تمرير‪ ‬دالة محددة في عبارة ‪ def‬هو مجرد اختصار لتعريف دالة مبسط ؛ ‪ lambda‬الموضحة في قسم‪ ‬المدا‪ . ‬الحظ أن تعبير‬

‫‪Pg. 114‬‬
‫شكل‪ " " ‬هو في الواقع أكثر قوة ألنه يسمح ‪ " " lambda. def‬أو تخصيصها السم آخر تمامًا مثل الوظيفة المحددة بواسطة تعبير‬
‫‪.‬بتنفيذ العديد من العبارات والتعليقات التوضيحية‬

‫تحدد العبارة‪ " " ‬المنفذة داخل تعريف دالة دالة محلية يمكن إرجاعها‪. def‬مالحظة المبرمج‪ :‬الوظائف هي كائنات من الدرجة األولى‬
‫أو تمريرها‪ .‬يمكن للمتغيرات المجانية المستخدمة‪ L‬في الوظيفة المتداخلة الوصول إلى المتغيرات المحلية للدالة التي تحتوي على‬
‫‪.‬انظر قسم‪ ‬التسمية والربط‪ ‬لمزيد من التفاصيل‪def. ‬‬

‫أنظر أيضا‬

‫التعليقات التوضيحية الوظيفية ‪PEP 3107 -‬‬

‫‪.‬المواصفات األصلية لشروح الوظيفة‬

‫نوع تلميحات ‪PEP 484 -‬‬

‫‪.‬تعريف المعنى القياسي للتعليقات التوضيحية‪ :‬تلميحات الكتابة‬

‫بناء الجملة للتعليقات التوضيحية المتغيرة ‪PEP 526 -‬‬

‫القدرة على كتابة إقرارات متغيرة التلميح ‪ ،‬بما في ذلك متغيرات الفئة ومتغيرات الحالة‬

‫التقييم المؤجل للتعليقات التوضيحية ‪PEP 563 -‬‬


‫دعم إعادة توجيه المراجع داخل التعليقات التوضيحية من خالل االحتفاظ بالتعليقات التوضيحية في شكل سلسلة في وقت التشغيل بدالً‬
‫‪.‬من التقييم الجاد‬

‫‪ ‬تعريفات الفئة‪8.8 ‬‬

‫‪:‬يحدد تعريف الفئة كائن فئة (راجع قسم‪ ‬التدرج الهرمي للنوع القياسي‪) ‬‬

‫‪classdef :: = [ decorators] "class" classname[ inheritance] ":"suite‬‬

‫")" ]‪ :: = "(" [ argument_list‬الميراث‬

‫‪ :: = identifier‬اسم الفئة‬

‫لالستخدامات‪ L‬األكثر ‪ Metaclasses ‬انظر( تعريف الفئة هو بيان قابل للتنفيذ‪ .‬عاد ًة ما تقدم قائمة الوراثة قائمة بالفئات األساسية‪L‬‬
‫لذلك يجب تقييم كل عنصر في القائمة إلى كائن فئة يسمح بالتصنيف الفرعي‪ .‬ترث الفئات التي ال تحتوي على قائمة وراثة ‪) ، ،‬تقدمًا‬
‫‪،‬؛‪ ‬بالتالي‪ object‬افتراضيًا ‪ ،‬من الفئة األساسية‬

‫‪class Foo:‬‬

‫‪pass‬‬

‫يعادل‬

‫‪class Foo(object):‬‬

‫‪pass‬‬
‫ً‬
‫حديثا‬ ‫يتم بعد ذلك تنفيذ مجموعة الفصل في إطار تنفيذ جديد (انظر‪ ‬التسمية والربط‪ ، ) ‬باستخدام مساحة‪ L‬اسم محلية تم إنشاؤها‬
‫ومساحة االسم العالمية األصلية‪(  .‬عادة ‪ ،‬تحتوي المجموعة على تعريفات وظيفية في الغالب‪ ).‬عندما تنتهي مجموعة الفصل من‬
‫التنفيذ ‪ ،‬يتم تجاهل إطار التنفيذ الخاص بها ولكن يتم حفظ مساحة االسم المحلية الخاصة بها‪ 5 .‬ثم يتم إنشاء كائن فئة باستخدام قائمة‬
‫التوريث للفئات األساسية ومساحة االسم المحلية المحفوظة لقاموس السمات‪ .‬يرتبط اسم الفئة بكائن الفئة هذا في مساحة‪ L‬االسم المحلية‬
‫‪.‬األصلية‬

‫الحظ أن هذا يمكن االعتماد عليه ‪ __dict__. ‬يتم االحتفاظ بالترتيب الذي يتم به تعريف السمات‪ L‬في جسم الفصل في الفصل الجديد‬
‫‪.‬فقط بعد إنشاء الفئة وفقط للفئات التي تم تعريفها باستخدام صيغة التعريف‬

‫‪Pg. 115‬‬
‫‪ metaclasses .‬يمكن تخصيص إنشاء الفصل بشكل كبير باستخدام‬

‫‪ ،‬يمكن أيضً ا تزيين الفصول الدراسية‪ :‬تمامًا كما هو الحال عند تزيين الوظائف‬

‫)‪@f1(arg‬‬

‫‪@f2‬‬

‫‪class Foo: pass‬‬

‫يعادل تقريبًا‬

‫‪class Foo: pass‬‬

‫))‪Foo = f1(arg)(f2(Foo‬‬

‫‪.‬قواعد التقييم لتعبيرات المصمم هي نفسها بالنسبة لمصممي الوظيفة‪ .‬ثم يتم ربط النتيجة باسم الفئة‬

‫في السابق ‪ ،‬كانت القواعد أكثر ‪ assignment_expression. ‬تم التغيير في اإلصدار ‪ :3.9‬يمكن تزيين الفصول بأي نوع صالح‬
‫‪.‬لمزيد من التفاصيل‪PEP 614 ‬تقيي ًدا ؛‪ ‬ارى‬

‫مالحظة المبرمج‪ :‬المتغيرات المعرفة في تعريف الفئة هي سمات فئة ؛‪ ‬يتم مشاركتها من قبل األمثلة‪ .‬يمكن تعيين سمات المثيل‬
‫بطريقة ذات‪ . ‬يمكن الوصول إلى سمات‪ L‬كل من الفئة والمثيل من خالل الترميز "‪ ، " ‬وتخفي سمة مثيل سمة فئة تحمل االسم نفسه‬
‫عند الوصول إليها بهذه الطريقة‪ .‬يمكن استخدام سمات‪ L‬الفئة كإعدادات افتراضية لسمات المثال ‪ ،‬ولكن استخدام القيم القابلة للتغيير‬
‫هناك يمكن أن يؤدي إلى نتائج غير متوقعة‪ .‬واصفات‪ ‬يمكن استخدامها إلنشاء‪ L‬متغيرات سبيل المثال مع تفاصيل التنفيذ‬
‫‪.self.name = valueself.name‬المختلفة‬

‫أنظر أيضا‬

‫‪ Python 3000‬في ‪PEP 3115 - Metaclasses‬‬

‫‪.‬االقتراح الذي غيّر إعالن الفئات الوصفية إلى الصيغة الحالية ‪ ،‬والدالالت الخاصة بكيفية إنشاء الفئات ذات الفئات الوصفية‬

‫فئة الديكور ‪PEP 3129 -‬‬

‫‪ .‬االقتراح الذي أضاف مصممين للفصل‪ .‬تم تقديم مصممي الديكور الوظيفي والطريقة فيبيب ‪318‬‬

‫‪8.9. Coroutines‬‬

‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫‪ Coroutine ‬تعريف وظيفة‪8.9.1. ‬‬

‫")" ]‪" "def" funcname"(" [ parameter_list‬غير متزامن" ]‪async_funcdef :: = [ decorators‬‬

‫‪["->" expression] ":"suite‬‬

‫التعبيرات ‪ ،‬وال‪ ‬يمكن استخدامها إال ‪ coroutine ). await‬انظر( واستئنافها‪ L‬في عدة نقاط ‪ coroutines Python‬يمكن تعليق تنفيذ‬
‫‪ coroutine.async forasync with‬في جسم وظيفة‬

‫‪.async defawaitasync‬حتى لو أنها ال تحتوي‪ ‬أو‪ ‬الكلمات الرئيسية ‪ coroutine،‬الوظائف المحددة مع‪ ‬جملة دائما ظائف‬

‫‪ coroutine.yield from‬استخدام‪ ‬تعبير داخل جسم وظيفة ‪ SyntaxError‬إنه‬

‫‪ coroutine:‬مثال على وظيفة‬

‫‪async def func(param1, param2):‬‬

‫)(‪do_stuff‬‬

‫‪Pg. 116‬‬
‫)(‪await some_coroutine‬‬

‫اآلن الكلمات الرئيسية‪  .‬في السابق كانوا يعاملون فقط على هذا النحو داخل جسم وظيفة‪ async‬و‪:await ‬تغير في اإلصدار ‪3.7‬‬
‫‪coroutine.‬‬

‫‪ async for‬في‪ ‬بيان‪8.9.2. ‬‬

‫‪"for_stmt‬غير متزامن" = ‪async_for_stmt ::‬‬

‫األسلوب الذي يعود مباشرة إلى‪ ‬مكرر غير متزامن‪ ، ‬والتي يمكن استدعاء التعليمات‪ __aiter__ L‬يوفر‪ iterable ‬و‪ ‬غير المتزامن‬
‫‪.‬األسلوب__‪ __anext‬البرمجية غير متزامن في تقريرها‬

‫‪.async for‬غير متزامن ‪ iterables‬في‪ ‬بيان يسمح التكرار مريحة على‬

‫‪:‬الكود التالي‬

‫‪async for TARGET in ITER:‬‬

‫‪SUITE‬‬

‫‪else:‬‬

‫‪SUITE2‬‬

‫‪:‬يعادل لغويًا‬

‫)‪iter = (ITER‬‬

‫)‪iter = type(iter).__aiter__(iter‬‬

‫‪running = True‬‬

‫‪while running:‬‬

‫‪try:‬‬

‫)‪TARGET = await type(iter).__anext__(iter‬‬

‫‪except StopAsyncIteration:‬‬

‫‪running = False‬‬

‫‪else:‬‬

‫‪SUITE‬‬

‫‪else:‬‬

‫‪SUITE2‬‬

‫‪.‬للحصول على التفاصيل)(__‪ __anext‬و)(__‪ __aiter‬انظر أيضا‬

‫‪ coroutine.async for‬استخدام‪ ‬عبارة خارج جسم وظيفة‪ SyntaxError‬إنه‬

‫‪ async with‬في‪ ‬بيان‪8.9.3. ‬‬

‫‪"with_stmt‬غير متزامن" = ‪async_with_stmt ::‬‬

‫‪.‬و‪ ‬مدير سياق غير متزامن‪ ‬هو‪ ‬مدير السياق‪ ‬أن يكون قادرا على وقف إعدام في في‪ ‬دخول‪ ‬و‪ ‬خروج‪ ‬األساليب‬

‫‪Pg. 117‬‬
‫الكود التالي‬:

async with EXPRESSION as TARGET:

SUITE

‫يعادل لغويًا‬:

manager = (EXPRESSION)

aenter = type(manager).__aenter__

aexit = type(manager).__aexit__

value = await aenter(manager)

hit_except = False

try:

TARGET = value

SUITE

except:

hit_except = True

if not await aexit(manager, *sys.exc_info()):

raise

finally:

if not hit_except:

await aexit(manager, None, None, None)

‫انظر أيضا‬ __aenter__()‫و‬ __aexit__()‫للحصول على التفاصيل‬.

‫إنه‬ SyntaxError‫عبارة خارج جسم وظيفة‬ ‫ استخدام‬coroutine.async with

‫أنظر أيضا‬

PEP 492 - Coroutines ‫مع عدم التزامن وانتظار بناء الجملة‬

‫ االقتراح الذي جعل‬coroutines ‫ مفهومًا مستقالً مناسبًا في‬Python ، ‫وأضاف بناء الجملة الداعم‬.

‫الحواشي‬

‫يتم نشر االستثناء إلى مكدس االستدعاء ما لم يكن هناك‬ finally ‫هذا االستثناء الجديد يتسبب في ضياع‬ .‫بند يحدث إلثارة استثناء آخر‬
‫االستثناء القديم‬.

‫ يتم تعريف التسلسل على أنه واحد مما يلي‬، ‫في مطابقة النمط‬:

Pg. 118
‫‪‬‬ ‫‪ collections.abc.Sequence‬فئة ترث من‬

‫‪‬‬ ‫‪ collections.abc.Sequence‬التي تم تسجيلها باسم ‪ Python‬فئة‬

‫‪‬‬ ‫)‪ (CPython‬مجموعة بت‪ Py_TPFLAGS_SEQUENCE‬فئة مضمنة لديها‬

‫‪‬‬ ‫فئة ترث من أي مما سبق‬

‫‪:‬فئات المكتبة القياسية التالية عبارة عن تسلسالت‬

‫‪‬‬ ‫‪array.array‬‬

‫‪‬‬ ‫‪collections.deque‬‬

‫‪‬‬ ‫‪list‬‬

‫‪‬‬ ‫‪memoryview‬‬

‫‪‬‬ ‫‪range‬‬

‫‪‬‬ ‫‪tuple‬‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬ال تتطابق أنماط التسلسل‪ bytearray ‬و‪ str، bytes‬قيم موضوع نوع‬

‫‪3‬‬

‫‪:‬في مطابقة النمط ‪ ،‬يتم تعريف التعيين على أنه واحد مما يلي‬

‫‪‬‬ ‫‪ collections.abc.Mapping‬فئة ترث من‬

‫‪‬‬ ‫‪ collections.abc.Mapping‬التي تم تسجيلها باسم ‪ Python‬فئة‬

‫‪‬‬ ‫)‪ (CPython‬مجموعة بت‪ Py_TPFLAGS_MAPPING‬فئة مضمنة لديها‬

‫‪‬‬ ‫فئة ترث من أي مما سبق‬

‫‪.‬هي تعيينات‪ types.MappingProxyType ‬و‪ dict‬الطبقات المكتبة القياسية‬

‫‪4‬‬

‫الخاصة ‪ docstring ‬سمة الوظيفة وبالتالي سلسلة__‪ __doc‬يتم تحويل السلسلة الحرفية التي تظهر كأول بيان في جسم الوظيفة إلى‬
‫‪ .‬بالوظيفة‬

‫‪5‬‬

‫عنصر‪ ‬مساحة‪ L‬االسم‪ ‬وبالتالي __‪ __doc‬يتم تحويل السلسلة الحرفية التي تظهر كأول بيان في نص الفصل إلى‬
‫‪ .‬للفصل‪ docstring ‬سلسلة‬

‫‪ ‬مكونات عالية المستوى‪9. ‬‬

‫يمكن لمترجم بايثون الحصول على مدخالته من عدد من المصادر‪ :‬من نص تم تمريره إليه كمدخل قياسي أو كوسيط برنامج ‪،‬‬
‫‪.‬مكتوب بشكل تفاعلي ‪ ،‬من ملف مصدر وحدة ‪ ،‬إلخ‪ .‬يعطي هذا الفصل الصيغة المستخدمة‪ L‬في هذه الحاالت‬

‫‪ ‬برامج بايثون كاملة‪9.1 ‬‬

‫بينما ال تحتاج مواصفات اللغة إلى وصف كيفية استدعاء مترجم اللغة ‪ ،‬فمن المفيد أن يكون لديك فكرة عن برنامج بايثون كامل‪ .‬يتم‬
‫الكامل في بيئة مهيأة بالحد األدنى‪ :‬جميع الوحدات المضمنة والقياسية متاحة ‪ ،‬ولكن لم تتم تهيئة أي منها ‪ Python ،‬تنفيذ برنامج‬

‫‪Pg. 119‬‬
‫يتم استخدام األخير ‪ __main__. ‬و )‪ None‬الوظائف المضمنة ‪ ،‬االستثناءات و(‪) ، builtins‬خدمات‪ L‬النظام المختلفة(‪ sys‬باستثناء‬
‫‪.‬لتوفير مساحة‪ L‬االسم المحلية والعالمية لتنفيذ البرنامج الكامل‬

‫‪.‬الكامل هي تلك الخاصة بإدخال الملفات ‪ ،‬الموصوفة في القسم التالي ‪ Python‬صيغة برنامج‬

‫ضا استدعاء المترجم الفوري في الوضع التفاعلي ؛‪ ‬في هذه الحالة ‪ ،‬ال يقرأ وينفذ برنامجً ا كامالً ولكنه يقرأ وينفذ بيا ًنا واح ًدا‬
‫يمكن أي ً‬
‫‪( __main__.‬ربما مركبًا) في كل مرة‪  .‬البيئة األولية مماثلة لبيئة البرنامج الكامل ؛‪ ‬يتم تنفيذ كل عبارة في مساحة‪ L‬اسم‬

‫يمكن تمرير برنامج كامل إلى المترجم الفوري في ثالثة أشكال‪ :‬باستخدام‪ ‬خيار سطر أوامر‪ ‬السلسلة‪ ، ‬أو كملف تم تمريره كأول‬
‫يدخل المترجم في الوضع ‪ tty ،‬وسيطة لسطر األوامر ‪ ،‬أو كمدخل قياسي‪ .‬إذا كان الملف أو اإلدخال القياسي عبارة عن جهاز‬
‫‪.-c‬التفاعلي ؛‪ ‬وإال فإنه ينفذ الملف كبرنامج كامل‬

‫‪ ‬إدخال ملف‪9.2. ‬‬

‫‪:‬كل المدخالت المقروءة من الملفات غير التفاعلية لها نفس الشكل‬

‫* )‪file_input :: = (NEWLINE | statement‬‬

‫‪:‬يتم استخدام بناء الجملة هذا في المواقف التالية‬

‫‪‬‬ ‫كامل (من ملف أو من سلسلة) ؛ ‪ Python‬عند تحليل برنامج‬

‫‪‬‬ ‫عند تحليل وحدة ؛‬

‫‪‬‬ ‫الوظيفة ؛)(‪ exec‬عند تحليل سلسلة تم تمريرها إلى‬

‫‪ ‬المدخالت‪ L‬التفاعلية‪9.3 ‬‬

‫‪:‬يتم تحليل اإلدخال في الوضع التفاعلي باستخدام القواعد النحوية التالية‬

‫خط جديد‪Interactive_input :: = [ stmt_list] NEWLINE | compound_stmt‬‬

‫الحظ أن العبارة المركبة (المستوى األعلى) يجب أن يتبعها سطر فارغ في الوضع التفاعلي ؛‪ ‬هذا ضروري لمساعدة المحلل اللغوي‬
‫‪.‬في اكتشاف نهاية اإلدخال‬

‫‪ ‬إدخال التعبير‪9.4 ‬‬

‫‪:‬يجب أن تحتوي‪ ‬وسيطة السلسلة على‪ ‬الشكل التالي)(‪. eval‬يستخدم إلدخال التعبير‪ .‬يتجاهل المسافة‪ L‬البيضاء البادئة)(‪eval‬‬

‫* ‪Eval_input :: = expression_listNEWLINE‬‬

‫‪ ‬المواصفات النحوية الكاملة‪10. ‬‬

‫‪ /‬انظر‪ ‬القواعد( ‪ CPython‬الكاملة ‪ ،‬المشتقة مباشرة من القواعد النحوية المستخدمة‪ L‬إلنشاء محلل ‪ Python‬هذه هي‪ ‬قواعد لغة‬
‫‪.‬يحذف اإلصدار هنا التفاصيل المتعلقة بإنشاء التعليمات البرمجية واسترداد األخطاء‪python.gram ). ‬‬

‫على وجه الخصوص ‪& ،‬متبو ًعا برمز ‪ ،‬يشير الرمز المميز أو المجموعة المحصورة‪ PEG . ‬و‪ EBNF ‬الترميز عبارة عن مزيج من‬
‫بين قوسين إلى نظرة موجبة (على سبيل المثال ‪ ،‬مطلوب للمطابقة ولكنها غير مستهلكة) ‪ ،‬بينما‪! ‬يشير إلى مظهر سلبي (أي مطلوب‬
‫مكتوب كما هو الحال‪/ ‬في القواعد النحوية التقليدية لـ( ‪_ PEG‬ال_ للمطابقة)‪ .‬نستخدم‪| ‬الفاصل لإلشارة إلى "االختيار المنظم" لـ‬
‫‪.‬لمزيد من التفاصيل حول قواعد النحو‪ PEP 617 ‬ارى‪PEG). ‬‬

‫‪# PEG grammar for Python‬‬

‫‪file: [statements] ENDMARKER‬‬

‫‪Pg. 120‬‬
interactive: statement_newline

eval: expressions NEWLINE* ENDMARKER

func_type: '(' [type_expressions] ')' '->' expression NEWLINE* ENDMARKER

fstring: star_expressions

# type_expressions allow */** but ignore them

type_expressions:

| ','.expression+ ',' '*' expression ',' '**' expression

| ','.expression+ ',' '*' expression

| ','.expression+ ',' '**' expression

| '*' expression ',' '**' expression

| '*' expression

| '**' expression

| ','.expression+

statements: statement+

statement: compound_stmt | simple_stmts

statement_newline:

| compound_stmt NEWLINE

| simple_stmts

| NEWLINE

| ENDMARKER

simple_stmts:

| simple_stmt !';' NEWLINE # Not needed, there for speedup

| ';'.simple_stmt+ [';'] NEWLINE

# NOTE: assignment MUST precede expression, else parsing a simple assignment

# will throw a SyntaxError.

simple_stmt:

| assignment

| star_expressions

| return_stmt

Pg. 121
| import_stmt

| raise_stmt

| 'pass'

| del_stmt

| yield_stmt

| assert_stmt

| 'break'

| 'continue'

| global_stmt

| nonlocal_stmt

compound_stmt:

| function_def

| if_stmt

| class_def

| with_stmt

| for_stmt

| try_stmt

| while_stmt

| match_stmt

# NOTE: annotated_rhs may start with 'yield'; yield_expr must start with 'yield'

assignment:

| NAME ':' expression ['=' annotated_rhs ]

| ('(' single_target ')'

| single_subscript_attribute_target) ':' expression ['=' annotated_rhs ]

| (star_targets '=' )+ (yield_expr | star_expressions) !'=' [TYPE_COMMENT]

| single_target augassign ~ (yield_expr | star_expressions)

augassign:

| '+='

| '-='

| '*='

Pg. 122
| '@='

| '/='

| '%='

| '&='

| '|='

| '^='

| '<<='

| '>>='

| '**='

| '//='

global_stmt: 'global' ','.NAME+

nonlocal_stmt: 'nonlocal' ','.NAME+

yield_stmt: yield_expr

assert_stmt: 'assert' expression [',' expression ]

del_stmt:

| 'del' del_targets &(';' | NEWLINE)

import_stmt: import_name | import_from

import_name: 'import' dotted_as_names

# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS

import_from:

| 'from' ('.' | '...')* dotted_name 'import' import_from_targets

| 'from' ('.' | '...')+ 'import' import_from_targets

import_from_targets:

| '(' import_from_as_names [','] ')'

| import_from_as_names !','

| '*'

import_from_as_names:

Pg. 123
| ','.import_from_as_name+

import_from_as_name:

| NAME ['as' NAME ]

dotted_as_names:

| ','.dotted_as_name+

dotted_as_name:

| dotted_name ['as' NAME ]

dotted_name:

| dotted_name '.' NAME

| NAME

if_stmt:

| 'if' named_expression ':' block elif_stmt

| 'if' named_expression ':' block [else_block]

elif_stmt:

| 'elif' named_expression ':' block elif_stmt

| 'elif' named_expression ':' block [else_block]

else_block:

| 'else' ':' block

while_stmt:

| 'while' named_expression ':' block [else_block]

for_stmt:

| 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block]

| ASYNC 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block]

with_stmt:

| 'with' '(' ','.with_item+ ','? ')' ':' block

| 'with' ','.with_item+ ':' [TYPE_COMMENT] block

| ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block

| ASYNC 'with' ','.with_item+ ':' [TYPE_COMMENT] block

Pg. 124
with_item:

| expression 'as' star_target &(',' | ')' | ':')

| expression

try_stmt:

| 'try' ':' block finally_block

| 'try' ':' block except_block+ [else_block] [finally_block]

except_block:

| 'except' expression ['as' NAME ] ':' block

| 'except' ':' block

finally_block:

| 'finally' ':' block

match_stmt:

| "match" subject_expr ':' NEWLINE INDENT case_block+ DEDENT

subject_expr:

| star_named_expression ',' star_named_expressions?

| named_expression

case_block:

| "case" patterns guard? ':' block

guard: 'if' named_expression

patterns:

| open_sequence_pattern

| pattern

pattern:

| as_pattern

| or_pattern

as_pattern:

| or_pattern 'as' pattern_capture_target

or_pattern:

Pg. 125
| '|'.closed_pattern+

closed_pattern:

| literal_pattern

| capture_pattern

| wildcard_pattern

| value_pattern

| group_pattern

| sequence_pattern

| mapping_pattern

| class_pattern

# Literal patterns are used for equality and identity constraints

literal_pattern:

| signed_number !('+' | '-')

| complex_number

| strings

| 'None'

| 'True'

| 'False'

# Literal expressions are used to restrict permitted mapping pattern keys

literal_expr:

| signed_number !('+' | '-')

| complex_number

| strings

| 'None'

| 'True'

| 'False'

complex_number:

| signed_real_number '+' imaginary_number

Pg. 126
| signed_real_number '-' imaginary_number

signed_number:

| NUMBER

| '-' NUMBER

signed_real_number:

| real_number

| '-' real_number

real_number:

| NUMBER

imaginary_number:

| NUMBER

capture_pattern:

| pattern_capture_target

pattern_capture_target:

| !"_" NAME !('.' | '(' | '=')

wildcard_pattern:

| "_"

value_pattern:

| attr !('.' | '(' | '=')

attr:

| name_or_attr '.' NAME

name_or_attr:

| attr

Pg. 127
| NAME

group_pattern:

| '(' pattern ')'

sequence_pattern:

| '[' maybe_sequence_pattern? ']'

| '(' open_sequence_pattern? ')'

open_sequence_pattern:

| maybe_star_pattern ',' maybe_sequence_pattern?

maybe_sequence_pattern:

| ','.maybe_star_pattern+ ','?

maybe_star_pattern:

| star_pattern

| pattern

star_pattern:

| '*' pattern_capture_target

| '*' wildcard_pattern

mapping_pattern:

| '{' '}'

| '{' double_star_pattern ','? '}'

| '{' items_pattern ',' double_star_pattern ','? '}'

| '{' items_pattern ','? '}'

items_pattern:

| ','.key_value_pattern+

key_value_pattern:

| (literal_expr | attr) ':' pattern

double_star_pattern:

| '**' pattern_capture_target

Pg. 128
class_pattern:

| name_or_attr '(' ')'

| name_or_attr '(' positional_patterns ','? ')'

| name_or_attr '(' keyword_patterns ','? ')'

| name_or_attr '(' positional_patterns ',' keyword_patterns ','? ')'

positional_patterns:

| ','.pattern+

keyword_patterns:

| ','.keyword_pattern+

keyword_pattern:

| NAME '=' pattern

return_stmt:

| 'return' [star_expressions]

raise_stmt:

| 'raise' expression ['from' expression ]

| 'raise'

function_def:

| decorators function_def_raw

| function_def_raw

function_def_raw:

| 'def' NAME '(' [params] ')' ['->' expression ] ':' [func_type_comment] block

| ASYNC 'def' NAME '(' [params] ')' ['->' expression ] ':' [func_type_comment] block

func_type_comment:

| NEWLINE TYPE_COMMENT &(NEWLINE INDENT) # Must be followed by indented block

| TYPE_COMMENT

params:

Pg. 129
| parameters

parameters:

| slash_no_default param_no_default* param_with_default* [star_etc]

| slash_with_default param_with_default* [star_etc]

| param_no_default+ param_with_default* [star_etc]

| param_with_default+ [star_etc]

| star_etc

# Some duplication here because we can't write (',' | &')'),

# which is because we don't support empty alternatives (yet).

slash_no_default:

| param_no_default+ '/' ','

| param_no_default+ '/' &')'

slash_with_default:

| param_no_default* param_with_default+ '/' ','

| param_no_default* param_with_default+ '/' &')'

star_etc:

| '*' param_no_default param_maybe_default* [kwds]

| '*' ',' param_maybe_default+ [kwds]

| kwds

kwds: '**' param_no_default

# One parameter. This *includes* a following comma and type comment.

# There are three styles:

# - No default

# - With default

# - Maybe with default

Pg. 130
#

# There are two alternative forms of each, to deal with type comments:

# - Ends in a comma followed by an optional type comment

# - No comma, optional type comment, must be followed by close paren

# The latter form is for a final parameter without trailing comma.

param_no_default:

| param ',' TYPE_COMMENT?

| param TYPE_COMMENT? &')'

param_with_default:

| param default ',' TYPE_COMMENT?

| param default TYPE_COMMENT? &')'

param_maybe_default:

| param default? ',' TYPE_COMMENT?

| param default? TYPE_COMMENT? &')'

param: NAME annotation?

annotation: ':' expression

default: '=' expression

decorators: ('@' named_expression NEWLINE )+

class_def:

| decorators class_def_raw

| class_def_raw

class_def_raw:

| 'class' NAME ['(' [arguments] ')' ] ':' block

block:

| NEWLINE INDENT statements DEDENT

| simple_stmts

Pg. 131
star_expressions:

| star_expression (',' star_expression )+ [',']

| star_expression ','

| star_expression

star_expression:

| '*' bitwise_or

| expression

star_named_expressions: ','.star_named_expression+ [',']

star_named_expression:

| '*' bitwise_or

| named_expression

assigment_expression:

| NAME ':=' ~ expression

named_expression:

| assigment_expression

| expression !':='

annotated_rhs: yield_expr | star_expressions

expressions:

| expression (',' expression )+ [',']

| expression ','

| expression

expression:

| disjunction 'if' disjunction 'else' expression

| disjunction

| lambdef

Pg. 132
lambdef:

| 'lambda' [lambda_params] ':' expression

lambda_params:

| lambda_parameters

# lambda_parameters etc. duplicates parameters but without annotations

# or type comments, and if there's no comma after a parameter, we expect

# a colon, not a close parenthesis. (For more, see parameters above.)

lambda_parameters:

| lambda_slash_no_default lambda_param_no_default* lambda_param_with_default*


[lambda_star_etc]

| lambda_slash_with_default lambda_param_with_default* [lambda_star_etc]

| lambda_param_no_default+ lambda_param_with_default* [lambda_star_etc]

| lambda_param_with_default+ [lambda_star_etc]

| lambda_star_etc

lambda_slash_no_default:

| lambda_param_no_default+ '/' ','

| lambda_param_no_default+ '/' &':'

lambda_slash_with_default:

| lambda_param_no_default* lambda_param_with_default+ '/' ','

| lambda_param_no_default* lambda_param_with_default+ '/' &':'

lambda_star_etc:

| '*' lambda_param_no_default lambda_param_maybe_default* [lambda_kwds]

| '*' ',' lambda_param_maybe_default+ [lambda_kwds]

| lambda_kwds

lambda_kwds: '**' lambda_param_no_default

Pg. 133
lambda_param_no_default:

| lambda_param ','

| lambda_param &':'

lambda_param_with_default:

| lambda_param default ','

| lambda_param default &':'

lambda_param_maybe_default:

| lambda_param default? ','

| lambda_param default? &':'

lambda_param: NAME

disjunction:

| conjunction ('or' conjunction )+

| conjunction

conjunction:

| inversion ('and' inversion )+

| inversion

inversion:

| 'not' inversion

| comparison

comparison:

| bitwise_or compare_op_bitwise_or_pair+

| bitwise_or

compare_op_bitwise_or_pair:

| eq_bitwise_or

| noteq_bitwise_or

| lte_bitwise_or

| lt_bitwise_or

| gte_bitwise_or

| gt_bitwise_or

Pg. 134
| notin_bitwise_or

| in_bitwise_or

| isnot_bitwise_or

| is_bitwise_or

eq_bitwise_or: '==' bitwise_or

noteq_bitwise_or:

| ('!=' ) bitwise_or

lte_bitwise_or: '<=' bitwise_or

lt_bitwise_or: '<' bitwise_or

gte_bitwise_or: '>=' bitwise_or

gt_bitwise_or: '>' bitwise_or

notin_bitwise_or: 'not' 'in' bitwise_or

in_bitwise_or: 'in' bitwise_or

isnot_bitwise_or: 'is' 'not' bitwise_or

is_bitwise_or: 'is' bitwise_or

bitwise_or:

| bitwise_or '|' bitwise_xor

| bitwise_xor

bitwise_xor:

| bitwise_xor '^' bitwise_and

| bitwise_and

bitwise_and:

| bitwise_and '&' shift_expr

| shift_expr

shift_expr:

| shift_expr '<<' sum

| shift_expr '>>' sum

| sum

sum:

Pg. 135
| sum '+' term

| sum '-' term

| term

term:

| term '*' factor

| term '/' factor

| term '//' factor

| term '%' factor

| term '@' factor

| factor

factor:

| '+' factor

| '-' factor

| '~' factor

| power

power:

| await_primary '**' factor

| await_primary

await_primary:

| AWAIT primary

| primary

primary:

| invalid_primary # must be before 'primay genexp' because of invalid_genexp

| primary '.' NAME

| primary genexp

| primary '(' [arguments] ')'

| primary '[' slices ']'

| atom

slices:

| slice !','

Pg. 136
| ','.slice+ [',']

slice:

| [expression] ':' [expression] [':' [expression] ]

| named_expression

atom:

| NAME

| 'True'

| 'False'

| 'None'

| strings

| NUMBER

| (tuple | group | genexp)

| (list | listcomp)

| (dict | set | dictcomp | setcomp)

| '...'

strings: STRING+

list:

| '[' [star_named_expressions] ']'

listcomp:

| '[' named_expression for_if_clauses ']'

tuple:

| '(' [star_named_expression ',' [star_named_expressions] ] ')'

group:

| '(' (yield_expr | named_expression) ')'

genexp:

| '(' ( assigment_expression | expression !':=') for_if_clauses ')'

set: '{' star_named_expressions '}'

setcomp:

| '{' named_expression for_if_clauses '}'

dict:

Pg. 137
| '{' [double_starred_kvpairs] '}'

| '{' invalid_double_starred_kvpairs '}'

dictcomp:

| '{' kvpair for_if_clauses '}'

double_starred_kvpairs: ','.double_starred_kvpair+ [',']

double_starred_kvpair:

| '**' bitwise_or

| kvpair

kvpair: expression ':' expression

for_if_clauses:

| for_if_clause+

for_if_clause:

| ASYNC 'for' star_targets 'in' ~ disjunction ('if' disjunction )*

| 'for' star_targets 'in' ~ disjunction ('if' disjunction )*

yield_expr:

| 'yield' 'from' expression

| 'yield' [star_expressions]

arguments:

| args [','] &')'

args:

| ','.(starred_expression | ( assigment_expression | expression !':=') !'=')+ [',' kwargs ]

| kwargs

kwargs:

| ','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+

| ','.kwarg_or_starred+

| ','.kwarg_or_double_starred+

starred_expression:

| '*' expression

Pg. 138
kwarg_or_starred:

| NAME '=' expression

| starred_expression

kwarg_or_double_starred:

| NAME '=' expression

| '**' expression

# NOTE: star_targets may contain *bitwise_or, targets may not.

star_targets:

| star_target !','

| star_target (',' star_target )* [',']

star_targets_list_seq: ','.star_target+ [',']

star_targets_tuple_seq:

| star_target (',' star_target )+ [',']

| star_target ','

star_target:

| '*' (!'*' star_target)

| target_with_star_atom

target_with_star_atom:

| t_primary '.' NAME !t_lookahead

| t_primary '[' slices ']' !t_lookahead

| star_atom

star_atom:

| NAME

| '(' target_with_star_atom ')'

| '(' [star_targets_tuple_seq] ')'

| '[' [star_targets_list_seq] ']'

single_target:

| single_subscript_attribute_target

| NAME

Pg. 139
‫')' ‪| '(' single_target‬‬

‫‪single_subscript_attribute_target:‬‬

‫‪| t_primary '.' NAME !t_lookahead‬‬

‫‪| t_primary '[' slices ']' !t_lookahead‬‬

‫]'‪del_targets: ','.del_target+ [',‬‬

‫‪del_target:‬‬

‫‪| t_primary '.' NAME !t_lookahead‬‬

‫‪| t_primary '[' slices ']' !t_lookahead‬‬

‫‪| del_t_atom‬‬

‫‪del_t_atom:‬‬

‫‪| NAME‬‬

‫')' ‪| '(' del_target‬‬

‫')' ]‪| '(' [del_targets‬‬

‫']' ]‪| '[' [del_targets‬‬

‫‪t_primary:‬‬

‫‪| t_primary '.' NAME &t_lookahead‬‬

‫‪| t_primary '[' slices ']' &t_lookahead‬‬

‫‪| t_primary genexp &t_lookahead‬‬

‫‪| t_primary '(' [arguments] ')' &t_lookahead‬‬

‫‪| atom &t_lookahead‬‬

‫'‪t_lookahead: '(' | '[' | '.‬‬

‫‪ ‬مكتبة بايثون القياسية‬


‫بينما‪ ‬يصف‪ ‬مرجع لغة بايثون‪  ‬التركيب الدقيق ودالالت لغة بايثون ‪ ،‬يصف هذا الدليل المرجعي للمكتبة المكتبة القياسية التي يتم‬
‫ض ا بعض المكونات االختيارية التي يتم تضمينها بشكل شائع في توزيعات‬ ‫‪ Python.‬توزيعها باستخدام بايثون‪ .‬يصف أي ً‬

‫القياسية واسعة للغاية ‪ ،‬وتقدم مجموعة واسعة من المرافق كما هو موضح في جدول المحتويات الطويل المدرج ‪ Python‬مكتبة‬
‫توفر الوصول إلى وظائف النظام مثل ملف اإلدخال ‪ /‬اإلخراج الذي قد )‪ C‬مكتوبة بلغة( أدناه‪ .‬تحتوي المكتبة على وحدات مدمجة‬
‫التي توفر حلواًل قياسية للعديد من ‪ Python‬باإلضافة إلى الوحدات النمطية المكتوبة بلغة ‪ Python ،‬يتعذر الوصول إليه لمبرمجي‬
‫‪ Python‬المشكالت التي تحدث في البرمجة اليومية‪  .‬تم تصميم بعض هذه الوحدات بشكل صريح لتشجيع وتعزيز قابلية نقل برامج‬
‫‪.‬من خالل تجريد خصائص النظام األساسي بعي ًدا في واجهات برمجة تطبيقات محايدة للنظام األساسي‬

‫ضا العديد من المكونات ‪ Windows‬لنظام التشغيل ‪ Python‬عاد ًة ما تتضمن مثبتات‬ ‫المكتبة القياسية بأكملها وغالبًا ما تتضمن أي ً‬
‫عاد ًة كمجموعة من الحزم ‪ ،‬لذلك قد يكون من الضروري ‪ Python‬يتم توفير ‪ Unix ،‬اإلضافية‪ .‬بالنسبة ألنظمة التشغيل المشابهة لـ‬
‫‪.‬استخدام أدوات الحزم المتوفرة مع نظام التشغيل للحصول على بعض أو كل المكونات االختيارية‬

‫‪Pg. 140‬‬
‫باإلضافة إلى المكتبة القياسية ‪ ،‬هناك مجموعة متزايدة من عدة آالف من المكونات (من البرامج الفردية والوحدات النمطية إلى الحزم‬
‫‪ Python Package Index .‬وأطر تطوير التطبيقات بالكامل) ‪ ،‬وهي متاحة من‬

‫‪Introduction‬‬

‫‪.‬على عدة أنواع مختلفة من المكونات "‪ Python‬تحتوي "مكتبة‬

‫يحتوي على أنواع البيانات التي تعتبر عاد ًة جزءًا من "جوهر" اللغة ‪ ،‬مثل األرقام والقوائم‪ .‬بالنسبة لهذه األنواع ‪ ،‬يحدد جوهر لغة‬
‫شكل القيم الحرفية ويضع بعض القيود على دالالتها ‪ ،‬ولكنه ال يحدد الدالالت بشكل كامل‪( .‬من ناحية أخرى ‪ ،‬يحدد جوهر ‪Python‬‬
‫اللغة الخصائص النحوية مثل التهجئة وأولويات المشغلين‪).‬‬

‫البرمجية دون ‪ Python‬تحتوي المكتبة أيضً ا على وظائف واستثناءات مضمنة ‪ -‬كائنات يمكن استخدامها بواسطة جميع تعليمات‪L‬‬
‫بيان‪  .‬يتم تعريف بعضها من خالل اللغة األساسية ‪ ،‬لكن العديد منها ليس ضروريًا للدالالت األساسية‪ L‬ويتم وصفه‪ import‬الحاجة إلى‬
‫‪.‬هنا فقط‬

‫ومع ذلك ‪ ،‬فإن الجزء األكبر من المكتبة يتكون من مجموعة من الوحدات‪ .‬هناك طرق عديدة لتشريح هذه المجموعة‪ .‬بعض الوحدات‬
‫ويتم استيراده في شكل مصدر‪ .‬توفر بعض ‪ Python‬ومدمجة في مترجم بايثون ؛‪ ‬البعض اآلخر مكتوب بلغة ‪ C‬مكتوبة بلغة‬
‫جدا ببيثون ‪ ،‬مثل طباعة تتبع مكدس ؛‪ ‬يوفر البعض واجهات‪ L‬خاصة بأنظمة تشغيل معينة ‪ ،‬مثل‬‫الوحدات النمطية واجهات خاصة ً‬
‫الوصول إلى أجهزة معينة ؛‪  ‬يوفر البعض اآلخر واجهات خاصة بمجال تطبيق معين ‪ ،‬مثل شبكة الويب العالمية‪ .‬تتوفر بعض‬
‫؛‪ ‬يتوفر اآلخرون فقط عندما يدعمهم النظام األساسي أو يتطلبهم ؛‪ ‬ومع ذلك ‪ ،‬ال يتوفر ‪ Python‬الوحدات في جميع إصدارات ومنافذ‬
‫‪.‬وتثبيته ‪ Python‬البعض اآلخر إال عند اختيار خيار تكوين معين في الوقت الذي تم فيه تجميع‬

‫تم تنظيم هذا الدليل "من الداخل إلى الخارج"‪ :‬فهو يصف أوالً الوظائف المضمنة وأنواع البيانات واالستثناءات ‪ ،‬وأخيراً الوحدات‬
‫‪.‬النمطية المجمعة‪ L‬في فصول من الوحدات ذات الصلة‬

‫هذا يعني أنك إذا بدأت في قراءة هذا الدليل من البداية ‪ ،‬وانتقلت إلى الفصل التالي عندما تشعر بالملل ‪ ،‬فستحصل على نظرة عامة‬
‫بالطبع ‪ ،‬ال‪ ‬يتعين‪ ‬عليك قراءتها كأنها رواية ‪ -‬يمكنك‪ Python. ‬معقولة للوحدات النمطية المتاحة ومناطق التطبيق التي تدعمها مكتبة‬
‫أيضً ا تصفح جدول المحتويات (أمام الدليل) ‪ ،‬أو البحث عن وظيفة أو وحدة أو مصطلح معين في الفهرس (في الخلف)‪ .‬وأخيرً ا ‪ ،‬إذا‬
‫وتقرأ قسمًا أو )‪ random‬انظر الوحدة( كنت تستمتع بالتعرف على مواضيع عشوائية ‪ ،‬فإنك تختار رقم صفحة عشوائيًا‬
‫قسمين‪  .‬بغض النظر عن الترتيب الذي تقرأ به أقسام هذا الدليل ‪ ،‬فمن المفيد البدء بفصل‪ ‬الوظائف المضمنة‪ ، ‬حيث يفترض باقي‬
‫‪.‬الدليل اإللمام بهذه المادة‬

‫!ليبدأ العرض‬

‫‪ ‬مالحظات حول التوفر‬


‫‪‬‬ ‫ال تقدم أي ادعاءات حول وجودها ‪ Unix. ‬أن هذه الوظيفة موجودة بشكل شائع في أنظمة "‪: Unix‬تعني مالحظة "التوفر‬
‫‪.‬على نظام تشغيل معين‬

‫‪‬‬ ‫والتي تعتمد ‪ macOS ،‬مدعومة على "‪: Unix‬إذا لم يتم ذكرها بشكل منفصل ‪ ،‬فإن جميع الوظائف التي تدعي "التوفر‬
‫‪ Unix core.‬على‬

‫‪ ‬وظائف مدمجة‬

‫‪ .‬على عدد من الوظائف واألنواع المضمنة فيه والتي تكون متاحة دائمًا‪ .‬تم سردها هنا بالترتيب األبجدي ‪ Python‬يحتوي مترجم‬

‫وظائف مدمجة‬

‫أ‬ ‫و‬ ‫ال‬ ‫ص‬

‫)(‪abs‬‬ ‫)(‪enumerate‬‬ ‫)(‪len‬‬ ‫)(‪range‬‬

‫)(‪aiter‬‬ ‫)(‪eval‬‬ ‫)(‪list‬‬ ‫)(‪repr‬‬

‫)(‪all‬‬ ‫)(‪exec‬‬ ‫)(‪locals‬‬ ‫)(‪reversed‬‬

‫‪Pg. 141‬‬
‫وظائف مدمجة‬

any()
round()
anext()
F ‫م‬
ascii()
filter() map() ‫س‬

float() max() set()


‫ب‬
format() memoryview() setattr()
bin()
frozenset() min() slice()
bool()
sorted()
breakpoint()
‫جي‬ ‫ن‬ staticmethod()
bytearray()
getattr() next() str()
bytes()
globals() sum()
‫ا‬ super()
‫ج‬
‫ح‬ object()
callable()
hasattr() oct() ‫تي‬
chr()
hash() open() tuple()
classmethod(
help() ord() type()
)
hex()
compile()
‫ص‬ ‫الخامس‬
complex()
‫أنا‬ pow() vars()

id() print()
‫د‬
input() property() ‫مع‬
delattr()
int() zip()
dict()
isinstance()
dir()
issubclass() _
divmod()
iter() __import__()

abs(  ‫خ‬ ) 

‫قد تكون الوسيطة عد ًدا صحيحً ا أو رقمًا فاصلة عائمة أو كائ ًنا مطب ًقا‬ .‫إرجاع القيمة المطلقة لرقم‬ __abs__().  ‫إذا كانت الوسيطة‬
‫ يتم إرجاع مقدارها‬، ‫عبارة عن رقم مركب‬.

aiter( ‫متزامن‬ ‫غير‬ ) 

‫ل‬ ‫مكرر غير متزامن‬ ‫إرجاع‬ iterable ‫يعادل االتصال‬ . ‫غير متزامن‬ x.__aiter__().

Pg. 142
‫‪ aiter(x).‬هي نفسها))‪ aiter(aiter(x‬لذلك ‪ x،‬طريقة تعود)(__‪ __aiter‬نفسها لديها)‪aiter(x‬‬

‫‪.‬ال يحتوي على متغير مكون من وسيطتين)(‪ iter()، aiter‬مالحظة‪ :‬على عكس‬

‫الجديد في اإلصدار ‪3.10.1‬‬

‫‪ ) ‬متكرر ‪all( ‬‬

‫‪:‬إذا كانت جميع العناصر‪ ‬القابلة‪ ‬للتكرار‪ ‬صحيحة (أو إذا‪ ‬كانت العناصر‪ ‬القابلة للتكرار فارغة)‪ .‬أي ما يعادل‪ True‬العودة‬

‫‪def all(iterable):‬‬

‫‪for element in iterable:‬‬

‫‪if not element:‬‬

‫‪return False‬‬

‫‪return True‬‬

‫‪ ] ) ‬افتراضي‪ anext( async_iterator  [ ، ‬في انتظار‬

‫‪.‬عند االنتظار ‪ ،‬قم بإرجاع العنصر التالي من‪ ‬المكرر غير المتزامن‪ ‬المحدد‪ ، ‬أو‪ ‬االفتراضي‪ ‬إذا تم توفيره وتم استنفاد المكرر‬

‫‪.‬للمدمج ‪ ،‬ويتصرف بالمثل)(‪ next‬هذا هو البديل غير المتزامن‬

‫وإرجاع‪ ‬ملف‪  . ‬يؤدي انتظار هذا إلى إرجاع القيمة التالية للمكرر‪ .‬إذا تم ‪ async_iterator ،‬طريقة)(__‪ __anext‬هذا يستدعي‬
‫‪.‬يتم رفعه‪ StopAsyncIteration‬تقديم‪ ‬االفتراضي‪ ، ‬يتم إرجاعه إذا تم استنفاد المكرر ‪ ،‬وإال‬

‫الجديد في اإلصدار ‪3.10.1‬‬

‫‪ ) ‬متكرر ‪any( ‬‬

‫‪:‬أي ما يعادل‪ False. ‬إذا كان أي عنصر من العناصر‪ ‬القابلة للتكرار‪ ‬صحيحً ا‪ .‬إذا كان العنصر المكرر فار ًغا ‪ ،‬فارجع‪ True‬العودة‬

‫‪def any(iterable):‬‬

‫‪for element in iterable:‬‬

‫‪if element:‬‬

‫‪return True‬‬

‫‪return False‬‬

‫‪ ) ‬كائن ‪ascii( ‬‬

‫في سلسلة إرجاعها ‪ ASCII‬ارجع سلسلة تحتوي على تمثيل قابلة للطباعة من كائن‪ ،‬ولكن هربا من أحرف غير)(‪ repr‬كما‬
‫‪ Python 2.‬في)(‪ repr‬الهروب‪  .‬يؤدي هذا إلى إنشاء سلسلة مشابهة لتلك التي تم إرجاعها‪ \U‬أو‪ \x، \u‬استخدام)(‪ repr‬بواسطة‬

‫‪ ) ‬خ ‪bin( ‬‬

‫‪ Python ،‬كائ ًنا في‪ xint ‬والنتيجة هي تعبير صالح في بايثون‪ .‬إذا‪ ‬لم يكن‪b". ‬تحويل عدد صحيح إلى سلسلة ثنائية مسبوقة بـ "‪0‬‬
‫‪:‬طريقة ُترجع ً‬
‫عددا صحيحً ا‪ .‬بعض األمثلة)(__‪ __index‬فيجب عليه تحديد‬

‫>>>‬

‫)‪>>> bin(3‬‬

‫'‪'0b11‬‬

‫‪Pg. 143‬‬
‫)‪>>> bin(-10‬‬

‫'‪'-0b1010‬‬

‫‪.‬مطلوبة أم ال ‪ ،‬يمكنك استخدام أي من الطرق التالية "‪b‬إذا كانت البادئة "‪0‬‬

‫>>>‬

‫)'‪>>> format(14, '#b'), format(14, 'b‬‬

‫)'‪('0b1110', '1110‬‬

‫'}‪>>> f'{14:#b}', f'{14:b‬‬

‫)'‪('0b1110', '1110‬‬

‫‪.‬لمزيد من المعلومات)(‪ format‬انظر أيضا‬

‫‪ bool( [ x  ] ) ‬فئة‬

‫خطأ أو تم‪ x ‬باستخدام‪ ‬إجراء اختبار الحقيقة‪ ‬القياسي‪ . ‬إذا كانت‪ x ‬يتم تحويل‪ False. ‬أو‪ True‬قم بإرجاع قيمة منطقية ‪ ،‬مثل واحد من‬
‫انظر‪ ‬أنواع الرقمية ‪ -‬كثافة‪ ،‬تطفو‪ int( ،‬الفئة هي فئة فرعية من‪ bool‬و‪ True. ‬؛‪ ‬وإال فإنه يعود‪ False‬حذفها‪ ، L‬يتم إرجاعها‬
‫‪ ).‬انظر‪ ‬القيم المنطقية(‪ True‬و‪ False‬ال يمكن تصنيفها إلى فئة فرعية أخرى‪ .‬حاالته الوحيدة هي‪ ). ‬معقدة‬

‫‪.‬اآلن معلمة موضعية فقط‪ x ‬تم التغيير في اإلصدار ‪ :3.7‬أصبح‬

‫‪breakpoint( *  args ، **  kws ) ‬‬

‫‪ args‬ويمر ‪ sys.breakpointhook()،‬تنقلك هذه الوظيفة إلى مصحح األخطاء في موقع االتصال‪ .‬على وجه التحديد‪ ،‬وتدعو‬
‫أي وسيطات‪ .‬في هذه)(‪ pdb.set_trace‬المكالمات)(‪ sys.breakpointhook‬مباشرة من خالل‪ .‬بشكل افتراضي ‪ ،‬ال تتوقع‪ kws‬و‬
‫أو كتابة أكبر قدر ممكن من التعليمات البرمجية إلدخال مصحح ‪ pdb‬الحالة ‪ ،‬إنها وظيفة مالئمة بحتة ‪ ،‬لذا ال يتعين عليك استيراد‬
‫وسوف تستدعي ذلك تلقائيًا ‪ ،‬مما )(‪ breakpoint‬يمكن ضبطها على وظيفة أخرى)(‪ ، sys.breakpointhook‬األخطاء‪ .‬ومع ذلك‬
‫‪.‬يسمح لك باإلسقاط في مصحح األخطاء الذي تختاره‬

‫‪ breakpointhook.‬بالحجة‪ builtins.breakpoint ‬يثير‪ ‬حدث تدقيق‬

‫الجديد في اإلصدار ‪3.7.1‬‬


‫)‪ ] ‬المصدر‪ ، [  ‬ترميز‪ ، [  ‬أخطاء‪ bytearray( [ ] ]  ‬فئة‬

‫الطبقة هي سلسلة قابلة للتغيير من األعداد الصحيحة في النطاق من ‪ =< 0‬س <‪ bytearray‬إرجاع صفيف جديد من البايت‪ .‬و‬
‫نوع له‪ .256 bytes ،‬وقد معظم الطرق المعتادة للتسلسل قابلة للتغيير‪ ،‬وصفت في‪ ‬أنواع متقلب تسلسل‪ ، ‬وكذلك معظم الطرق أن‬
‫‪ .‬العمليات ‪Bytearray‬انظر‪ ‬بايت و‬

‫‪:‬يمكن استخدام معلمة‪ ‬المصدر‪ ‬االختيارية‪ ‬لتهيئة المصفوفة بعدة طرق مختلفة‬

‫‪‬‬ ‫ثم يحول السلسلة إلى )(‪ bytearray‬إذا كانت‪ ‬سلسلة‪ ، ‬يجب عليك أيضً ا تقديم‪ ‬معلمات‪ ‬الترميز‪( ‬واختياريا ً ‪ ،‬األخطاء‪ ) ‬؛‬
‫‪ str.encode().‬بايت باستخدام‬

‫‪‬‬ ‫‪.‬إذا كان‪ً  ‬‬


‫عددا صحيحً ا‪ ، ‬فسيكون للمصفوفة هذا الحجم وسيتم تهيئته باستخدام بايت فارغ‬

‫‪‬‬ ‫‪.‬إذا كان كائ ًنا يتوافق مع‪ ‬واجهة المخزن المؤقت‪ ،  ‬فسيتم استخدام مخزن مؤقت للقراءة فقط للكائن لتهيئة صفيف البايت‬

‫‪‬‬ ‫إذا كانت قابلة‪ ‬للتكرار‪ ، ‬فيجب أن تكون متكررة من األعداد الصحيحة في النطاق‪ ، ‬والتي يتم استخدامها كمحتويات أولية‬
‫‪ <= x < 256‬للمصفوفة‪0.‬‬

‫‪.‬بدون وسيطة ‪ ،‬يتم إنشاء مصفوفة بحجم ‪0‬‬

‫‪ Bytearray Objects .‬و‪ memoryview ‬و ‪ bytearray‬راجع أيضًا‪ ‬أنواع التسلسل الثنائي ‪ -‬كائنات‪ ‬بايت و‬

‫‪Pg. 144‬‬
‫)‪ ] ‬المصدر‪ ، [  ‬ترميز‪ ، [  ‬أخطاء‪ bytes( [ ] ]  ‬فئة‬

‫إرجاع كائن "بايت" جديد وهو عبارة عن تسلسل ثابت من األعداد الصحيحة في النطاق‪ . ‬هي نسخة غير قابلة للتغيير من‪ - ‬لها نفس‬
‫‪ <= x < 256bytesbytearray‬األساليب غير المتغيرة ونفس سلوك الفهرسة والتقطيع‪0.‬‬

‫‪ bytearray().‬وف ًقا لذلك ‪ ،‬يتم تفسير حجج المنشئ على أنها‬

‫‪ String and Bytes literals .‬يمكن أي ً‬


‫ضا إنشاء كائنات البايت باستخدام القيم الحرفية ‪ ،‬راجع‬

‫‪ Bytearray‬و ‪ Bytes‬و ‪ Bytes Objects ،‬و ‪ memory view ،‬و ‪ bytearray ،‬راجع أيضًا‪ ‬أنواع التسلسل الثنائي ‪ -‬بايت ‪ ،‬و‬
‫‪Operations .‬‬

‫‪ ) ‬كائن ‪callable( ‬‬

‫فال يزال من الممكن أن تفشل ‪ True،‬إذا لم يكن كذلك‪ .‬إذا عاد هذا‪ ، False‬إذا كانت‪ ‬وسيطة‪ ‬الكائن‪ ‬تبدو قابلة لالستدعاء‪ True‬العودة‬
‫أبدا‪ .‬الحظ أن الفئات قابلة لالستدعاء (استدعاء فئة تعيد مثياًل ‪ False، ‬المكالمة ‪ ،‬ولكن إذا كان األمر كذلك‬
‫فلن ينجح‪ ‬استدعاء‪ ‬الكائن‪ً  ‬‬
‫‪.‬طريقة)(__‪ __call‬جدي ًدا) ؛‪ ‬يمكن استدعاء الحاالت إذا كان لفئتها‬

‫‪ Python 3.2.‬ثم أعيدت في ‪ Python 3.0‬الجديد في اإلصدار ‪ :3.2‬تمت إزالة هذه الوظيفة ألول مرة في‬

‫‪ ) ‬ط ‪chr( ‬‬

‫ُترجع )‪ ، chr(97‬على سبيل المثال‪ i . ‬الخاصة به هي العدد الصحيح ‪ Unicode‬قم بإرجاع السلسلة التي تمثل حر ًفا تكون نقطة رمز‬
‫‪ُ  ord().‬ترجع السلسلة‪ .'€' ‬هذا هو معكوس )‪ chr(8364‬بينما'‪ 'a‬السلسلة‬

‫سيتم رفعها إذا‪ ‬كنت‪ ‬خارج هذا ‪). ValueError‬في األساس ‪ (0x10FFFF 16‬النطاق الصالح للوسيطة من ‪ 0‬إلى ‪1،114،111‬‬
‫‪.‬النطاق‬

‫‪@classmethod‬‬

‫‪.‬تحويل طريقة إلى طريقة فئة‬

‫يتلقى أسلوب الفئة الفئة كوسيطة أولية ضمنية ‪ ،‬تمامًا مثل طريقة المثيل التي تستقبل المثيل‪ .‬لإلعالن عن طريقة فئة ‪ ،‬استخدم هذا‬
‫‪:‬المصطلح‬

‫‪class C:‬‬

‫‪@classmethod‬‬

‫‪def f(cls, arg1, arg2, ...): ...‬‬

‫‪.‬شكل هو وظيفة‪ ‬الديكور‪ - ‬راجع‪ ‬التعاريف وظيفة‪ ‬للحصول على التفاصيل‪ @classmethod‬و‬

‫يتم تجاهل المثيل باستثناء فئته‪ .‬إذا تم استدعاء طريقة‪ C().f()). ‬مثل( أو في مثيل ))(‪ C.f‬مثل( يمكن استدعاء طريقة الفئة إما في الفئة‬
‫‪.‬الفئة لفئة مشتقة ‪ ،‬فسيتم تمرير كائن الفئة المشتق باعتباره الوسيطة األولى الضمنية‬

‫في هذا القسم‪ .‬لمزيد من )(‪ staticmethod‬الثابتة‪ .‬إذا كنت تريد هؤالء ‪ ،‬انظر ‪ Java‬أو ‪ C ++‬تختلف طرق الفئات عن طرق‬
‫‪ .‬المعلومات حول طرق الفصل ‪ ،‬راجع‪ ‬التدرج الهرمي للنوع القياسي‬

‫‪ property().‬تم التغيير في اإلصدار ‪ :3.9‬يمكن لطرق الفئة اآلن التفاف‪ ‬واصفات‪ ‬أخرى‪ ‬مثل‬

‫تغير في اإلصدار ‪ :3.10‬أساليب الفئة اآلن ترث سمات‪ L‬األسلوب‬


‫‪.‬السمة__‪ __wrapped‬ولها جديدة )__‪ __annotations‬و__‪( __module__، __name__، __qualname__، __doc‬‬

‫‪ ) ‬خطأ‪ ، ‬تحسين‪ ، dont_inherit  =  1 -  =  ‬المصدر‪ ، ‬اسم الملف‪ ، ‬الوضع‪ ، ‬األعالم‪compile( 0  =  ‬‬

‫‪Pg. 145‬‬
‫يمكن أن ‪ eval(). ‬أو)(‪ exec‬يمكن تنفيذ كائنات التعليمات البرمجية بواسطة‪ AST. ‬تجميع‪ ‬المصدر‪ ‬في رمز أو كائن‬
‫وثائق الوحدة للحصول على معلومات حول كيفية العمل ‪ ast‬الرجوع إلى‪ AST. ‬يكون‪ ‬المصدر‪ ‬سلسلة عادية أو سلسلة بايت أو كائن‬
‫‪ AST.‬مع كائنات‬

‫و‪ ‬اسم الملف‪ ‬حجة يجب أن تعطي الملف الذي تم قراءة الشفرة‪  .‬تمرير بعض القيم التي يمكن التعرف عليها إذا لم يتم قراءتها من‬
‫‪).‬شائع االستخدام'>‪ ( '<string‬ملف‬

‫إذا كان‪ ‬المصدر‪ ‬يتكون من سلسلة '‪ 'exec‬و‪ ‬وضع‪ ‬يحدد حجة أي نوع من التعليمات البرمجية يجب أن يكون ترجمة‪ .‬يمكن أن يكون‬
‫في الحالة ( إذا كان يتكون من عبارة تفاعلية واحدة'‪ 'single‬إذا كان يتكون من تعبير واحد ‪ ،‬أو'‪ 'eval‬من العبارات ‪ ،‬أو‬
‫‪).‬سيتم طباعة‪  ‬عبارات التعبير التي يتم تقييمها لشيء آخر غير‪ ‬سيتم طباعتها‪ ، None‬األخيرة‬

‫السيطرة التي‪ ‬خيارات المترجم‪ ‬يجب أن يتم تفعيلها والتي‪ ‬مالمح المستقبل‪ ‬يجب ‪ dont_inherit ‬الحجج اختياري‪ ‬األعالم‪ ‬و‬


‫السماح‪ .‬إذا لم يكن أي منهما موجو ًد ا (أو كالهما صفر) ‪ ،‬فسيتم تجميع الكود بنفس العالمات التي تؤثر على الكود‬
‫فسيتم استخدام خيارات المترجم ‪) ،‬أو كانت صفرً ا(‪ dont_inherit ‬ولم‪ ‬تكن ‪ flags ‬إذا تم تقديم‪ ‬وسيطة‪ compile(). ‬المتصل‬
‫باإلضافة إلى تلك التي سيتم استخدامها على أي حال‪ .‬إذا ‪ flags ‬والعبارات المستقبلية المحددة بواسطة‪ ‬وسيطة‬
‫عد ًدا صحيحً ا غير صفري ‪ ،‬فإن‪ ‬العالمات‪ L‬الحجة هي ‪ -‬يتم تجاهل العالمات‪( L‬الميزات المستقبلية وخيارات ‪ dont_inherit ‬كان‬
‫‪.‬المترجم) في الكود المحيط‬

‫معً ا لتحديد خيارات ‪ ORed‬يتم تحديد خيارات المحول البرمجي والبيانات المستقبلية بواسطة وحدات البت التي يمكن أن تكون‬
‫المثيل ‪ _Feature‬على‪ compiler_flag‬متعددة‪  .‬يمكن العثور على حقل البت المطلوب لتحديد ميزة مستقبلية معينة كسمة‬
‫‪.‬البادئة_‪ PyCF‬الوحدة النمطية ‪ ،‬مع‪ ast ‬الوحدة النمطية‪ .‬يمكن العثور على‪ ‬أعالم المترجم‪ ‬في__‪ __future‬في‬

‫‪ -O‬حجة‪ ‬األمثل‪ ‬يحدد مستوى االستغالل األمثل للمترجم‪ .‬تحدد القيمة االفتراضية لـ‪1- ‬مستوى التحسين للمترجم كما هو محدد‬
‫أو‪)  ‬خطأ__‪ ، __debug‬تمت إزالة التأكيدات(‪) ، 1‬صحيح__‪ __debug‬ال يوجد تحسين ؛(بالخيارات‪ .‬المستويات الصريحة هي‪0 ‬‬
‫‪(2.‬تمت إزالة سالسل المستندات أيضًا)‬

‫وإذا كان المصدر يحتوي على وحدات بايت ‪ ، ValueError‬إذا كان المصدر المترجم غير صالح‪ SyntaxError‬تظهر هذه الدالة‬
‫‪.‬فارغة‬

‫‪ ast.parse().‬الخاص به ‪ ،‬فراجع ‪ AST‬في تمثيل ‪ Python‬إذا كنت تريد تحليل كود‬

‫‪.‬قد يتم إثارة هذا الحدث أي ً‬


‫ضا من خالل التجميع الضمني‪ filename. ‬و‪ source‬بالحجج‪ compile ‬يثير‪ ‬حدث تدقيق‬

‫ملحوظة‬

‫‪ ‬‬

‫وضع ‪ ،‬يجب إنهاء اإلدخال بحرف سطر جديد واحد على األقل‪ .‬هذا '‪ 'eval‬أو'‪ 'single‬عند تجميع سلسلة برمز متعدد األسطر في‬
‫‪.‬الوحدة‪ code‬لتسهيل الكشف عن البيانات غير الكاملة والكاملة في‬

‫تحذير‬

‫‪ ‬‬

‫بسبب قيود عمق المكدس ‪ AST‬بسلسلة كبيرة ‪ /‬معقدة بشكل كافٍ عند التحويل البرمجي إلى كائن ‪ Python‬من الممكن تعطل مترجم‬
‫‪ Python AST.‬في مترجم‬

‫ال يجب أن '‪ ، 'exec‬أيضًا‪ Mac. ‬و ‪ Windows‬تم التغيير في اإلصدار ‪ :3.2‬السماح باستخدام األسطر الجديدة لنظامي التشغيل‬
‫‪ .‬ينتهي‪ ‬اإلدخال في‪ ‬الوضع بسطر جديد بعد اآلن‪ .‬تمت إضافة‪ ‬معلمة‪ ‬التحسين‬

‫‪ .‬تم رفعه عند مصادفة وحدات بايت فارغة في‪ ‬المصدر ‪ ، TypeError‬تم التغيير في اإلصدار ‪ :3.5‬ساب ًقا‬

‫ويمكن اآلن أن تنتقل في األعالم لتمكين دعم المستوى ‪:ast.PyCF_ALLOW_TOP_LEVEL_AWAIT ‬الجديد في اإلصدار ‪3.8‬‬
‫‪ .async forasync with‬و‪ await، ‬األعلى‬

‫‪ ] ) ‬حقيقي‪ ، [  ‬تخيل‪ complex( [ ]  ‬فئة‬

‫‪Pg. 146‬‬
‫أو تحويل سلسلة أو رقم لعدد معقدة‪ .‬إذا كانت المعلمة األولى عبارة عن سلسلة ‪J ،‬إرجاع عدد معقدة مع القيمة‪ ‬الحقيقية‪ + ‬ايماج‪1 * ‬‬
‫فسيتم تفسيرها على أنها رقم مركب ويجب استدعاء الوظيفة بدون معلمة ثانية‪ .‬ال يمكن أن تكون المعلمة الثانية سلسلة‪ .‬قد تكون كل‬
‫وسيطة من أي نوع رقمي (بما في ذلك المعقد)‪ .‬إذا‪ ‬تم حذف الصورة ‪ ،‬فسيتم تعيينها‪ ‬افتراضيًا على الصفر ويعمل المُنشئ كتحويل‬
‫‪j.‬إذا تم حذف كلتا الوسيطتين ‪ ،‬يتم إرجاع‪ float. 0 ‬و‪ int‬رقمي مثل‬

‫لم يتم تعريفه ثم يعود )(__‪ __complex‬إذا‪ x.__complex__(). ‬يفوض إلى)‪ x، complex(x‬العام ‪ Python‬بالنسبة لكائن‬


‫‪ __index__().‬لم يتم تعريفه ثم يعود إلى)(__‪ __float‬إذا‪ __float__(). ‬إلى‬

‫ملحوظة‬

‫‪ ‬‬

‫عند التحويل من سلسلة ‪ ،‬يجب أال تحتوي السلسلة على مسافة‪ L‬بيضاء حول الوسط‪+ ‬أو‪- ‬المشغل‪ .‬على سبيل‬
‫‪ .complex('1 + 2j')ValueError‬ال بأس به ‪ ،‬لكنه‪ ‬يزيد)'‪ ، complex('1+2j‬المثال‬

‫‪ - int ، float ، complex .‬يتم وصف النوع المعقد في‪ ‬األنواع الرقمية‬

‫‪.‬تم التغيير في اإلصدار ‪  :3.6‬يُسمح بتجميع األرقام مع الشرطة السفلية كما هو الحال في الرموز الحرفية‬

‫‪.‬غير محددة)(__‪ __float‬و)(__‪ __complex‬إذا)(__‪ __index‬تغير في اإلصدار ‪ :3.8‬شالالت العودة إلى‬

‫‪ ) ‬كائن‪ ، ‬اسم ‪delattr( ‬‬

‫الوسيطات هي كائن وسلسلة‪ .‬يجب أن تكون السلسلة اسم إحدى سمات‪ L‬الكائن‪ .‬تقوم الوظيفة بحذف ‪ setattr(). ‬هذا هو أحد أقارب‬
‫‪ .delattr(x, 'foobar')del x.foobar‬السمة المسماة‪ ، L‬بشرط أن يسمح بها الكائن‪ .‬على سبيل المثال ‪ ،‬يعادل‬

‫)‪ dict( **  kwarg ‬فئة‬

‫)‪ ، **  kwarg ‬رسم الخرائط ‪ dict( ‬فئة‬

‫)‪ dict( iterable ، **  kwarg ‬الفئة‬

‫‪.‬و‪ ‬أنواع الخرائط ‪ -‬ديكت‪ ‬للتوثيق حول هذه الفئة‪ dict‬الهدف من ذلك هو الطبقة القاموس‪ .‬رؤية‪ dict‬أنشئ قامو ًسا جدي ًدا‪ .‬و‬

‫‪.‬وحدة‪ collections‬الطبقات‪ ،‬وكذلك‪ tuple‬و‪ list، set‬للحاويات أخرى ترى المدمج في‬

‫‪ ] ) ‬كائن ‪dir( [ ‬‬

‫بدون وسيطات ‪ ،‬قم بإرجاع قائمة األسماء في النطاق المحلي الحالي‪ .‬باستخدام وسيطة ‪ ،‬حاول إرجاع قائمة بالسمات‪ L‬الصالحة لهذا‬
‫‪.‬الكائن‬

‫فسيتم استدعاء هذه الطريقة ويجب أن تعيد قائمة السمات‪ L.‬يسمح هذا للكائنات ‪ __dir__()،‬إذا كان الكائن يحتوي على طريقة مسماة‪L‬‬
‫‪.‬اإلبالغ عن سماتها‪ dir()L‬وظيفة بتخصيص طريقة)(__‪ __getattribute‬أو)(__‪ __getattr‬التي تنفذ‪ ‬تخصيصًا‬

‫سمة‪ ‬الكائن‪ ، ‬إذا تم تعريفها ‪ ،‬ومن__‪ __dict‬فإن الوظيفة تبذل قصارى جهدها لجمع المعلومات من ‪ __dir__()،‬إذا لم يوفر الكائن‬
‫‪ __getattr__().‬كائن النوع الخاص به‪  .‬القائمة الناتجة ليست بالضرورة كاملة وقد تكون غير دقيقة عندما يكون للكائن مخصص‬

‫تتصرف اآللية‪ ‬االفتراضية‪  ‬بشكل مختلف مع أنواع مختلفة من الكائنات ‪ ،‬حيث تحاول إنتاج المعلومات األكثر صلة وليست )(‪dir‬‬
‫‪:‬كاملة‬

‫‪‬‬ ‫‪.‬إذا كان الكائن عبارة عن كائن وحدة نمطية ‪ ،‬فإن القائمة تحتوي على أسماء سمات الوحدة النمطية‬

‫‪‬‬ ‫‪.‬إذا كان الكائن عبارة عن كائن نوع أو فئة ‪ ،‬فإن القائمة تحتوي على أسماء‪ L‬سماتها‪ ، L‬وبشكل متكرر لسمات قواعدها‬

‫‪‬‬ ‫بخالف ذلك ‪ ،‬تحتوي القائمة على أسماء سمات الكائن ‪ ،‬وأسماء سمات‪ L‬فئتها ‪ ،‬وبشكل متكرر لسمات الفئات األساسية‬
‫‪.‬لفئتها‬

‫‪:‬يتم فرز القائمة الناتجة أبجديًا‪ .‬على سبيل المثال‬

‫‪Pg. 147‬‬
‫>>>‬

‫‪>>> import struct‬‬

‫‪>>> dir() # show the names in the module namespace‬‬

‫]'‪['__builtins__', '__name__', 'struct‬‬

‫‪>>> dir(struct) # show the names in the struct module‬‬

‫‪['Struct', '__all__', '__builtins__', '__cached__', '__doc__', '__file__',‬‬

‫‪'__initializing__', '__loader__', '__name__', '__package__',‬‬

‫‪'_clearcache', 'calcsize', 'error', 'pack', 'pack_into',‬‬

‫]'‪'unpack', 'unpack_from‬‬

‫‪>>> class Shape:‬‬

‫‪...‬‬ ‫‪def __dir__(self):‬‬

‫‪...‬‬ ‫]'‪return ['area', 'perimeter', 'location‬‬

‫)(‪>>> s = Shape‬‬

‫)‪>>> dir(s‬‬

‫]'‪['area', 'location', 'perimeter‬‬

‫ملحوظة‬

‫‪ ‬‬

‫يتم توفيره بشكل أساسي كوسيلة مالئمة لالستخدام في موجه تفاعلي ‪ ،‬فإنه يحاول توفير مجموعة مثيرة لالهتمام من )(‪ dir‬نظرً ا ألنه‬
‫األسماء أكثر مما يحاول توفير مجموعة أسماء محددة بدقة أو باستمرار ‪ ،‬وقد يتغير سلوكه التفصيلي عبر اإلصدارات‪ .‬على سبيل‬
‫‪.‬في قائمة النتائج عندما تكون الوسيطة عبارة عن فئة ‪ metaclass‬المثال ‪ ،‬ال توجد سمات‪L‬‬

‫‪ ) ‬أ‪ ، ‬ب ‪divmod( ‬‬

‫خذ عددين (غير مركبين) كوسيطات وأعد زوجً ا من األرقام يتكون من حاصل القسمة والباقي عند استخدام القسمة الصحيحة‪ .‬مع‬
‫أنواع المعامالت المختلطة ‪ ،‬يتم تطبيق قواعد العمليات الحسابية الثنائية‪ .‬بالنسبة لألعداد الصحيحة ‪ ،‬تكون النتيجة هي‬
‫عاد ًة‪ ‬ولكن قد تكون أقل من ذلك بمقدار ‪ .1‬على أي ‪ q ‬نفسها‪ . ‬بالنسبة ألرقام الفاصلة العائمة ‪ ،‬تكون النتيجة‪ ، ‬حيث تكون‬
‫)‪ .(a // b, a % b‬و ‪ b ،‬وإذا كانت‪ ‬غير صفرية ‪ ،‬فإنها تحمل نفس عالمة ‪ a ،‬حال ‪ ،‬تكون قريبة ج ًدا من‬
‫)‪(q, a % b)math.floor(a / b)q * b + a % ba % b0 <= abs(a % b) < abs(b‬‬

‫‪ ) ‬متكرر‪ ، ‬ابدأ‪enumerate( 0  =  ‬‬

‫)(__‪ __next‬يجب أن يكون تسلسل‪ ،‬وهو‪ ‬مكرر‪ ، ‬أو بعض وجوه اآلخرين التي تدعم التكرار‪ .‬و‪. iterable ‬إرجاع كائن تعداد‬
‫تحتوي على عدد (من‪ ‬بداية‪ ‬افتراضات إلى ‪ 0‬أي) والقيم التي تم )‪ (tuple‬عائدات الصفوف)(‪ enumerate‬أسلوب مكرر عاد من‬
‫‪ iterable .‬الحصول عليها من بالتكرار عبر‬

‫>>>‬

‫]'‪>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter‬‬

‫))‪>>> list(enumerate(seasons‬‬

‫])'‪[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter‬‬

‫‪Pg. 148‬‬
‫))‪>>> list(enumerate(seasons, start=1‬‬

‫])'‪[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter‬‬

‫‪:‬أي ما يعادل‬

‫‪def enumerate(sequence, start=0):‬‬

‫‪n = start‬‬

‫‪for elem in sequence:‬‬

‫‪yield n, elem‬‬

‫‪n += 1‬‬

‫‪ ) ‬تعبير‪ ، [  ‬عالمي‪ ، [  ‬محليون‪eval( ] ]  ‬‬

‫قاموسًا‪ .‬إذا تم ‪ globals ‬االختيارية والسكان المحليين‪ .‬إذا تم توفيرها ‪ ،‬يجب أن تكون ‪ globals‬الحجج عبارة عن سلسلة و‬
‫‪.‬توفيرها ‪ ،‬يمكن أن يكون‪ ‬السكان المحليون‪ ‬أي كائن تعيين‬

‫و‪ ‬التعبير‪  ‬يتم تحليل حجة وتقييمها كتعبير بيثون (من الناحية الفنية‪ ،‬وقائمة حالة) باستخدام‪ ‬غلوبالس‪ ‬و‪ ‬السكان المحليين‪ ‬القواميس كما‬
‫فسيتم إدراج مرجع ‪ __builtins__،‬موجو ًدا وال يحتوي على قيمة للمفتاح‪ globals ‬مساحة‪ L‬االسم العالمي والمحلي‪ .‬إذا كان‪ ‬قاموس‬
‫تحت هذا المفتاح قبل‪ ‬تحليل‪ ‬التعبير‪ . ‬وبهذه الطريقة يمكنك التحكم في العناصر ‪ builtins‬إلى قاموس الوحدة النمطية المضمنة‬
‫إذا ‪ eval(). ‬قبل تمريره إليه‪ globals ‬في__‪ __builtins‬المضمنة المتاحة للكود المنفذ عن طريق إدراج قاموسك الخاص‬
‫كان‪ ‬السكان المحليين‪ ‬تم حذف القاموس فإنه افتراضات إلى‪ ‬غلوبالسقاموس‪ .‬إذا تم حذف كل من القواميس‪ ،‬يتم تنفيذ التعبير‬
‫حق الوصول إلى‪ ‬النطاقات‪ L‬المتداخلة‪( ‬غير‪ EVAL () ‬يسمى‪ .‬مالحظة ‪ ،‬ال تملك)(‪ eval‬مع‪ ‬غلوبالس‪ ‬و‪ ‬السكان المحليين‪ ‬في بيئة حيث‬
‫‪.‬المحلية) في البيئة المرفقة‬

‫‪:‬القيمة المرجعة هي نتيجة التعبير المقيَّم‪ .‬يتم اإلبالغ عن األخطاء النحوية كاستثناءات‪ .‬مثال‬

‫>>>‬

‫‪>>> x = 1‬‬

‫)'‪>>> eval('x+1‬‬

‫‪2‬‬

‫في هذه ‪ compile()). ‬مثل تلك التي تم إنشاؤها بواسطة( يمكن أيضً ا استخدام هذه الوظيفة لتنفيذ كائنات تعليمات برمجية عشوائية‬
‫ستكون الصورة قيمة )(‪، eval‬مثل‪ ‬وضع‪ ‬حجة'‪ 'exec‬الحالة ‪ ،‬قم بتمرير كائن رمز بدالً من سلسلة‪ .‬إذا تم تجميع الكائن الرمز مع‬
‫‪ None.‬اإلرجاع‬

‫ظائف عودة القاموس العالمي والمحلي الحالي‪ locals() ،‬و)(‪ globals‬الوظيفة‪ ‬التنفيذ الديناميكي للبيانات‪ . ‬و‪ exec() ‬تلميحات‪ :‬تدعم‬
‫‪ exec().‬أو)(‪ eval‬على التوالي‪ ،‬والتي قد تكون مفيدة لتمرير حول الستخدامها‪ L‬من قبل‬

‫‪.‬إذا كان المصدر المحدد عبارة عن سلسلة ‪ ،‬فسيتم تجريد المسافات وعالمات الجدولة البادئة والالحقة‬

‫‪.‬للحصول على وظيفة يمكنها تقييم السالسل بأمان مع التعبيرات التي تحتوي على حرفية فقط)(‪ ast.literal_eval‬انظر‬

‫‪.‬مع كائن التعليمات البرمجية كوسيطة‪ .‬قد يتم أيضً ا رفع أحداث تجميع التعليمات البرمجية‪ exec ‬رفع‪ ‬حدث تدقيق‬

‫‪ ) ‬كائن‪ ، [  ‬عالمي‪ ، [  ‬محليون‪exec( ] ]  ‬‬

‫يجب أن يكون‪ ‬الكائن‪ ‬إما سلسلة أو كائن رمز‪ .‬إذا كانت سلسلة ‪ ،‬يتم تحليل ‪ Python. ‬تدعم هذه الوظيفة التنفيذ الديناميكي لرمز‬
‫والتي يتم تنفيذها بعد ذلك (ما لم يحدث خطأ في بناء الجملة)‪ 1 .‬إذا كان كائن رمز ‪ ،‬يتم ‪ Python‬السلسلة كمجموعة من عبارات‬
‫تنفيذه ببساطة‪ .‬في جميع الحاالت ‪ ،‬من المتوقع أن يكون الرمز الذي تم تنفيذه صالحً ا كإدخال ملف (راجع قسم "إدخال الملف" في‬

‫‪Pg. 149‬‬
‫البيانات قد ال تكون خارج تستخدم التعاريف وظيفة حتى في سياق‪ return ‬و‪ nonlocal، yield‬الدليل المرجعي)‪ .‬كن على علم بأن‬
‫‪ None.‬وظيفة‪ .‬القيمة المعادة هي)(‪ exec‬كود تمريرها إلى‬

‫فقط‪ ، ‬فيجب أن ‪  globals ‬في جميع الحاالت ‪ ،‬إذا تم حذف األجزاء االختيارية ‪ ،‬فسيتم تنفيذ الكود في النطاق الحالي‪ .‬إذا‪ ‬تم توفير‬
‫يكون قاموسً ا (وليس فئة فرعية من القاموس) ‪ ،‬والذي سيتم استخدامه لكل من المتغيرات العامة‪ L‬والمحلية‪ .‬إذا تم تقديم‪ ‬الكرات‬
‫األرضية‪  ‬والسكان المحليين‪ ، ‬فسيتم‪ ‬استخدامها للمتغيرات العالمية والمحلية ‪ ،‬على التوالي‪ .‬إذا تم توفيرها ‪ ،‬يمكن أن يكون‪ ‬السكان‬
‫المحليون‪ ‬أي كائن تعيين‪  .‬تذكر أنه على مستوى الوحدة النمطية ‪ ،‬فإن القاموس العالمي والسكان المحليين هم نفس القاموس‪ .‬إذا‬
‫‪.‬إكسيك يحصل كائنين منفصلين كما‪ ‬غلوبالس‪ ‬و‪ ‬السكان المحليين‪ ،  ‬وسيتم تنفيذ الكود كما لو كانت جزءا ال يتجزأ في تعريف فئة‬

‫فسيتم إدراج إشارة إلى قاموس الوحدة النمطية ‪ __builtins__،‬ال يحتوي على قيمة للمفتاح‪ globals ‬إذا كان‪ ‬قاموس‬
‫تحت هذا المفتاح‪  .‬وبهذه الطريقة يمكنك التحكم في العناصر المضمنة المتاحة للكود المنفذ عن طريق إدراج ‪ builtins‬المضمنة‬
‫‪ exec().‬قبل تمريره إليه‪ globals ‬في__‪ __builtins‬قاموسك الخاص‬

‫‪.‬مع كائن التعليمات البرمجية كوسيطة‪ .‬قد يتم أيضً ا رفع أحداث تجميع التعليمات البرمجية‪ exec ‬رفع‪ ‬حدث تدقيق‬

‫ملحوظة‬

‫‪ ‬‬

‫إعادة القاموس العالمي والمحلي الحالي‪ ،‬على التوالي‪ ،‬والتي قد تكون مفيدة لتمرير حول )(‪ locals‬و)(‪ globals‬المدمج في وظائف‬
‫‪ exec().‬الستخدامها بوصفها الوسيطة الثانية والثالثة ل‬

‫ملحوظة‬

‫‪ ‬‬

‫أدناه‪ :‬ال ينبغي محاولة‪ ‬إجراء تعديالت على‪ ‬قاموس‪ ‬السكان )(‪ locals‬يعمل‪ ‬السكان المحليون‪ ‬االفتراضيون‪ ‬كما هو موضح للوظيفة‬


‫إرجاع‪ ‬ال)(‪ exec‬المحليين‪ ‬االفتراضي‪ . ‬مرر‪ ‬قاموسًا‪ ‬محليًا‪ ‬صريحً ا‪ ‬إذا كنت بحاجة إلى رؤية تأثيرات الكود على‪ ‬السكان المحليين‪ ‬بعد‬
‫‪ .‬وظيفة‬

‫‪ ) ‬وظيفة‪ ، ‬تكرارية ‪filter( ‬‬

‫قد يكون إما التسلسل‪ ،‬حاوية التي تدعم ‪. iterable ‬أنشئ مكررً ا من تلك العناصر‪ ‬القابلة للتكرار‪ ‬التي‪ ‬تعود‪ ‬الدالة على أنها‪ ‬صحيحة‬
‫‪.‬تتم إزالة كاذبة‪ iterable ‬يفترض وظيفة الهوية‪ ،‬وهذا هو‪ ،‬كل عناصر ‪ None،‬التكرار‪ ،‬أو مكرر‪ .‬إذا‪ ‬وظيفة‪ ‬هي‬

‫)‪ .filter(function, iterable‬علما بأن‪ ‬ما يعادل التعبير مولد‪ ‬إذا هي وظيفة ال‪ ‬و‪ ‬إذا هي وظيفة‬


‫‪(item for item in iterable if function(item))None(item for item in iterable if item)None‬‬

‫‪.‬للدالة التكميلية التي ترجع عناصر‪ ‬قابلة للتكرار‪ ‬والتي‪ ‬ترجع‪ ‬الدالة‪ ‬خطأ )(‪ itertools.filterfalse‬انظر‬

‫‪ float( [ x  ] ) ‬فئة‬

‫‪ x .‬قم بإرجاع رقم النقطة العائمة المكون من رقم أو سلسلة‬

‫إذا كانت الوسيطة عبارة عن سلسلة ‪ ،‬فيجب أن تحتوي على رقم عشري ‪ ،‬مسبو ًقا بشكل اختياري بعالمة ‪ ،‬ومضمّن اختياريًا في‬
‫مسافة‪ L‬بيضاء‪ .‬قد تكون العالمة االختيارية‪'+' ‬أو‪'-' ‬؛‪ ‬على‪'+' ‬عالمة ليس له أي تأثير على القيمة المنتجة‪ .‬قد تكون الوسيطة أيضًا‬
‫أو ما ال نهاية موجبًا أو سالبًا‪ .‬بتعبير أدق ‪ ،‬يجب أن يتوافق اإلدخال مع القواعد النحوية ‪) ،‬ليس رقمًا( ‪ NaN‬عبارة عن سلسلة تمثل‬
‫‪:‬التالية بعد إزالة أحرف المسافات‪ L‬البيضاء البادئة والزائدة‬

‫عالمة‬ ‫"‪:: = "+" | "-‬‬

‫‪" = ::‬إنفينيتي‬ ‫"‪" | "INF‬الالنهاية‬

‫عند‬ ‫"‪:: = "at‬‬

‫‪numeric_value :: = floatnumber| infinity|nan‬‬

‫‪numeric_string :: = [ sign]numeric_value‬‬

‫‪Pg. 150‬‬
‫هو شكل حرفية‪ ‬الفاصلة العائمة‪ ‬في بايثون ‪ ،‬موصوفة في‪ ‬حرفية النقطة العائمة‪ . ‬الحالة ليست مهمة‪ ، L‬لذلك ‪ floatnumber ،‬هذا‬
‫‪.‬كلها تهجئات مقبولة لما ال نهاية موجبة "‪ "iNfINity‬و "‪ "INFINITY‬و "‪ "Inf‬و "‪ ، "inf‬على سبيل المثال‬

‫ضمن دقة ( وإال ‪ ،‬إذا كانت الوسيطة عبارة عن عدد صحيح أو رقم فاصلة عائمة ‪ ،‬فسيتم إرجاع رقم فاصلة عائمة بنفس القيمة‬
‫‪.‬فسيتم رفع قيمة‪ Python ، OverflowError‬إذا كانت الوسيطة خارج نطاق عائم‪ Python). ‬الفاصلة العائمة في‬

‫‪ __index__().‬لم يتم تعريفه ثم يعود إلى)(__‪ __float‬إذا‪ x.__float__(). ‬يفوض إلى)‪ x، float(x‬العام ‪ Python‬بالنسبة لكائن‬

‫‪.‬إذا لم يتم تقديم أي حجة ‪0.0 ،‬يتم إرجاعها‬

‫‪:‬أمثلة‬

‫>>>‬

‫)'‪>>> float('+1.23‬‬

‫‪1.23‬‬

‫)'‪>>> float(' -12345\n‬‬

‫‪-12345.0‬‬

‫)'‪>>> float('1e-003‬‬

‫‪0.001‬‬

‫)'‪>>> float('+1E6‬‬

‫‪1000000.0‬‬

‫)'‪>>> float('-Infinity‬‬

‫‪-inf‬‬

‫‪ - int ، float ، complex .‬يتم وصف نوع الطفو في‪ ‬األنواع الرقمية‬

‫‪.‬تم التغيير في اإلصدار ‪  :3.6‬يُسمح بتجميع األرقام مع الشرطة السفلية كما هو الحال في الرموز الحرفية‬

‫‪.‬اآلن معلمة موضعية فقط‪ x ‬تم التغيير في اإلصدار ‪ :3.7‬أصبح‬

‫‪.‬لم يتم تعريفه)(__‪ __float‬إذا)(__‪ __index‬تم التغيير في اإلصدار ‪ :3.8‬يعود إلى‬

‫‪ [ ، format_spec  ] ) ‬القيمة ‪format( ‬‬

‫على نوع‪ ‬وسيطة‪ ‬القيمة‪ ‬؛‪ ‬ومع ذلك ‪ format_spec ،‬يعتمد تفسير‪ format_spec . ‬تحويل‪ ‬قيمة‪ ‬إلى تمثيل "منسق" ‪ ،‬كما يتحكم به‬
‫‪  .‬هناك بناء جملة تنسيق قياسي يتم استخدامه من قبل معظم األنواع المضمنة‪ :‬مواصفات التنسيق لغة مصغرة‬

‫‪ str(value).‬االفتراضي‪ ‬عبارة عن سلسلة فارغة تعطي عاد ًة نفس تأثير االستدعاء‪ format_spec ‬تنسيق‬

‫تتم ترجمة‪ ‬استدعاء إلى‪ ‬والذي يتجاوز قاموس المثيل عند البحث عن‪ ‬طريقة‪ ‬القيمة‪ . ‬يظهر‪ ‬استثناء إذا وصل بحث‬
‫أو القيمة المرجعة عبارة عن ‪ format_spec ‬غير فارغ ‪ ،‬أو إذا‪ ‬لم تكن قيمة‪ format_spec ‬األسلوب‪ ‬وكان‬
‫‪.format(value, format_spec)type(value).__format__(value, format_spec)__format__()TypeError‬سالسل‬
‫‪object‬‬

‫‪.‬ليست سلسلة فارغة‪ format_spec ‬إذا‪ TypeError ‬يثير‪:object().__format__(format_spec) ‬تغير في اإلصدار ‪3.4‬‬

‫)‪ ] ‬متكرر ‪ frozenset( [ ‬فئة‬

‫هي فئة مدمجة‪ . frozenset.‬كائن‪ ‬جديد‪ ، ‬اختياريًا باستخدام العناصر المأخوذة من العناصر‪ ‬القابلة للتكرار ‪ frozenset‬قم بإرجاع‬
‫‪.‬للتوثيق حول هذه الفئة‪، frozenset ‬و‪ ‬تعيين أنواع ‪ -‬مجموعة‪  frozenset‬انظر‬

‫‪Pg. 151‬‬
‫‪.‬الوحدة النمطية‪ collections ‬والفئات ‪ ،‬باإلضافة إلى‪ tuple، dict‬و‪ set، list‬بالنسبة للحاويات األخرى ‪ ،‬راجع‪ ‬الفئات‪ ‬المضمنة‬

‫‪ ) ‬الكائن‪ ، ‬االسم‪ ، [  ‬افتراضي‪getattr( ]  ‬‬

‫إرجاع قيمة السمة المسماة‪ ‬للكائن‪ . ‬يجب أن يكون‪ ‬االسم‪ ‬سلسلة‪ .‬إذا كانت السلسلة هي اسم إحدى سمات الكائن ‪ ،‬فإن النتيجة هي قيمة‬
‫تلك السمة‪ .‬على سبيل المثال ‪ ،‬يعادل‪ . ‬في حالة عدم وجود السمة المسماة‪ ، L‬يتم إرجاع‪ ‬االفتراضي‪ ‬إذا تم توفيره ‪ ،‬وإال‪ ‬يتم‬
‫‪.getattr(x, 'foobar')x.foobarAttributeError‬رفعه‬

‫ملحوظة‬

‫‪ ‬‬

‫نظرً ا ألن‪ ‬تشويه االسم الخاص‪  ‬يحدث في وقت التجميع ‪ ،‬يجب على المرء أن يفسد اسم سمة خاصة يدويًا (سمات‪ L‬ذات شرطين تحت‬
‫‪ getattr().‬السطر) الستردادها باستخدام‬

‫)(‪globals‬‬

‫قم بإرجاع قاموس يمثل جدول الرموز العام الحالي‪ .‬هذا هو دائ ًم ا قاموس الوحدة الحالية (داخل دالة أو طريقة ‪ ،‬هذه هي الوحدة التي‬
‫‪.‬تم تعريفها فيها ‪ ،‬وليست الوحدة التي تسمى منها)‬

‫‪ ) ‬كائن‪ ، ‬اسم ‪hasattr( ‬‬

‫إذا لم تكن كذلك‪( .‬يتم تنفيذ ‪ ، False‬إذا كانت السلسلة هي اسم إحدى سمات‪ L‬الكائن‪ True‬الوسيطات هي كائن وسلسلة‪ .‬والنتيجة هي‬
‫‪getattr(object, name)AttributeError‬ذلك عن طريق االتصال‪ ‬ومعرفة ما إذا كان يثير‪ ‬أم ال‪).‬‬

‫‪ ) ‬كائن ‪hash( ‬‬

‫إرجاع قيمة التجزئة للعنصر (إذا كان يحتوي على قيمة)‪ .‬قيم الهاش هي أعداد صحيحة‪ .‬يتم استخدامها لمقارنة مفاتيح القاموس‬
‫بسرعة أثناء البحث في القاموس‪  .‬القيم الرقمية التي تقارن متساوية لها نفس قيمة التجزئة (حتى لو كانت من أنواع مختلفة ‪ ،‬كما هو‬
‫‪.‬الحال مع ‪ 1‬و ‪)1.0‬‬

‫ملحوظة‬

‫‪ ‬‬

‫اقتطاع قيمة اإلرجاع بنا ًء على عرض البت للجهاز‪ hash() ‬األساليب‪ ‬المخصصة‪ ، ‬الحظ أنه يتم)(__‪ __hash‬بالنسبة للكائنات ذات‬
‫‪.‬للحصول على التفاصيل)(__‪ __hash‬المضيف‪ .‬انظر‬

‫‪ ] ) ‬كائن ‪help( [ ‬‬

‫استدعاء نظام المساعدة المدمج‪(  .‬هذه الوظيفة مخصصة لالستخدام التفاعلي‪ ).‬في حالة عدم تقديم أي وسيطة ‪ ،‬يبدأ نظام المساعدة‬
‫التفاعلي في وحدة تحكم المترجم الفوري‪  .‬إذا كانت الوسيطة عبارة عن سلسلة ‪ ،‬فسيتم البحث عن السلسلة كاسم وحدة نمطية أو‬
‫وظيفة أو فئة أو طريقة أو كلمة رئيسية أو موضوع توثيق ‪ ،‬ويتم طباعة صفحة تعليمات على وحدة التحكم‪ .‬إذا كانت الوسيطة هي‬
‫‪.‬أي نوع آخر من الكائنات ‪ ،‬فسيتم إنشاء صفحة تعليمات على الكائن‬

‫فهذا يعني أن المعلمات السابقة للشرطة ‪ help()،‬الحظ أنه إذا ظهرت شرطة مائلة (‪ )/‬في قائمة‪ L‬معلمات‪ L‬الوظيفة عند االستدعاء‬
‫‪ .‬المائلة هي موضعية فقط‪ .‬لمزيد من المعلومات ‪ ،‬راجع‪ ‬إدخال األسئلة الشائعة حول معلمات الموضع فقط‬

‫‪.‬الوحدة النمطية‪ site‬تمت إضافة هذه الوظيفة إلى مساحة‪ L‬االسم المضمنة بواسطة‬

‫‪.‬هي اآلن أكثر شاملة ومتسقة ‪callables‬يعني أن التوقيعات ذكرت ل‪ inspect‬و‪ pydoc‬تغير في اإلصدار ‪ :3.4‬التغييرات‬

‫‪ ) ‬خ ‪hex( ‬‬

‫فيجب عليه ‪ Python ،‬كائ ًنا في‪ xint ‬إذا‪ ‬لم يكن‪ x”. ‬تحويل عدد صحيح إلى سلسلة سداسية عشرية صغيرة مسبوقة بـ “‪0‬‬
‫‪:‬طريقة ُترجع عد ًدا صحيحً ا‪ .‬بعض األمثلة)(__‪ __index‬تحديد‬

‫>>>‬

‫‪Pg. 152‬‬
‫)‪>>> hex(255‬‬

‫'‪'0xff‬‬

‫)‪>>> hex(-42‬‬

‫'‪'-0x2a‬‬

‫إذا كنت ترغب في تحويل رقم صحيح إلى سلسلة سداسية عشرية كبيرة أو أقل ببادئة أم ال ‪ ،‬يمكنك استخدام أي من الطريقتين‬
‫‪:‬التاليتين‬

‫>>>‬

‫‪>>> '%#x' % 255, '%x' % 255, '%X' % 255‬‬

‫)'‪('0xff', 'ff', 'FF‬‬

‫)'‪>>> format(255, '#x'), format(255, 'x'), format(255, 'X‬‬

‫)'‪('0xff', 'ff', 'FF‬‬

‫'}‪>>> f'{255:#x}', f'{255:x}', f'{255:X‬‬

‫)'‪('0xff', 'ff', 'FF‬‬

‫‪.‬لمزيد من المعلومات)(‪ format‬انظر أيضا‬

‫‪.‬لتحويل سلسلة سداسية عشرية إلى عدد صحيح باستخدام األساس ‪ int()16‬انظر أيضًا‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬الطريقة)(‪ float.hex‬للحصول على تمثيل سلسلة سداسية عشرية لعدد عشري ‪ ،‬استخدم‬

‫‪ ) ‬كائن ‪id( ‬‬

‫إعادة "هوية" كائن‪ .‬هذا عدد صحيح مضمون أن يكون فري ًدا وثاب ًتا لهذا الكائن خالل حياته‪ .‬قد يكون لكائنان ذات أعمار غير متراكبة‬
‫‪.‬القيمة‪ id() ‬نفس‬

‫‪.‬هذا هو عنوان الكائن في الذاكرة‪ CPython: ‬تفاصيل تنفيذ‬

‫‪ id.‬بالحجة‪ builtins.id ‬يثير‪ ‬حدث تدقيق‬

‫‪ ] ) ‬موجه ‪input( [ ‬‬

‫إذا كانت‪ ‬الوسيطة‪ ‬الفورية‪  ‬موجودة ‪ ،‬يتم كتابتها إلى اإلخراج القياسي دون سطر جديد الحق‪ .‬تقوم الوظيفة بعد ذلك بقراءة سطر من‬
‫‪:‬يتم رفعه‪ .‬مثال‪ EOF ، EOFError‬اإلدخال ‪ ،‬وتحويله إلى سلسلة (تجريد سطر جديد الحق) ‪ ،‬وإرجاع ذلك‪ .‬عند قراءة‬

‫>>>‬

‫)' >‪>>> s = input('--‬‬

‫‪--> Monty Python's Flying Circus‬‬

‫‪>>> s‬‬

‫"‪"Monty Python's Flying Circus‬‬

‫‪.‬لتوفير ميزات تحرير وتاريخ معقدة)(‪ input‬تم تحميل الوحدة النمطية ‪ ،‬فستستخدمها‪ readline‬إذا‬

‫‪Pg. 153‬‬
‫قبل قراءة المدخالت‪ promptL‬بالحجة‪ builtins.input ‬رفع‪ ‬حدث تدقيق‬

‫‪.‬بالنتيجة بعد قراءة اإلدخال بنجاح‪ builtins.input/result‬رفع حدث تدقيق‬

‫‪ int( [ x  ] ) ‬فئة‬

‫)‪ ‬س‪ ، ‬قاعدة‪ int( 10  =  ‬فئة‬

‫‪ x__int__() ،‬أو قم بإرجاعه‪0 ‬إذا لم يتم توفير وسيطات‪ .‬إذا‪ ‬حددت ‪ x ،‬قم‪ ‬بإرجاع‪ ‬كائن عدد صحيح مكون من رقم أو سلسلة‬
‫فإنها ‪ x__trunc__() ،‬إذا‪ ‬حددت‪ x.__index__(). ‬فإنها تعود ‪ x__index__() ،‬إذا‪ ‬حددت‪ x.__int__(). ‬إرجاعها)‪ int(x‬يتم‬
‫‪.‬بالنسبة ألرقام الفاصلة العائمة ‪ ،‬يتم اقتطاعها باتجاه الصفر‪ x.__trunc__(). ‬تعود‬

‫عددا صحيحً ا ‪ bytearray‬أو ‪ bytes،‬عبارة عن سلسلة‪ x ‬رقمًا أو إذا‪ ‬تم إعطاء‪ ‬أساس‪ ، ‬فيجب‪ ‬أن تكون‪ x ‬إذا‪ ‬لم يكن‬‫مثال يمثل‪ً  ‬‬
‫حرفيًا‪ ‬في‪ ‬أساس‪ ‬الجذر‪ . ‬اختياريًا ‪ ،‬يمكن أن يسبق الحرف الحرفي‪+ ‬أو‪(- ‬بدون مسافة بينهما) ويحيط به مسافة‪ L‬بيضاء‪ .‬يتكون قاعدة‬
‫وجود قيم ‪ 10‬إلى ‪ .35‬االفتراضي‪ ‬قاعدة‪ ‬هي ‪ .10‬القيم المسموح بها هي )‪ Z‬على‪ A‬أو(‪ z‬ل‪ a ‬مع ‪ n-1،‬ن الحرفي من األرقام ‪ 0‬إلى‬
‫كما هو الحال مع األعداد ‪x/0X،‬أو‪ 0b/ 0B، 0o/ 0O، 0 ‬و ‪ .36-2‬قاعدة ‪ ،8- ،2‬و‪ 16-‬الحرفية يمكن مسبوقة اختياريا مع‪0 ‬‬
‫الصحيحة في الكود‪ .‬تعني القاعدة ‪ 0‬التفسير تمامًا ككود حرفي ‪ ،‬بحيث يكون األساس الفعلي هو ‪ 2‬أو ‪ 8‬أو ‪ 10‬أو ‪ ، 16‬وبالتالي‬
‫)‪ .int('010', 0)int('010')int('010', 8‬فإن هذا‪ ‬ليس قانونيًا ‪ ،‬بينما‪ ‬هو كذلك‬

‫‪ - int ، float ، complex .‬يتم وصف نوع العدد الصحيح في‪ ‬األنواع الرقمية‬

‫األسلوب‪ ،‬الذي يسمى طريقة للحصول على __‪ base.__index‬و‪ ‬قاعدة‪ ‬كائن لديه‪ int‬تغير في اإلصدار ‪ :3.4‬إذا‪ ‬قاعدة‪ ‬ال مثيل‬
‫‪ base.__index__.‬بدالً من__‪ base.__int‬عدد صحيح للقاعدة‪ .‬تم استخدام اإلصدارات السابقة‬

‫‪.‬تم التغيير في اإلصدار ‪  :3.6‬يُسمح بتجميع األرقام مع الشرطة السفلية كما هو الحال في الرموز الحرفية‬

‫‪.‬اآلن معلمة موضعية فقط‪ x ‬تم التغيير في اإلصدار ‪ :3.7‬أصبح‬

‫‪.‬لم يتم تعريفه)(__‪ __int‬إذا)(__‪ __index‬تم التغيير في اإلصدار ‪ :3.8‬يعود إلى‬

‫‪ ) ‬كائن‪ ، ‬معلومات‪ ‬الطبقة ‪isinstance( ‬‬

‫أو‪ ‬فئة فرعية منها‪( ‬مباشرة أو غير مباشرة ‪ classinfo ،‬إذا كانت‪ ‬وسيطة‪ ‬الكائن‪  ‬مثيالً‪ ‬لوسيطة‪ True‬العودة‬


‫من )‪ (tuple‬هو الصفوف‪ classinfo ‬إذا‪ False. ‬أو‪ ‬افتراضية‪ .) ‬إذا‪ ‬الكائن‪ ‬ليس كائن من نوع معين‪ ،‬تقوم الدالة بإرجاع دائما‬
‫إذا‪ ‬الكائن‪ ‬هو مثيل في أي ‪ True‬كائنات النوع (أو متكرر‪ ،‬وغيرها من مثل هذه الصفوف) أو‪ ‬نوع االتحاد‪ ‬من أنواع متعددة‪ ،‬وعودة‬
‫‪ TypeError‬عبارة عن نوع أو مجموعة من األنواع ومثل هذه المجموعات ‪ ،‬فسيتم إصدار‪ classinfo ‬من األنواع‪ .‬إذا‪ ‬لم يكن‬
‫‪.‬استثناء‬

‫‪ Union .‬من‪ ‬نوع‪ classinfo ‬تم التغيير في اإلصدار ‪ :3.10‬يمكن أن يكون‬

‫‪ ، classinfo  ) ‬الطبقة ‪issubclass( ‬‬

‫تعتبر الفئة فئة فرعية من نفسها‪ .‬قد ‪ classinfo . ‬إذا كانت‪ ‬الفئة فئة‪ ‬فرعية (مباشرة أو غير مباشرة أو‪ ‬افتراضية‪ ) ‬من‪ True‬العودة‬
‫إذا كانت‪ ‬الفئة ‪True ‬وفي هذه الحالة يتم إرجاع‪ ‬الفئة ‪ Union ،‬عبارة عن مجموعة من كائنات الفئة أو‪ ‬نوع‪ classinfo ‬يكون‬
‫‪.‬يتم رفع استثناء‪ ، TypeError ‬في أي حالة أخرى‪ classinfo . ‬فئة‪ ‬فرعية ألي إدخال في‬

‫‪ Union .‬من‪ ‬نوع‪ classinfo ‬تم التغيير في اإلصدار ‪ :3.10‬يمكن أن يكون‬

‫‪ ) ‬كائن‪ ، [  ‬حارس‪iter( ]  ‬‬


‫ً‬
‫اعتمادا على وجود الوسيطة الثانية‪ .‬دون الحجة الثانية‪ ،‬الكائن‪ ‬يجب‬ ‫إرجاع‪ ‬كائن‪ ‬مكرر‪ . ‬يتم تفسير الحجة األولى بشكل مختلف تمامًا‬
‫( أو يجب أن يعتمد بروتوكول التسلسل ‪)،‬طريقة)(__‪ __iter‬في( أن يكون كائن مجموعة التي تدعم بروتوكول التكرار‬
‫يتم ‪ ، TypeError‬إذا كان ال يدعم أيًا من هذه البروتوكوالت‪). ‬طريقة بحجج صحيح ابتداء من الساعة‪ __getitem__()0 ‬على‬
‫رفعه‪ .‬إذا‪ ،‬فإن الحجة الثانية‪ ‬الحارس‪ ، ‬ويرد‪ ،‬ثم‪ ‬كائن‪ ‬يجب أن يكون الكائن استدعاء‪ .‬المكرر الذي تم إنشاؤه في هذه الحالة سوف‬
‫لطريقته ؛‪ ‬إذا كانت القيمة التي تم إرجاعها )(__‪ __next‬يستدعي‪ ‬الكائن‪ ‬بدون أي وسيطات لكل استدعاء‬
‫‪.‬سيتم رفعها ‪ ،‬وإال سيتم إرجاع القيمة‪ ،StopIteration ‬تساوي‪ ‬الحارس‬

‫‪Pg. 154‬‬
‫‪ .‬راجع أيضًا‪ ‬أنواع التكرار‬

‫هو بناء قارئ كتلة‪  .‬على سبيل المثال ‪ ،‬قراءة الكتل ذات العرض الثابت من ملف قاعدة )(‪ iter‬أحد التطبيقات المفيدة للشكل الثاني‬
‫‪:‬بيانات ثنائية حتى الوصول إلى نهاية الملف‬

‫‪from functools import partial‬‬

‫‪with open('mydata.db', 'rb') as f:‬‬

‫‪for block in iter(partial(f.read, 64), b''):‬‬

‫)‪process_block(block‬‬

‫‪ ) ‬ق ‪len( ‬‬

‫أو )أو قائمة أو نطاق ‪ tuple‬مثل سلسلة أو بايت أو( إرجاع طول (عدد العناصر) كائن‪ .‬قد تكون الوسيطة عبارة عن تسلسل‬
‫‪.‬مجموعة (مثل قاموس أو مجموعة أو مجموعة مجمدة)‬

‫)‪ .range(2 ** 100‬مثل ‪ sys.maxsize،‬أطوال أكبر من‪ OverflowError‬يزيد من‪ CPython: len ‬تفاصيل تنفيذ‬

‫)‪ ] ‬متكرر ‪ list( [ ‬فئة‬

‫هو في الواقع قابلة للتغيير نوع تسلسل‪ ،‬كما هو موثق في‪ ‬قوائم‪ ‬و‪ ‬أنواع تسلسل ‪ -‬القائمة‪ ،‬الصفوف‪، list‬بدال من أن تكون وظيفة‬
‫‪ .‬مجموعة ‪(tuple)،‬‬

‫)(‪locals‬‬

‫عند استدعائها في كتل )(‪ locals‬تحديث وإرجاع قاموس يمثل جدول الرموز المحلي الحالي‪ .‬يتم إرجاع المتغيرات المجانية‬
‫‪.‬هي نفس القاموس)(‪ globals‬و‪، locals() ‬الوظائف ‪ ،‬ولكن ليس في كتل الفئات‪ .‬الحظ أنه على مستوى الوحدة‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬ال ينبغي تعديل محتويات هذا القاموس ؛‪  ‬قد ال تؤثر التغييرات على قيم المتغيرات المحلية والمجانية التي يستخدمها المترجم‬

‫‪ ، ...  ) ‬وظيفة‪ ، ‬تكرارية ‪map( ‬‬

‫أعد مكررً ا يطبق‪ ‬وظيفة‪ ‬على كل عنصر قابل‪ ‬للتكرار‪ ، ‬مما يؤدي إلى النتائج‪ .‬إذا‪ ‬تم تمرير وسيطات‪ ‬إضافية‪ ‬قابلة‪ ‬للتكرار‪ ، ‬فيجب‬
‫أن تأخذ‪ ‬الوظيفة‪  ‬العديد من الوسائط ويتم تطبيقها على العناصر من جميع العناصر التكرارية بالتوازي‪ .‬مع العديد من العناصر‬
‫التكرارية ‪ ،‬يتوقف المكرر عند استنفاد أقصر العناصر التكرارية‪  .‬للحاالت التي يتم فيها ترتيب مدخالت الوظيفة بالفعل في‬
‫‪ itertools.starmap().‬مجموعات الوسيطة ‪ ،‬راجع‬

‫‪ ) ‬متكرر‪ ، [  * ، ‬مفتاح‪ ، ‬افتراضي‪max( ]  ‬‬

‫)‪max( arg1 ، arg2 ، * args  [ ، key  ] ‬‬

‫‪.‬قم بإرجاع أكبر عنصر في متكرر أو أكبر وسيطتين أو أكثر‬

‫إذا تم توفير حجة‪ ‬موضعية‪ ‬واحدة ‪ ،‬فيجب أن تكون قابلة‪ ‬للتكرار‪ . ‬يتم إرجاع العنصر األكبر في التكرارات‪ .‬إذا تم توفير وسيطين‬
‫‪.‬موضعيين أو أكثر ‪ ،‬فسيتم إرجاع أكبر الوسائط الموضعية‬

‫هناك نوعان من الوسائط االختيارية للكلمات الرئيسية فقط‪ .‬و‪ ‬رئيسية‪ ‬تحدد حجة ترتيب الوظائف وسيطة واحدة مثل تلك المستخدمة‬
‫ً‬
‫فارغا ولم‪ ‬يتم ‪ iterable‬و‪ ‬االفتراضية‪ ‬يحدد حجة كائن للعودة إذا قدمت‪ list.sort(). ‬ل‬ ‫فارغ‪ .‬إذا كان العنصر المكرر‬
‫‪ a.‬رفع‪ ValueError‬توفير‪ ‬اإلعداد‪ ‬االفتراضي‪ ، ‬فسيتم‬

‫إذا كانت العناصر المتعددة هي الحد األقصى ‪ ،‬ترجع الدالة العنصر األول الذي تمت مواجهته‪ .‬يتوافق هذا مع أدوات الحفاظ على‬
‫)‪ .sorted(iterable, key=keyfunc, reverse=True‬استقرار الفرز األخرى مثل‪ ‬و‬
‫)‪[0]heapq.nlargest(1, iterable, key=keyfunc‬‬

‫‪Pg. 155‬‬
‫‪.‬الجديد في اإلصدار ‪ :3.4‬و‪ ‬االفتراضي‪ ‬حجة الكلمة الوحيدة‬

‫‪ None.‬تغير في اإلصدار ‪ :3.8‬إن‪ ‬مفتاح‪ ‬يمكن أن يكون‬

‫)‪ ‬كائن ‪ memoryview( ‬فئة‬

‫‪.‬قم بإرجاع كائن "عرض الذاكرة" الذي تم إنشاؤه من وسيطة معينة‪ .‬انظر‪ ‬طرق عرض الذاكرة‪ ‬لمزيد من المعلومات‬

‫‪ ) ‬متكرر‪ ، [  * ، ‬مفتاح‪ ، ‬افتراضي‪min( ]  ‬‬

‫)‪min( arg1 ، arg2 ، * args  [ ، key  ] ‬‬

‫‪.‬قم بإرجاع أصغر عنصر في متكرر أو أصغر وسيطتين أو أكثر‬

‫إذا تم توفير حجة‪ ‬موضعية‪ ‬واحدة ‪ ،‬فيجب أن تكون قابلة‪ ‬للتكرار‪ . ‬يتم إرجاع العنصر األصغر في القابل للتكرار‪ .‬إذا تم توفير‬
‫‪.‬وسيطين موضعيين أو أكثر ‪ ،‬فسيتم إرجاع أصغر وسيطات موضعية‬

‫هناك نوعان من الوسائط االختيارية للكلمات الرئيسية فقط‪ .‬و‪ ‬رئيسية‪ ‬تحدد حجة ترتيب الوظائف وسيطة واحدة مثل تلك المستخدمة‬
‫ً‬
‫فارغا ولم‪ ‬يتم ‪ iterable‬و‪ ‬االفتراضية‪ ‬يحدد حجة كائن للعودة إذا قدمت‪ list.sort(). ‬ل‬ ‫فارغ‪ .‬إذا كان العنصر المكرر‬
‫‪ a.‬رفع‪ ValueError‬توفير‪ ‬اإلعداد‪ ‬االفتراضي‪ ، ‬فسيتم‬

‫إذا كانت العناصر المتعددة ضئيلة ‪ ،‬فإن الوظيفة ترجع العنصر األول الذي تمت مواجهته‪ .‬يتوافق هذا مع أدوات الحفاظ على‬
‫)‪ .sorted(iterable, key=keyfunc)[0]heapq.nsmallest(1, iterable, key=keyfunc‬استقرار الفرز األخرى مثل‪ ‬و‬

‫‪.‬الجديد في اإلصدار ‪ :3.4‬و‪ ‬االفتراضي‪ ‬حجة الكلمة الوحيدة‬

‫‪ None.‬تغير في اإلصدار ‪ :3.8‬إن‪ ‬مفتاح‪ ‬يمكن أن يكون‬

‫‪ ) ‬مكرر‪ ، [  ‬افتراضي‪next( ]  ‬‬

‫طريقته‪ .‬إذا تم تقديم‪ ‬االفتراضي‪ ، ‬يتم إرجاعه إذا تم استنفاد )(__‪ __next‬استرجع العنصر التالي من‪ ‬المكرر‪ ‬عن طريق استدعاء‬
‫‪.‬يتم رفعه‪ StopIteration‬المكرر ‪ ،‬وإال‬

‫‪ object‬فئة‬

‫هي قاعدة لجميع الطبقات‪ .‬لديها طرق مشتركة لجميع مثيالت أصناف بايثون‪ .‬هذه الوظيفة ال ‪. object‬إعادة كائن جديد غير مميز‬
‫‪.‬تقبل أي حجج‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬الطبقة‪ object‬لذلك ال يمكنك سمات التعسفية تعيين إلى مثيل من ‪ __dict__،‬لم‪ ‬يكن‪ ‬لديها ‪object‬‬

‫‪ ) ‬خ ‪oct( ‬‬

‫‪ Python ،‬كائ ًنا في‪ xint ‬والنتيجة هي تعبير صالح في بايثون‪ .‬إذا‪ ‬لم يكن‪o". ‬تحويل عدد صحيح إلى سلسلة ثماني مسبوقة بـ "‪0‬‬
‫‪:‬طريقة ُترجع ً‬
‫عددا صحيحً ا‪ .‬على سبيل المثال)(__‪ __index‬فيجب عليه تحديد‬

‫>>>‬

‫)‪>>> oct(8‬‬

‫'‪'0o10‬‬

‫)‪>>> oct(-56‬‬

‫'‪'-0o70‬‬

‫‪.‬أو ال ‪ ،‬يمكنك استخدام أي من الطرق التالية "‪ o‬إذا كنت تريد تحويل رقم صحيح إلى سلسلة ثماني إما بالبادئة "‪0‬‬

‫‪Pg. 156‬‬
‫>>>‬

‫‪>>> '%#o' % 10, '%o' % 10‬‬

‫)'‪('0o12', '12‬‬

‫)'‪>>> format(10, '#o'), format(10, 'o‬‬

‫)'‪('0o12', '12‬‬

‫'}‪>>> f'{10:#o}', f'{10:o‬‬

‫)'‪('0o12', '12‬‬

‫‪.‬لمزيد من المعلومات)(‪ format‬انظر أيضا‬

‫ملف‪ ، ‬وضع‪'  =  ‬ص'‪ ، ‬التخزين المؤقت‪ ، 1 -  =  ‬ترميز‪  =  ‬ال يوجد‪ ، ‬أخطاء‪  =  ‬ال يوجد‪ ، ‬السطر‪  =  ‬ال ‪open( ‬‬
‫‪ ) ‬صحيح‪ ، ‬فتحت‪  =  ‬ال يوجد ‪ ، closefd  = ‬يوجد‬

‫رفع ملف‪ .‬راجع‪ ‬قراءة الملفات وكتابتها‪ ‬لمزيد من ‪ OSError‬افتح‪ ‬الملف‪ ‬وأعد‪ ‬كائن الملف‪ ‬المقابل‪ . ‬إذا تعذر فتح الملف ‪ ،‬فسيتم‬
‫‪.‬األمثلة حول كيفية استخدام هذه الوظيفة‬

‫الملف‪ ‬هو‪ ‬كائن يشبه المسار‪  ‬يعطي اسم المسار (مطلق أو متعلق بدليل العمل الحالي) للملف المراد فتحه أو واصف ملف عدد صحيح‬
‫إذا تم توفير واصف ملف ‪ ،‬فسيتم‪ ‬إغالقه عند إغالق كائن اإلدخال ‪ /‬اإلخراج‪ ‬المرتجع‪ ‬ما لم‪ ‬يتم (‪. ‬للملف المراد تغليفه‬
‫)‪ False.‬على‪ closeefd ‬تعيين‬

‫مما يعني أنه مفتوح للقراءة في وضع'‪ 'r‬الوضع‪  ‬عبارة عن سلسلة اختيارية تحدد الوضع الذي يتم فيه فتح الملف‪ .‬يتم تعيينه افتراضيًا‬
‫وهو‪ ‬ما‪ ‬يعني‪ ( ‬وإللحاق'‪ ، 'a‬وإلنشاء خاص'‪ ، 'x‬للكتابة (اقتطاع الملف إذا كان موجو ًدا بالفعل)'‪ 'w‬النص‪ .‬القيم الشائعة األخرى هي‬
‫في وضع النص‪ ،‬إذا‪ ‬ترميز‪ ‬لم ‪). ‬أن‪ ‬جميع‪  ‬الكتابات تلحق بنهاية الملف بغض النظر عن موضع البحث الحالي ‪ Unix‬في‪ ‬بعض‪ ‬أنظمة‬
‫ويسمى للحصول على ترميز )‪: locale.getpreferredencoding(False‬يتم تحديد الترميز المستخدمة هي التي تعتمد على منصة‬
‫‪:‬اللغة الحالي‪(  .‬للقراءة والكتابة بالبايت الخام ‪ ،‬استخدم الوضع الثنائي واترك‪ ‬الترميز‪ ‬غير محدد‪ ).‬األوضاع المتاحة هي‬

‫اختالف‬
‫المعنى‬
‫الشخصيات‬

‫'‪'r‬‬ ‫مفتوح للقراءة (افتراضي)‬

‫'‪'w‬‬ ‫فتح للكتابة ‪ ،‬واقتطاع الملف أوال‬

‫'‪'x‬‬ ‫فتح لإلنشاء الحصري ‪ ،‬والفشل إذا كان الملف موجو ًدا بالفعل‬

‫'‪'a‬‬ ‫مفتوح للكتابة ‪ ،‬وإلحاق بنهاية الملف إذا كان موجو ًدا‬

‫'‪'b‬‬ ‫الوضع الثنائي‬

‫'‪'t‬‬ ‫وضع النص (افتراضي)‬

‫'‪'+‬‬ ‫مفتوح للتحديث (قراءة وكتابة)‬

‫مفتوحة وباقتطاع '‪ 'w+b‬و'‪ 'w+‬وسائط‪ 'rt'). ‬مفتوح لقراءة النص ‪ ،‬مرادف لـ('‪ 'r‬الوضع االفتراضي هو‬


‫‪.‬فتح الملف بدون اقتطاع'‪ 'r+b‬و‪ 'r+' ‬الملف‪ .‬وسائط‬

‫بين اإلدخال ‪ /‬اإلخراج الثنائي والنص‪ .‬ترجع‪ ‬الملفات المفتوحة في الوضع الثنائي ‪ Python‬كما هو مذكور في‪ ‬النظرة العامة‪ ، ‬تميز‬
‫يتم '‪ 't‬االفتراضي ‪ ،‬أو عندما( ككائنات‪ L‬دون أي فك تشفير‪ .‬في وضع النص‪ bytes‬المحتويات )‪ ‬في‪ ‬ذلك‪ ‬وسيطة‪ ‬الوضع '‪ 'b‬بما(‬

‫‪Pg. 157‬‬
‫هيئة وحدات البايت التي تم فك تشفيرها أوالً باستخدام ترميز ‪ str‬يتم إرجاع محتويات الملف على ‪ ) ،‬تضمينه في‪ ‬وسيطة‪ ‬الوضع‬
‫‪.‬يعتمد على النظام األساسي أو باستخدام‪ ‬الترميز‪ ‬المحدد‪ ‬إذا تم تقديمه‬

‫والذي لم يعد له أي تأثير ‪ ،‬ويعتبر مهمالً‪ .‬لقد قام ساب ًقا بتمكين‪ ‬الخطوط الجديدة '‪ ، 'U‬هناك حرف وضع إضافي مسموح به‬
‫‪.‬راجع وثائق‪ ‬معلمة‪ ‬السطر الجديد‪ ‬لمزيد من التفاصيل‪ Python 3.0. ‬العالمية‪ ‬في وضع النص ‪ ،‬والذي أصبح السلوك االفتراضي في‬

‫ملحوظة‬

‫‪ ‬‬

‫نفسها ‪ ،‬وبالتالي ‪ Python‬ال تعتمد بايثون على مفهوم نظام التشغيل األساسي للملفات النصية ؛‪ ‬تتم جميع عمليات المعالجة بواسطة‬
‫‪.‬فهي مستقلة عن النظام األساسي‬

‫التخزين المؤقت‪  ‬هو عدد صحيح اختياري يستخدم لتعيين سياسة التخزين المؤقت‪ .‬قم بالتمرير ‪ 0‬إليقاف تشغيل التخزين المؤقت‬
‫(مسموح به فقط في الوضع الثنائي) ‪ 1 ،‬لتحديد التخزين المؤقت للسطر (يمكن استخدامه فقط في وضع النص) ‪ ،‬وعدد صحيح> ‪1‬‬
‫لإلشارة إلى الحجم بالبايت لمخزن مؤقت للقطعة ثابت الحجم‪ .‬في حالة عدم تقديم‪ ‬وسيطة‪ ‬تخزين مؤقت‪ ، ‬تعمل سياسة التخزين‬
‫‪:‬المؤقت االفتراضية على النحو التالي‬

‫‪‬‬ ‫يتم تخزين الملفات الثنائية مؤق ًتا في أجزاء ذات حجم ثابت ؛‪ ‬يتم اختيار حجم المخزن المؤقت باستخدام الكشف عن‬
‫مجريات األمور في محاولة لتحديد "حجم كتلة" الجهاز األساسي والعودة مرة‬
‫في العديد من األنظمة ‪ ،‬سيكون حجم المخزن المؤقت عاد ًة ‪ 4096‬أو ‪ io.DEFAULT_BUFFER_SIZE.  8192‬أخرى‬
‫‪.‬بايت‬

‫‪‬‬ ‫تخزين السطر المؤقت‪ .‬تستخدم الملفات )‪ True‬إرجاعها‪ isatty() ‬الملفات التي يتم( "تستخدم الملفات النصية "التفاعلية‬
‫‪.‬النصية األخرى السياسة الموضحة أعاله للملفات الثنائية‬

‫الترميز‪ ‬هو اسم الترميز المستخدم لفك ترميز الملف أو ترميزه‪ .‬يجب استخدام هذا فقط في وضع النص‪ .‬يعتمد الترميز االفتراضي‬
‫ولكن‪ ‬يمكن استخدام‪ ‬أي‪ ‬ترميز نصي‪ ‬تدعمه ‪) ،‬النتائج)(‪ locale.getpreferredencoding‬مهما‪ L‬كانت( على النظام األساسي‬
‫‪.‬الوحدة للحصول على قائمة الترميزات المدعومة‪ codecs‬راجع‪Python. ‬‬

‫األخطاء‪  ‬عبارة عن سلسلة اختيارية تحدد كيفية معالجة أخطاء التشفير وفك التشفير ‪ -‬وال يمكن استخدام هذا في الوضع الثنائي‪ .‬تتوفر‬
‫مجموعة متنوعة من معالجات األخطاء القياسية (المدرجة ضمن‪ ‬معالجات األخطاء‪ ، ) ‬على الرغم من أن أي اسم لمعالجة األخطاء‬
‫‪:‬صالح أيضًا‪ .‬تشمل األسماء‪ L‬القياسية )(‪ codecs.register_error‬تم تسجيله به‬

‫‪‬‬ ‫‪.‬لها نفس التأثير‪ None‬استثناء إذا كان هناك خطأ في الترميز‪ .‬القيمة االفتراضية‪ ValueError‬إلثارة'‪'strict‬‬

‫‪‬‬ ‫‪.‬يتجاهل األخطاء‪  .‬الحظ أن تجاهل أخطاء الترميز يمكن أن يؤدي إلى فقدان البيانات'‪'ignore‬‬

‫‪‬‬ ‫‪.‬يتسبب في إدخال عالمة بديلة (مثل‪ )'?' ‬حيث توجد بيانات تالفة'‪'replace‬‬

‫‪‬‬ ‫‪ U +‬إلى ‪ U + DC80‬سوف تمثل أي بايت غير صحيح كوحدات رمز مركب منخفضة تتراوح من'‪'surrogateescape‬‬
‫معالج ‪ surrogateescape‬سيتم بعد ذلك إعادة وحدات الكود البديل هذه إلى نفس وحدات البايت عند استخدام‪DCFF. ‬‬
‫‪.‬األخطاء عند كتابة البيانات‪ .‬هذا مفيد لمعالجة الملفات بترميز غير معروف‬

‫‪‬‬ ‫مدعوم فقط عند الكتابة إلى ملف‪  .‬يتم استبدال األحرف التي ال يدعمها الترميز بمرجع أحرف'‪'xmlcharrefreplace‬‬
‫‪ &#nnn;.‬المناسب ‪XML‬‬

‫‪‬‬ ‫‪.‬ذات الخط المائل العكسي ‪ Python‬يستبدل البيانات المشوهة بتسلسالت‪ L‬هروب‪'backslashreplace' ‬‬

‫‪‬‬ ‫‪.‬الهروب}‪ \N{...‬يستبدل األحرف غير المدعومة بتسلسالت )يتم دعمه أي ً‬


‫ضا عند الكتابة('‪'namereplace‬‬

‫يتحكم الخط‪ ‬الجديد في‪ ‬كيفية‪ ‬عمل وضع‪ ‬الخطوط الجديدة العامة‪( ‬ينطبق فقط على وضع النص)‪ .‬ويمكن أن‬
‫‪:‬يعمل على النحو التالي‪ '\r\n'. ‬و ‪ None، ''، '\n'، '\r'،‬يكون‬

‫‪‬‬ ‫يتم تمكين وضع الخطوط الجديدة ‪None ،‬هو‪ ‬السطر الجديد ‪ newline ‬عند قراءة المدخالت من الدفق ‪ ،‬إذا كان‬
‫قبل إعادته إلى الطالب‪ .‬إذا'‪ '\n‬ويتم تحويل هذه إلى ‪ '\r\n'،‬أو'‪ '\n'، '\r‬العامة‪ .‬خطوط في المدخالت‪ L‬يمكن أن تنتهي في‬
‫كان األمر كذلك‪ ،''  ‬يتم تمكين وضع األسطر الجديدة العامة ‪ ،‬ولكن يتم إرجاع نهايات السطر إلى المتصل دون ترجمة‪ .‬إذا‬

‫‪Pg. 158‬‬
‫كان يحتوي على أي من القيم القانونية األخرى ‪ ،‬يتم إنهاء سطور اإلدخال فقط من خالل السلسلة المحددة ‪ ،‬ويتم إرجاع‬
‫‪.‬نهاية السطر إلى المتصل بدون ترجمة‬

‫‪‬‬ ‫يتم ترجمة‪ ‬أي‪ ‬أحرف مكتوبة إلى ‪None ، '\n' ‬عند كتابة اإلخراج إلى الدفق ‪ ،‬إذا كان‪ ‬السطر الجديد‪ ‬هو‪ ‬السطر الجديد‬
‫ال تحدث ترجمة‪ .‬إذا كان‪ ‬السطر ‪ '\n'،‬إذا كان‪ ‬السطر الجديد‪ ‬هو‪'' ‬أو‪ ، os.linesep. ‬فاصل األسطر االفتراضي للنظام‬
‫‪.‬فسيتم ترجمة‪ ‬أي‪ ‬أحرف مكتوبة إلى السلسلة المحددة‪ ، '\n' ‬الجديد‪ ‬هو أي من القيم القانونية األخرى‬

‫وتم إعطاء واصف ملف بدالً من اسم ملف ‪ ،‬فسيظل‪ ‬واصف الملف األساسي مفتوحً ا عند إغالق ‪ False‬هو‪ closeefd ‬إذا كان‬
‫‪.‬؛‪ ‬خالف ذلك ‪ ،‬سيظهر خطأ )االفتراضي(‪ closeefdTrue ‬الملف‪ .‬إذا تم إعطاء اسم الملف‪ ‬يجب أن يكون‬

‫وفتحت والعرف ويمكن استخدامها من قبل تمرير لالستدعاء كما‪ ‬فتحت‪  . ‬ثم يتم الحصول على واصف الملف األساسي لكائن الملف‬
‫كما‪ ‬فتحت‪ ‬النتائج في ‪ os.open‬يمر( فتحت‪ ‬يجب أن يعود واصف الملف المفتوح‪ ( file ، flags ). ‬عن طريق استدعاء‪ ‬الفتح‪ ‬بـ‬
‫‪ None).‬وظائف مماثلة لتمرير‬
‫ً‬
‫حديثا غير‪ ‬قابل للتوريث‬ ‫‪ .‬الملف الذي تم إنشاؤه‬

‫‪:‬للدالة لفتح ملف‪ ‬متعلق بدليل‪ ‬معين‪ dir_fdos.open() ‬يستخدم المثال التالي‪ ‬المعامل‬

‫>>>‬

‫‪>>> import os‬‬

‫)‪>>> dir_fd = os.open('somedir', os.O_RDONLY‬‬

‫‪>>> def opener(path, flags):‬‬

‫‪...‬‬ ‫)‪return os.open(path, flags, dir_fd=dir_fd‬‬

‫‪...‬‬

‫‪>>> with open('spamspam.txt', 'w', opener=opener) as f:‬‬

‫‪...‬‬ ‫)‪print('This will be written to somedir/spamspam.txt', file=f‬‬

‫‪...‬‬

‫‪>>> os.close(dir_fd) # don't leak a file descriptor‬‬

‫استخدامه لفتح ملف في وضع نص)(‪ open‬الوظيفة على الوضع‪ .‬عند)(‪ open‬يعتمد نوع‪ ‬كائن الملف الذي تم‪ ‬إرجاعه بواسطة‬
‫عند ‪ io.TextIOWrapper). ‬على وجه التحديد(‪ io.TextIOBase‬فإنه يقوم بإرجاع فئة فرعية من ‪) ،‬إلخ ‪( 'w'، 'r'، 'wt'، 'rt'،‬‬
‫استخدامها لفتح ملف في الوضع الثنائي مع التخزين المؤقت ‪ ،‬فإن الفئة التي تم إرجاعها هي فئة فرعية‬
‫؛‪ ‬في أوضاع ‪ io.BufferedReader‬تختلف الفئة الدقيقة‪ :‬في وضع القراءة الثنائي ‪ ،‬تقوم بإرجاع‪ io.BufferedIOBase. ‬من‬
‫وفي وضع القراءة ‪ /‬الكتابة ‪ ،‬تقوم ‪ io.BufferedWriter،‬الكتابة الثنائية واإللحاق ‪ ،‬تقوم بإرجاع‬
‫عند تعطيل التخزين المؤقت‪ ، ‬يتم إرجاع‪ ‬التدفق األولي ‪ ،‬فئة فرعية ‪ io.BufferedRandom. ‬بإرجاع‬
‫‪ io.RawIOBase، io.FileIO.‬من‬

‫‪ shutil.‬و ‪ tempfile،‬و‪) os، os.path‬تم التصريح)(‪ open‬حيث(‪ fileinput، io ‬راجع أي ً‬


‫ضا وحدات معالجة الملفات ‪ ،‬مثل‬

‫‪ file، mode، flags.‬بالحجج‪ open ‬يثير‪ ‬حدث تدقيق‬

‫‪.‬الحجج قد تم تعديلها أو يستدل من الدعوة األصلية‪ flags‬و‪ mode‬و‬

‫‪:‬تم التغيير في اإلصدار ‪3.3‬‬

‫‪‬‬ ‫‪.‬و‪ ‬فتحت‪ ‬تمت إضافة المعلمة‬

‫‪‬‬ ‫‪.‬تمت إضافة واسطة'‪ 'x‬و‬

‫‪Pg. 159‬‬
‫‪‬‬ ‫‪ OSError.‬كان يُثار ‪ ،‬أصبح اآلن اسمًا مستعارً ا لـ‪IOError‬‬

‫‪‬‬ ‫‪.‬موجو ًدا بالفعل )'‪ ( 'x‬يظهر اآلن إذا كان الملف المفتوح في وضع اإلنشاء الخاص‪FileExistsError‬‬

‫‪:‬تم التغيير في اإلصدار ‪3.4‬‬

‫‪‬‬ ‫‪.‬الملف اآلن غير قابل للتوريث‬

‫‪.‬اسطة'‪ 'U‬انتقدت منذ اإلصدار ‪ ،3.4‬إزالة في اإلصدار ‪ :3.10‬و‬

‫‪:‬تم التغيير في اإلصدار ‪3.5‬‬

‫‪‬‬ ‫إذا تمت مقاطعة استدعاء النظام ولم يقم معالج اإلشارة بإصدار استثناء ‪ ،‬تقوم الوظيفة اآلن بإعادة محاولة استدعاء النظام‬
‫‪).‬لألساس المنطقي‪PEP 475 ‬راجع( استثناء‪ InterruptedError‬بدالً من رفع‬

‫‪‬‬ ‫‪.‬تمت إضافة معالج األخطاء'‪ 'namereplace‬و‬

‫‪:‬تم التغيير في اإلصدار ‪3.6‬‬

‫‪‬‬ ‫‪ os.PathLike.‬تمت إضافة الدعم لقبول تنفيذ الكائنات‬

‫‪‬‬ ‫‪ io.FileIO.‬بخالف‪ io.RawIOBase‬قد يؤدي فتح مخزن مؤقت لوحدة التحكم إلى إرجاع فئة فرعية ‪ Windows ،‬في‬

‫‪ ) ‬ج ‪ord( ‬‬

‫لهذا الحرف‪ .‬على سبيل ‪ Unicode‬واحد ‪ ،‬قم بإرجاع عدد صحيح يمثل نقطة رمز ‪ Unicode‬إعطاء سلسلة تمثل حرف‬
‫‪ chr().‬العوائد (عالمة اليورو)‪ .8364 ‬هذا هو معكوس )'‪ ord('€‬بإرجاع عدد صحيح‪97 ‬و)'‪، ord('a‬المثال‬

‫‪ ) ‬قاعدة‪ ، ‬إكسب‪ ، [  ‬تعديل‪pow( ]  ‬‬

‫محسوبة بشكل أكثر (‪ power exp ، modulo mod ‬قم بإرجاع‪ ‬القاعدة‪ ‬إلى ‪ mod ،‬؛‪ ‬في حالة وجود‪ exp ‬عودة‪ ‬القاعدة‪ ‬إلى قوة‬
‫‪: .pow(base, exp) % modpow(base, exp)base**exp‬شكل يومين حجة‪ ‬ما يعادل استخدام عامل الطاقة‪ ). ‬كفاءة من‬

‫يجب أن تحتوي الوسيطات على أنواع رقمية‪ .‬مع أنواع المعامالت‪ L‬المختلطة ‪ ،‬يتم تطبيق قواعد اإلكراه لمشغلي الحساب‬
‫للمعامالت‪ ، L‬يكون للنتيجة نفس نوع المعامالت‪( L‬بعد اإلكراه) ما لم تكن الوسيطة الثانية سالبة ؛‪ ‬في هذه الحالة ‪ int  ،‬الثنائي‪ .‬بالنسبة‬
‫يتم تحويل جميع الوسائط إلى عدد عشري ويتم تسليم نتيجة عائمة‪ .‬على سبيل المثال ‪ ،‬يعود‪، ‬‬
‫‪ .pow(10, 2)100pow(10, -2)0.01‬لكنه‪ ‬يعود‬
‫ً‬
‫موجودا ‪ ،‬يجب أيضً ا أن يكون‪ mod ‬إذا كان ‪ exp ،‬و‪ base ‬المعاملين‪ int‬بالنسبة إلى‬‫من نوع عدد صحيح‪ ‬ويجب أن ‪ mod ‬‬
‫ً‬
‫سالبة ‪ ،‬فيجب أن تكون‪ ‬القاعدة‪ ‬أولية نسبيًا‪ ‬للتعديل‪ . ‬في هذه الحالة‪ ،‬يتم‪ exp ‬موجودا وكانت‪ mod ‬غير صفري‪ .‬إذا كان‪ mod ‬يكون‬
‫)‪ .pow(inv_base, -exp, mod‬هو معكوس ل‪ ‬قاعدة‪ ‬مودولو‪ ‬وزارة الدفاع ‪ inv_base ‬إرجاعها‪ ،‬حيث‬

‫‪modulo 97:‬فيما يلي مثال لحساب معكوس لـ‪38 ‬‬

‫>>>‬

‫)‪>>> pow(38, -1, mod=97‬‬

‫‪23‬‬

‫‪>>> 23 * 38 % 97 == 1‬‬

‫‪True‬‬

‫يسمح‪ ‬الشكل المكون من ثالث وسيطات‪ ‬اآلن بأن تكون الوسيطة الثانية ‪ ، pow‬للمعامالت‪ intL‬تم التغيير في اإلصدار ‪ :3.8‬بالنسبة‬
‫‪.‬سالبة ‪ ،‬مما يسمح بحساب االنعكاسات‪ L‬المعيارية‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.8‬السماح بوسائط الكلمات األساسية‪ .‬في السابق ‪ ،‬تم دعم الحجج الموضعية فقط‬

‫‪Pg. 160‬‬
‫‪ ) ‬تدفق‪  =  ‬خطأ ‪ =  sys.stdout ، ‬ملف ‪ =  '\ n' ، ‬النهاية ‪ ، sep  =  '' ، ‬كائنات ‪print( * ‬‬

‫إذا كان ‪ flush ،‬و‪ file ‬و‪ end ‬و‪ sep ‬طباعة‪ ‬األجسام‪ ‬إلى تيار النص‪ ‬ملف‪ ، ‬مفصولة‪ ‬سبتمبر‪ ‬ويليه‪ ‬نهاية‪ . ‬يجب تقديم‬


‫‪.‬موجو ًدا ‪ ،‬كوسيطات كلمات‪ ‬رئيسية‬

‫ال تحتوي على كلمات‪ ‬رئيسية إلى سالسل كما‪ ‬هو‪ ‬الحال‪ ‬ويتم كتابتها في الدفق ‪ str() ،‬يتم تحويل جميع الوسيطات التي‬
‫مما يعني استخدام القيم ‪ None،‬سالسل ؛‪ ‬يمكن أن تكون أيضًا‪ end ‬و‪ sep ‬مفصولة‪ ‬بفاصلة‪ ‬متبوعة‪ ‬بنهاية‪ . ‬يجب أن يكون‪ ‬كل من‬
‫‪ .‬فسوف تكتب‪ ‬النهاية )(‪ ، print‬االفتراضية‪ .‬إذا لم‪ ‬يتم إعطاء‪ ‬أي‪ ‬كائنات‬

‫سيتم استخدامها‪ .‬نظرً ا ‪ None، sys.stdout‬األسلوب‪ .‬إذا لم تكن موجودة أو)‪ write(string‬في‪ ‬ملف‪ ‬يجب أن يكون حجة كائن مع‬
‫فال يمكن استخدامها مع كائنات الملفات ذات الوضع الثنائي‪ .‬لهذه ‪ ، print() ،‬ألنه يتم تحويل الوسائط المطبوعة إلى سالسل نصية‬
‫‪.‬بدال من ذلك)‪ file.write(...‬استخدم‬

‫‪.‬ما إذا كانت مخزنة الناتج عادة يتم تحديدها من قبل‪ ‬ملف‪ ، ‬ولكن إذا كان‪ ‬تدفق‪ ‬حجة الكلمة صحيحة‪ ،‬يتم مسح تيار قسرا‬

‫‪ flush .‬تم التغيير في اإلصدار ‪ :3.3‬تمت إضافة‪ ‬وسيطة الكلمة األساسية‬

‫‪ ) ‬ال شيء ‪ ، doc  = ‬ال شيء ‪ ، fdel  = ‬ال شيء ‪ ، fset  = ‬ال شيء ‪ property( fget  = ‬فئة‬

‫‪.‬إرجاع خاصية الخاصية‬

‫هي وظيفة لحذف قيمة سمة‪ .‬و‪ ‬ثيقة‪ ‬يخلق‪. fdel ‬هي وظيفة لتحديد قيمة السمة‪. fset ‬هي وظيفة للحصول على قيمة سمة‪fget ‬‬
‫‪.‬للسمة ‪docstring‬‬

‫‪ x:‬االستخدام المعتاد هو تحديد سمة مُدارة‬

‫‪class C:‬‬

‫‪def __init__(self):‬‬

‫‪self._x = None‬‬

‫‪def getx(self):‬‬

‫‪return self._x‬‬

‫‪def setx(self, value):‬‬

‫‪self._x = value‬‬

‫‪def delx(self):‬‬

‫‪del self._x‬‬

‫)"‪x = property(getx, setx, delx, "I'm the 'x' property.‬‬

‫‪.c.x = valuedel c.x‬وسوف يستدعي أداة الضبط ‪ ،‬والحذف‪ getter ، ‬فسوف يستدعي‪ C ، c.x‬هو مثيل لـ‪ c ‬إذا كان‬

‫لسمة الخاصية‪ .‬وبخالف ذلك ‪ ،‬فإن الخاصية سوف تنسخ‪ ‬سلسلة مستندات ‪ docstring‬هو سلسلة‪ doc ‬إذا تم تقديمه ‪ ،‬فسيكون‬
‫‪ :‬باعتباره‪ ‬الديكور)(‪ property‬هذا يجعل من الممكن إلنشاء خصائص للقراءة فقط باستخدام بسهولة‪). ‬إن وجدت(‪fget ‬‬

‫‪class Parrot:‬‬

‫‪Pg. 161‬‬
‫‪def __init__(self):‬‬

‫‪self._voltage = 100000‬‬

‫‪@property‬‬

‫‪def voltage(self):‬‬

‫"""‪"""Get the current voltage.‬‬

‫‪return self._voltage‬‬

‫عن‪ ‬الجهد‪ docstring ‬األسلوب الى "جالبة" لسمة للقراءة فقط بنفس االسم‪ ،‬ويقوم بتعيين)(‪ voltage‬الديكور يتحول‪ @property‬و‬
‫"‪ .‬ل"احصل على الجهد الحالي‬

‫أساليب يمكن استخدامها في الديكور أن إنشاء‪ L‬نسخة من الممتلكات مع ما يوازيها من ‪ deleter‬و‪ getter، setter‬كائن الملكية لديها‬
‫‪:‬مجموعة وظيفة استرجاع إلى وظيفة تزيين‪ .‬من األفضل شرح ذلك بمثال‬

‫‪class C:‬‬

‫‪def __init__(self):‬‬

‫‪self._x = None‬‬

‫‪@property‬‬

‫‪def x(self):‬‬

‫"""‪"""I'm the 'x' property.‬‬

‫‪return self._x‬‬

‫‪@x.setter‬‬

‫‪def x(self, value):‬‬

‫‪self._x = value‬‬

‫‪@x.deleter‬‬

‫‪def x(self):‬‬

‫‪del self._x‬‬

‫‪).‬في هذه الحالة‪ ( x‬هذا الرمز يعادل بالضبط المثال األول‪ .‬تأكد من إعطاء الوظائف اإلضافية نفس اسم الخاصية األصلية‬

‫‪.‬المقابلة لحجج المنشئ‪ fdel‬و‪ fget، fset‬لديه كائن خاصية عاد أيضا سمات‪L‬‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.5‬أصبحت سالسل مستندات كائنات الخاصية قابلة للكتابة اآلن‬

‫)‪ ‬توقف ‪ range( ‬فئة‬

‫)‪ ‬ابدأ‪ ، ‬توقف‪ ، [  ‬خطوة‪ range( ]  ‬فئة‬

‫‪Pg. 162‬‬
‫هو في الواقع غير قابل للتغيير نوع تسلسل‪ ،‬كما هو موثق في‪ ‬نطاقات‪ ‬و‪ ‬أنواع تسلسل ‪ -‬القائمة‪، range ،‬بدال من أن تكون وظيفة‬
‫‪ .‬مجموعة ‪ (tuple)،‬الصفوف‬

‫‪ ) ‬كائن ‪repr( ‬‬

‫إرجاع سلسلة تحتوي على تمثيل قابل للطباعة لكائن‪  .‬بالنسبة للعديد من األنواع ‪ ،‬تحاول هذه الوظيفة إرجاع سلسلة من شأنها أن‬
‫؛‪  ‬بخالف ذلك ‪ ،‬يكون التمثيل عبارة عن سلسلة محاطة بأقواس زاوية تحتوي )(‪ eval‬تؤدي إلى كائن بنفس القيمة عند تمريرها إلى‬
‫على اسم نوع الكائن مع معلومات إضافية غالبًا تتضمن اسم الكائن وعنوانه‪ .‬يمكن للفئة التحكم في ما ترجع إليه هذه الوظيفة‬
‫‪.‬طريقة)(__‪ __repr‬لمثيالتها من خالل تحديد‬

‫‪ ) ‬فيما‪ ‬يليها (‪reversed‬‬

‫)(__‪ ( __len‬طريقة أو يدعم بروتوكول التسلسل)(__‪ __reversed‬كائ ًنا له‪ seq ‬إرجاع‪ ‬مكرر‪ ‬عكسي‪ . ‬يجب أن يكون‬


‫‪).‬والطريقة مع وسيطات عدد صحيح تبدأ من‪ __getitem__()0 ‬الطريقة‬

‫‪ [ ، ndigits  ] ) ‬العدد ‪round( ‬‬

‫فسيتم‪ ‬إرجاع أقرب عدد ‪ None، ‬أو تم حذفه‪ ndigits ‬بعد الفاصلة العشرية‪ .‬إذا‪ ‬تم حذف‪ ndigits ‬رقم‪ ‬اإلرجاع‪ ‬مقربًا إلى‪ ‬الدقة‬


‫‪ .‬صحيح‪ ‬لمدخله‬

‫؛‪ ‬إذا قدم المساواة ‪ ndigits ‬يتم تقريب القيم إلى أقرب مضاعف لـ ‪ 10‬إلى القوة ناقص ‪ round()،‬بالنسبة لألنواع المضمنة الداعمة‬
‫‪ round(-‬و)‪ round(0.5‬حتى‪ ،‬على سبيل المثال‪ ،‬على حد سواء( قريب‪ ،‬تدوير األرقام يتم اثنين من مضاعفات نحو االختيار حتى‬
‫القيمة المرجعة هي ‪). ‬موجب ‪ ،‬صفر ‪ ،‬أو سالب(‪ ndigits ‬أي قيمة عدد صحيح صالحة لعدد‪). ‬هو‪ round(1.5)2 ‬هي‪ ،0 ‬و)‪0.5‬‬
‫‪ .‬خالف ذلك ‪ ،‬فإن القيمة المرجعة لها نفس نوع‪ ‬الرقم ‪ None. ‬أو‪ ndigits ‬عدد صحيح إذا‪ ‬تم حذف‬

‫‪ number.__round__.‬يفوض إلى‪ number، round‬العام ‪ Python‬بالنسبة لكائن‬

‫ملحوظة‬

‫‪ ‬‬

‫مفاج ًئا‪ :‬على سبيل المثال ‪ ،‬يعطي‪ ‬بدالً من المتوقع‪ . ‬هذا ليس خطأ‪ :‬إنه نتيجة لحقيقة أن ‪ for floats‬يمكن أن يكون‪ ‬سلوك)(‪round‬‬
‫معظم الكسور العشرية ال يمكن تمثيلها على أنها عدد عشري‪ .‬راجع‪ ‬حساب‪ L‬النقطة العائمة‪ :‬المشكالت والقيود‪ ‬لمزيد من‬
‫‪.round(2.675, 2)2.672.68‬المعلومات‬

‫)‪ ] ‬متكرر ‪ set( [ ‬فئة‬

‫و‪ ‬تعيين ‪ set‬هي فئة مدمجة‪ .‬انظر‪ . set‬كائن‪ ‬جديد‪ ، ‬اختياريًا باستخدام العناصر المأخوذة من العناصر‪ ‬القابلة للتكرار ‪ set‬قم بإرجاع‬
‫‪.‬للتوثيق حول هذه الفئة‪، frozenset ‬أنواع ‪ -‬مجموعة‬

‫الوحدة ‪ collections ‬والفئات ‪ ،‬باإلضافة إلى‪ tuple، dict‬و‪ frozenset، list‬بالنسبة للحاويات األخرى ‪ ،‬راجع‪ ‬الفئات‪ ‬المضمنة‬


‫‪.‬النمطية‬

‫‪ ) ‬كائن‪ ، ‬اسم‪ ، ‬قيمة ‪setattr( ‬‬

‫الوسيطات هي كائن وسلسلة وقيمة عشوائية‪ .‬قد تقوم السلسلة بتسمية سمة موجودة أو سمة جديدة‪ .‬تقوم‪ getattr(). ‬هذا هو المقابل لـ‬
‫‪ .setattr(x, 'foobar', 123)x.foobar = 123‬الوظيفة بتعيين قيمة للسمة ‪ ،‬بشرط أن يسمح بها الكائن‪ .‬على سبيل المثال ‪ ،‬يعادل‬

‫ملحوظة‬

‫‪ ‬‬

‫نظرً ا ألن‪ ‬تغيير االسم الخاص‪ ‬يحدث في وقت‪ ‬التحويل‪ ‬البرمجي ‪ ،‬يجب على المرء أن يفسد يدويًا اسم سمة خاصة (سمات ذات‬
‫‪ setattr().‬شرطتين سفليتين رئيسيتين) من أجل تعيينها‬

‫‪ ) ‬توقف ‪ slice( ‬فئة‬

‫)‪ ‬ابدأ‪ ، ‬توقف‪ ، [  ‬خطوة‪ slice( ]  ‬فئة‬

‫‪Pg. 163‬‬
‫قم‪ ‬بإرجاع‪ ‬كائن‪ ‬شريحة‪ ‬يمثل مجموعة الفهارس المحددة بواسطة‪ . ‬في‪ ‬بداية‪ ‬و‪ ‬خطوة‪ ‬الوسائط االفتراضية ل‪ . ‬قرأت فقط األشياء‬
‫شريحة سمات البيانات‪ ، ‬و‪ ‬التي مجرد إرجاع القيم الحجة (أو االفتراضية)‪ .‬ليس لديهم وظائف أخرى صريحة ؛‪ ‬ومع ذلك ‪ ،‬يتم‬
‫وحزم الجهات الخارجية األخرى‪ .‬يتم أيضً ا إنشاء كائنات الشرائح عند استخدام صيغة الفهرسة ‪ NumPy‬استخدامها بواسطة‬
‫الممتدة‪ .‬على سبيل المثال‪ :‬أو‪ . ‬انظر‪ ‬للحصول على نسخة بديلة تقوم بإرجاع‬
‫)(‪.range(start, stop, step)Nonestartstopstepa[start:stop:step]a[start:stop, i]itertools.islice‬مكرر‬

‫‪ ) ‬مفتاح‪  =  ‬ال يوجد‪ ، ‬عكس‪  =  ‬خطأ ‪sorted( iterable ، * ، ‬‬

‫‪ .‬قم بإرجاع قائمة مصنفة جديدة من العناصر الموجودة في‪ ‬التكرار‬

‫‪.‬يحتوي على وسيطتين اختياريتين يجب تحديدهما كوسائط للكلمات الرئيسية‬

‫على سبيل (‪ ‬مفتاح‪  ‬يحدد وظيفة من وسيطة واحدة يتم استخدامها الستخراج مفتاح مقارنة من كل عنصر في قابل‪ ‬للتكرار‬
‫‪).‬قارن العناصر مباشرة(‪ None‬القيمة االفتراضية هي‪ ، key=str.lower). ‬المثال‬

‫‪.‬فسيتم فرز عناصر القائمة كما لو تم عكس كل مقارنة ‪ True،‬العكس‪ ‬هو قيمة منطقية‪ .‬إذا تم التعيين على‬

‫‪ .‬ذات النمط القديم‪ ‬إلى‪ ‬وظيفة‪ ‬رئيسية ‪ cmp ‬لتحويل‪ ‬دالة)(‪ُ  functools.cmp_to_key‬تستخدم‬

‫الوظيفة‪ ‬المدمجة‪ ‬مضمونة لتكون مستقرة‪ .‬يكون الفرز مستقرً ا إذا كان يضمن عدم تغيير الترتيب النسبي للعناصر التي )(‪sorted‬‬
‫‪.‬تقارن متساوية ‪ -‬وهذا مفيد للفرز في عدة ممرات (على سبيل المثال ‪ ،‬الفرز حسب القسم ‪ ،‬ثم حسب درجة الراتب)‬

‫‪ PEP‬طريقة سيكون كافيا ً للفرز ‪ ،‬توصي)(__‪ __lt‬تستخدم خوارزمية الفرز‪< ‬مقارنات بين العناصر‪ ‬فقط‪ . ‬في حين أن تحديد‬
‫بتنفيذجميع‪ ‬المقارنات الثرية‪ ‬الست‪  .‬سيساعد هذا في تجنب األخطاء عند استخدام نفس البيانات مع أدوات الطلب األخرى مثل ‪8 ‬‬
‫التي تعتمد على طريقة أساسية مختلفة‪ .‬يساعد تنفيذ جميع المقارنات الستة أي ً‬
‫ضا على تجنب االرتباك للمقارنات المختلطة )(‪max‬تلك‬
‫‪.‬الطريقةالمنعكسة‪__gt__()L‬التي يمكن أن تستدعي‬

‫‪ .‬للحصول على أمثلة حول الفرز ودورة تعليمية موجزة عن الفرز ‪ ،‬راجع‪ ‬فرز كيفية‬

‫‪@staticmethod‬‬

‫‪.‬تحويل طريقة إلى طريقة ثابتة‬

‫‪:‬ال يتلقى األسلوب الثابت وسيطة أولى ضمنية‪ .‬لإلعالن عن طريقة ثابتة ‪ ،‬استخدم هذا المصطلح‬

‫‪class C:‬‬

‫‪@staticmethod‬‬

‫‪def f(arg1, arg2, ...): ...‬‬

‫‪.‬شكل هو وظيفة‪ ‬الديكور‪ - ‬راجع‪ ‬التعاريف وظيفة‪ ‬للحصول على التفاصيل‪ @staticmethod‬و‬

‫( عالوة على ذلك ‪ ،‬يمكن تسميتها بالوظائف العادية‪ C().f()). ‬مثل( أو في مثيل ))(‪ C.f‬مثل( يمكن استدعاء طريقة ثابتة إما في الفئة‬
‫‪ f()).‬مثل‬

‫إلى المتغير الذي يفيد في إنشاء )(‪ classmethod‬انظر أيضًا‪ C ++. ‬أو ‪ Java‬مشابهة‪ L‬لتلك الموجودة في ‪ Python‬الطرق الثابتة في‬
‫‪.‬مُنشئ فئة بديل‬

‫وظيفة عادية والقيام بشيء ما بنتائجها‪ .‬هذا مطلوب في بعض ‪ staticmethod‬مثل جميع المصممين ‪ ،‬من الممكن أيضً ا استدعاء‬
‫الحاالت التي تحتاج فيها إلى مرجع إلى وظيفة من جسم فئة وتريد تجنب التحويل التلقائي إلى أسلوب المثيل‪ .‬لهذه الحاالت ‪ ،‬استخدم‬
‫‪:‬هذا المصطلح‬

‫‪def regular_function():‬‬

‫‪...‬‬

‫‪Pg. 164‬‬
‫‪class C:‬‬

‫)‪method = staticmethod(regular_function‬‬

‫‪ .‬لمزيد من المعلومات حول األساليب الثابتة ‪ ،‬راجع‪ ‬التدرج الهرمي للنوع القياسي‬

‫تم التغيير في اإلصدار ‪ :3.10‬ترث األساليب الثابتة اآلن سمات‪ L‬الطريقة‬


‫سمة‪ ‬جديدة‪ __wrapped__، ‬ولها ‪ __annotations__) ،‬و__‪( __module__، __name__، __qualname__، __doc‬‬
‫‪.‬ويمكن اآلن استدعاءها كوظائف عادية‬

‫)‪ =  " ‬كائن ‪ str( ‬فئة‬

‫)‪' ‬األخطاء‪'  =  ‬صارمة ‪ =  'utf-8' ، ‬الكائن‪  =  ‬ب ''‪ ، ‬الترميز ‪ str( ‬فئة‬

‫‪.‬للحصول على التفاصيل)(‪ str‬نسخة من‪ ‬الكائن‪ . ‬انظر‪ str‬إرجاع‬

‫‪ - str .‬هي‪ ‬فئة‪ ‬السلسلة المضمنة‪ . ‬للحصول على معلومات عامة حول السالسل ‪ ،‬راجع‪ ‬نوع تسلسل النص‪str‬‬

‫‪  ) ‬متكرر‪ ، / ، ‬بدء = ‪sum( 0‬‬

‫البنود الصورة عادة ما تكون األرقام‪ iterable  ،‬تبدأ‪ ‬المجاميع‪ ‬وعناصر قابلة‪ ‬للتكرار‪ ‬من اليسار إلى اليمين و ُترجع اإلجمالي‪ .‬و‬
‫‪.‬وغير مسموح قيمة البداية وحتى تكون سلسلة‬

‫الطريقة المفضلة والسريعة لتسلسل سلسلة من السالسل هي عن ‪ sum(). ‬بالنسبة لبعض حاالت االستخدام ‪ ،‬توجد بدائل جيدة لـ‬
‫لتسلسل سلسلة من العناصر ‪ math.fsum(). ‬إلضافة قيم النقطة العائمة بدقة ممتدة ‪ ،‬راجع‪ ''.join(sequence). ‬طريق االتصال‬
‫‪ itertools.chain().‬التكرارية ‪ ،‬ضع في اعتبارك استخدام‬

‫‪.‬تغير في اإلصدار ‪ :3.8‬إن‪ ‬بداية‪ ‬المعلمة يمكن تحديد كحجة رئيسية‬

‫‪ ] ) ‬نوع‪ ، [  ‬كائن أو نوع‪ super( [ ]  ‬فئة‬

‫قم بإرجاع كائن وكيل يقوم بتفويض استدعاءات األسلوب إلى فئة من‪ ‬النوع‪ ‬األصل أو األشقاء‪ . ‬هذا مفيد للوصول إلى األساليب‬
‫‪.‬الموروثة التي تم تجاوزها في فئة‬

‫‪ .‬و‪ ‬جوه أو من نوع‪ ‬يحدد‪ ‬ترتيب تحليل طريقة‪ ‬لتفتيشها‪ .‬يبدأ البحث من الفصل مباشرة بعد‪ ‬النوع‬

‫‪ .D -> B -> C -> A -‬من‪ ‬وجوه أو من نوع‪ ‬غير‪ ‬وقيمة‪ ‬نوع‪ ‬هو‪ ، ‬ثم‪ ‬البحث__‪ __mro‬على سبيل المثال‪ ،‬إذا‬


‫‪> objectBsuper()C -> A -> object‬‬

‫السمة ‪ super(). ‬و)(‪ getattr‬السمة من‪ ‬كائن أو نوع‪  ‬القوائم األسلوب دقة ترتيب البحث التي يستخدمها كل من__‪ __mro‬و‬
‫‪.‬ديناميكية ويمكن أن تتغير كلما تم تحديث التسلسل الهرمي للوراثة‬

‫إذا تم حذف الوسيطة الثانية ‪ ،‬فسيكون الكائن الفائق الذي تم إرجاعه غير منضم‪ .‬إذا كانت الوسيطة الثانية كائ ًنا ‪ ،‬فيجب أن تكون‬
‫صحيحة‪ .‬إذا كانت الوسيطة الثانية من النوع ‪ ،‬فيجب أن تكون صحيحة (هذا مفيد للطرق‬
‫)‪.isinstance(obj, type)issubclass(type2, type‬الصفية)‬

‫هناك حالتان نموذجيتان لالستخدام‪ ‬الفائق‪ . ‬في التسلسل الهرمي للفئة ذات الميراث الفردي ‪ ،‬يمكن استخدام‪ ‬الفائق‪ ‬لإلشارة إلى الفئات‬
‫في لغات ‪ super ‬األصلية دون تسميتها صراحة ‪ ،‬مما يجعل الكود أكثر قابلية للصيانة‪ .‬هذا االستخدام يوازي بشكل وثيق استخدام‬
‫‪.‬البرمجة األخرى‬

‫حالة االستخدام الثانية هي دعم الميراث المتعدد التعاوني في بيئة تنفيذ ديناميكية‪ .‬حالة االستخدام هذه خاصة ببايثون وال توجد في‬
‫اللغات المجمعة بشكل ثابت أو اللغات التي تدعم الوراثة الفردية فقط‪ .‬هذا يجعل من الممكن تنفيذ "المخططات‪ L‬الماسية" حيث تقوم‬
‫فئات أساسية متعددة بتطبيق نفس الطريقة‪  .‬يفترض التصميم الجيد أن مثل هذه التطبيقات لها نفس توقيع االتصال في كل حالة (ألن‬
‫ترتيب المكالمات يتم تحديده في وقت التشغيل ‪ ،‬ألن هذا الترتيب يتكيف مع التغييرات في التسلسل الهرمي للفئة ‪ ،‬وألن هذا الترتيب‬
‫‪.‬يمكن أن يتضمن فئات أشقاء غير معروفة قبل وقت التشغيل )‬

‫‪:‬لكلتا حالتي االستخدام ‪ ،‬تبدو مكالمة‪ L‬الطبقة الفائقة النموذجية كما يلي‬

‫‪Pg. 165‬‬
‫‪class C(B):‬‬

‫‪def method(self, arg):‬‬

‫‪super().method(arg) # This does the same thing as:‬‬

‫)‪# super(C, self).method(arg‬‬

‫تعمل أيضً ا مع عمليات البحث عن السمات‪ .‬إحدى حاالت االستخدام المحتملة )(‪ ، super‬باإلضافة إلى عمليات البحث عن الطريقة‬
‫‪.‬لذلك هي استدعاء‪ ‬الواصفات‪ ‬في فئة الوالدين أو األشقاء‬

‫يتم تنفيذه كجزء من عملية الربط لعمليات البحث الصريحة للسمات‪ L‬المنقطة )(‪ super‬الحظ أن ذلك‬
‫للبحث عن الفئات )(__‪ __getattribute‬تقوم بذلك من خالل تنفيذ طريقتها الخاصة‪ super().__getitem__(name). ‬مثل‬
‫يتم تعريف عمليات البحث الضمنية باستخدام عبارات أو)(‪ ، super‬بترتيب يمكن التنبؤ به يدعم الميراث المتعدد التعاوني‪ .‬وف ًقا لذلك‬
‫‪ super()[name].‬عوامل تشغيل مثل‬

‫ضا أنه ‪ ،‬بصرف النظر عن نموذج الوسيطة الصفرية‬ ‫ال يقتصر على استخدام الطرق الداخلية‪ .‬يحدد نموذج )(‪ ، super‬الحظ أي ً‬
‫الوسيطتين الوسيطتين تمامًا ويقدم المراجع المناسبة‪  .‬ال يعمل نموذج الوسيطة الصفرية إال داخل تعريف الصنف ‪ ،‬حيث يمأل المترجم‬
‫‪.‬التفاصيل الضرورية السترداد الفئة التي تم تحديدها بشكل صحيح ‪ ،‬وكذلك الوصول إلى المثيل الحالي للطرق العادية‬

‫‪ super () .‬راجع‪ ‬دليل استخدام ‪ super()،‬للحصول على اقتراحات عملية حول كيفية تصميم الفصول التعاونية باستخدام‬

‫)‪ ] ‬متكرر ‪ tuple( [ ‬فئة‬

‫هو في الواقع غير قابل للتغيير نوع تسلسل‪ ،‬كما هو موثق في‪ ‬التيوبل‪ ‬و‪ ‬أنواع تسلسل ‪ -‬القائمة‪، tuple ،‬بدال من أن تكون وظيفة‬
‫‪ .‬مجموعة ‪ (tuple)،‬الصفوف‬

‫‪ ) ‬كائن ‪ type( ‬فئة‬

‫)‪ ‬االسم‪ ، ‬األسس‪ ، ‬ديكت‪  ** ، ‬كودس ‪ type( ‬فئة‬

‫باستخدام وسيطة واحدة ‪ ،‬قم بإرجاع نوع‪ ‬الكائن‪ . ‬القيمة المعادة هي كائن نوع وعمومًا نفس الكائن الذي تم إرجاعه‬
‫‪ object.__class__.‬بواسطة‬

‫‪.‬المدمج في وظيفة ينصح الختبار نوع كائن‪ ،‬ألنه يأخذ بعين االعتبار الفئات الفرعية)(‪ isinstance‬و‬

‫للبيان‪ .‬و‪ ‬اسم‪ ‬السلسلة اسم الفئة ‪ class‬باستخدام ثالث وسيطات ‪ ،‬قم بإرجاع كائن نوع جديد‪ .‬هذا هو في األساس شكل ديناميكي‬
‫السمة‪ .‬إذا كانت __‪ __bases‬يحتوي على الفئات األساسية ويصبح )‪ (tuple‬السمة‪ .‬و‪ ‬قواعد‪ ‬الصفوف__‪ __name‬وتصبح‬
‫تتم إضافة القاعدة النهائية لجميع الفئات‪ .‬و‪ ‬ديكت‪  ‬القاموس يحتوي على سمة وطريقة تعاريف للجسم الطبقة‪ .‬قد يتم ‪ object،‬فارغة‬
‫‪ :‬كائنات‪ ‬متطابقة‪ type‬السمة‪ .‬العبارتان التاليتان تنشئان__‪ __dict‬نسخها أو لفها قبل أن تصبح‬

‫>>>‬

‫‪>>> class X:‬‬

‫‪...‬‬ ‫‪a=1‬‬

‫‪...‬‬

‫))‪>>> X = type('X', (), dict(a=1‬‬

‫‪ .‬راجع أيضً ا كتابة‪ ‬الكائنات‬

‫( المناسبة ‪ metaclass‬يتم تمرير وسيطات الكلمات الرئيسية المقدمة إلى نموذج الوسيطة الثالث إلى آلية‬
‫‪ metaclass ).‬إلى جانب( بنفس الطريقة التي‪ ‬تفعل‪ ‬بها الكلمات الرئيسية في تعريف الفئة ))(__‪ __init_subclass‬عاد ًة‬

‫‪ .‬راجع أيضًا‪ ‬تخصيص إنشاء الفصل‬

‫‪Pg. 166‬‬
‫نموذج الوسيطة الواحدة للحصول __‪ type.__new‬التي ال تتخطى‪ type‬تم التغيير في اإلصدار ‪ :3.6‬قد ال تستخدم‪ ‬الفئات الفرعية‬
‫‪.‬على نوع الكائن‬

‫‪ ] ) ‬كائن ‪vars( [ ‬‬

‫‪.‬سمة__‪ __dict‬السمة الخاصة بوحدة نمطية أو فئة أو مثيل أو أي كائن آخر له__‪ __dict‬قم بإرجاع‬

‫سمة‪ ‬قابلة للتحديث‪ ‬؛‪  ‬ومع ذلك ‪ ،‬قد يكون للكائنات األخرى قيود على الكتابة‪ __dict__ ‬الكائنات مثل الوحدات النمطية والمثيالت لها‬
‫‪).‬لمنع التحديثات المباشرة للقاموس‪ a types.MappingProxyType‬على سبيل المثال ‪ ،‬تستخدم الفئات( سماتها__‪ __dict‬على‬

‫مالحظة ‪ ،‬القاموس المحلي مفيد فقط للقراءات حيث يتم تجاهل تحديثات القاموس ‪ locals(). ‬يتصرف مثل)(‪ ، vars‬بدون جدال‬
‫‪.‬المحلي‬

‫__‪ __slots‬على سبيل المثال ‪ ،‬إذا كان فئته تحدد( سمة__‪ __dict‬استثناء إذا تم تحديد كائن ولكن ليس له‪ TypeError‬يظهر‬
‫‪).‬السمة‬

‫‪ ) ‬العناصر التكرارية‪ ، ‬صارمة‪  =  ‬خطأ ‪zip( * ‬‬

‫‪.‬كرر العديد من العناصر التكرارية على التوازي ‪ ،‬مما ينتج عنه مجموعات تحتوي على عنصر من كل عنصر‬

‫‪:‬مثال‬

‫>>>‬

‫‪>>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):‬‬

‫‪...‬‬ ‫)‪print(item‬‬

‫‪...‬‬

‫)'‪(1, 'sugar‬‬

‫)'‪(2, 'spice‬‬

‫)'‪(3, 'everything nice‬‬

‫‪ iterables‬من كل من ‪ -th‬و‪ ‬ط‪ ‬عنصر )‪ (tuple‬الصفوف ‪ -th‬عودة مكرر من المجموعات‪ ،‬حيث‪ ‬ط‪ ‬يحتوي)(‪: zip‬أكثر رسميا‬


‫‪.‬حجة‬

‫‪ .‬وهي تحويل الصفوف إلى أعمدة واألعمدة إلى صفوف‪ .‬هذا مشابه‪ ‬لنقل مصفوفة)(‪ zip‬هناك طريقة أخرى للتفكير‬

‫حلقة أو عن طريق ‪ for‬كسول‪ :‬لن تتم معالجة‪ L‬العناصر حتى يتم إعادة تشغيل العنصر المتكرر ‪ ،‬على سبيل المثال عن طريق)(‪zip‬‬
‫‪ list.‬االلتفاف في ملف‬

‫يمكن أن يكون لها أطوال مختلفة ؛‪ ‬أحيا ًنا عن طريق )(‪ zip‬شيء واحد يجب مراعاته هو أن العناصر التكرارية التي تم تمريرها‬
‫‪:‬ثالث طرق مختلفة للتعامل مع هذه المشكلة ‪ Python‬التصميم ‪ ،‬وأحيا ًنا بسبب خطأ في الكود الذي أعد هذه العناصر المكررة‪ .‬تقدم‬

‫‪‬‬ ‫يتوقف عند استنفاد أقصر تكرارات‪  .‬سوف يتجاهل العناصر المتبقية في العناصر التكرارية )(‪ ، zip‬بشكل افتراضي‬
‫‪:‬األطول ‪ ،‬ويقطع النتيجة بطول أقصر تكرارات‬

‫>>>‬

‫))]'‪>>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum‬‬

‫])'‪[(0, 'fee'), (1, 'fi'), (2, 'fo‬‬

‫‪‬‬ ‫غالبًا ما يستخدم في الحاالت التي يُفترض فيها أن تكون العناصر التكرارية متساوية الطول‪ .‬في مثل هذه الحاالت ‪zip() ،‬‬
‫‪ zip():‬الخيار‪ .‬ناتجها هو نفسه العادي‪ strict=True ‬يوصى باستخدام‬

‫‪Pg. 167‬‬
‫>>>‬

‫))‪>>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True‬‬

‫])‪[('a', 1), ('b', 2), ('c', 3‬‬

‫‪:‬إذا لم تكن كذلك‪ ValueError‬على عكس السلوك االفتراضي ‪ ،‬فإنه يتحقق من أن أطوال العناصر التكرارية متطابقة ‪ ،‬ويرفع قيمة‬

‫>>>‬

‫))‪>>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True‬‬

‫‪Traceback (most recent call last):‬‬

‫‪...‬‬

‫‪ValueError: zip() argument 2 is longer than argument 1‬‬

‫الحجة ‪ ،‬سيتم إسكات أي خطأ ينتج عنه متكررات ذات أطوال مختلفة ‪ ،‬وربما يظهر على أنه خطأ يصعب ‪ strict=True‬بدون‬
‫‪.‬العثور عليه في جزء آخر من البرنامج‬

‫‪‬‬ ‫يمكن حشو العناصر التكرارية األقصر بقيمة ثابتة لجعل جميع العناصر التكرارية لها نفس الطول‪ .‬يتم‬ ‫‪‬‬
‫‪ itertools.zip_longest().‬ذلك بواسطة‬

‫مع عدم وجود وسيطات ‪ ،‬فإنه يقوم ‪-tuples. ‬إرجاع مكرر من ‪ zip()1‬باستخدام وسيطة واحدة قابلة للتكرار ‪ ،‬يتم ‪ Edge:‬حاالت‬
‫‪.‬بإرجاع مكرر فارغ‬

‫‪:‬النصائح والحيل‬

‫‪‬‬ ‫يتم ضمان ترتيب التقييم من اليسار إلى اليمين من العناصر التكرارية‪ .‬هذا يجعل من الممكن المصطلح لتجميع سلسلة‬
‫باستخدام‪ . ‬هذا يكرر‪ ‬نفس‪ ‬مرات‪ ‬التكرار‪ ‬بحيث يكون لكل مجموعة مخرجات‪ n L‬البيانات في مجموعات الطول‬
‫‪ n.zip(*[iter(s)]*n, strict=True)nn‬نتيجة‪ ‬استدعاءات للمكرر‪ .‬هذا له تأثير تقسيم المدخالت إلى أجزاء ذات طول‬

‫‪‬‬ ‫‪:‬باالشتراك مع‪* ‬المشغل يمكن استخدامه لفك ضغط القائمة)(‪zip‬‬

‫>>>‬

‫]‪>>> x = [1, 2, 3‬‬

‫]‪>>> y = [4, 5, 6‬‬

‫))‪>>> list(zip(x, y‬‬

‫])‪[(1, 4), (2, 5), (3, 6‬‬

‫))‪>>> x2, y2 = zip(*zip(x, y‬‬

‫)‪>>> x == list(x2) and y == list(y2‬‬

‫‪True‬‬

‫‪.‬الوسيطة‪ strict‬تم التغيير في اإلصدار ‪ :3.10‬تمت إضافة‬

‫‪ ) ‬االسم‪ ، ‬الكرة‪ ‬األرضية‪  =  ‬ال شيء‪ ، ‬السكان المحليون‪  =  ‬ال شيء‪ ، ‬من‪ ‬القائمة‪ ، )(  =  ‬المستوى‪__import__( 0  =  ‬‬

‫ملحوظة‬

‫‪ ‬‬

‫‪ importlib.import_module().‬هذه وظيفة متقدمة ليست مطلوبة في برمجة بايثون اليومية ‪ ،‬على عكس‬

‫‪Pg. 168‬‬
‫الوحدة والتعيين ‪ builtins‬عن طريق استيراد( البيان‪ .‬يمكن استبداله‪ import‬يتم استدعاء هذه الوظيفة من خالل‬
‫العبارة ‪ ،‬ولكن ال‪ ‬يُنصح‪ ‬بشدة‪ ‬بفعل ذلك‪ ‬ألنه من األسهل عاد ًة استخدام ‪ import‬لتغيير دالالت )__‪ builtins.__import‬إلى‬
‫لتحقيق نفس األهداف وال يسبب مشاكل في التعليمات البرمجية التي تفترض أن تنفيذ )‪PEP 302 ‬انظر( خطاطيف االستيراد‬
‫‪importlib.import_module().‬هو أيضا محبط لصالح)(__‪__import‬االستيراد االفتراضي قيد االستخدام‪ .‬االستخدام المباشر‬

‫وظيفة واردات وحدة‪ ‬االسم‪ ، ‬وربما باستخدام نظرا‪ ‬غلوبالس‪ ‬و‪ ‬السكان المحليين‪ ‬لتحديد كيفية تفسير االسم في سياق‬
‫يعطي أسماء األشياء أو الوحدات الفرعية التي ينبغي المستوردة من وحدة قدمها‪ L‬اسم‪ . ‬ال يستخدم التنفيذ ‪ fromlist ‬حزمة‪ .‬و‬
‫القياسي‪ ‬حجة‪ ‬السكان المحليين‪ ‬الخاصة به‪ ‬على اإلطالق ويستخدم‪ ‬الكرات األرضية‪ ‬الخاصة به‪ ‬فقط لتحديد سياق الحزمة‬
‫‪.‬بالبيان‪ import‬الخاص‬

‫المستوى‪ ‬يحدد ما إذا كان سيتم استخدام الواردات المطلقة أو النسبية‪(0 .‬االفتراضي) يعني تنفيذ عمليات االستيراد المطلقة‬
‫فقط‪ .‬تشير‪ ‬القيم الموجبة‪ ‬للمستوى‪  ‬إلى عدد األدلة األصلية المطلوب البحث عنها بالنسبة إلى دليل استدعاء الوحدة‬
‫‪).‬للحصول على التفاصيل‪PEP 328 ‬انظر()(__‪ __import‬النمطية‬

‫عاد ًة ‪ ،‬يتم إرجاع حزمة المستوى األعلى (االسم حتى النقطة ‪ package.module،‬عندما يكون‪ ‬متغير‪ ‬االسم‪ ‬من النموذج‬
‫األولى) ‪ ،‬وليس‪ ‬الوحدة النمطية المسماة‪ ‬باالسم‪ . ‬ومع ذلك ‪ ،‬عند‪ ‬تقديم‪ ‬وسيطة من‪ ‬القائمة‪ ‬غير فارغة‪ ، ‬يتم إرجاع‪ ‬الوحدة النمطية‬
‫‪ .‬المسماة‪ ‬باالسم‬

‫‪:import spam‬على سبيل المثال ‪ ،‬ينتج عن‪ ‬العبارة‪ ‬رمز بايت يشبه الكود التالي‬

‫)‪spam = __import__('spam', globals(), locals(), [], 0‬‬

‫‪:import spam.ham‬نتج عن‪ ‬البيان‪ ‬هذه المكالمة‬

‫)‪spam = __import__('spam.ham', globals(), locals(), [], 0‬‬

‫‪.‬العبارة‪ import‬هنا ألن هذا هو الكائن المرتبط باسم من خالل ‪ُ toplevel‬ترجع الوحدة النمطية)(__‪ __import‬الحظ كيف‬

‫‪from spam.ham import eggs, sausage as saus‬من ناحية أخرى ‪ ،‬ينتج عن‪ ‬البيان‬

‫)‪_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0‬‬

‫‪eggs = _temp.eggs‬‬

‫‪saus = _temp.sausage‬‬

‫من هذا الكائن ‪ ،‬يتم استرداد األسماء المراد استيرادها وتخصيصها ‪ __import__(). ‬يتم إرجاع الوحدة من‪ ، spam.ham‬هنا‬
‫‪.‬ألسمائها الخاصة‬

‫إذا كنت ترغب ببساطة في استيراد وحدة نمطية (من المحتمل أن تكون ضمن حزمة) باالسم ‪،‬‬
‫‪ importlib.import_module().‬فاستخدم‪L‬‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.3‬لم تعد‪ ‬القيم السلبية‪ ‬للمستوى‪ ‬مدعومة (والتي تغير أي ً‬


‫ضا القيمة االفتراضية إلى ‪)0‬‬

‫‪.‬تم تجاهله اآلن‪PYTHONCASEOK ‬قيد االستخدام ‪ ،‬متغير البيئة‪ -I‬أو‪ -E‬تم التغيير في اإلصدار ‪ :3.9‬عند خيارات سطر األوامر‬

‫‪ ‬الثوابت‬

‫‪:‬يعيش عدد قليل من الثوابت في مساحة‪ L‬االسم المضمنة‪ .‬هم انهم‬

‫‪False‬‬

‫‪ SyntaxError.‬غير قانونية ورفع أ‪ False ‬للنوع‪ .‬التخصيصات‪ bool‬القيمة الخاطئة‬

‫‪True‬‬

‫‪ SyntaxError.‬غير قانونية ورفع أ‪ True ‬للنوع‪ .‬التخصيصات‪ bool‬القيمة الحقيقية‬

‫‪None‬‬

‫‪Pg. 169‬‬
‫عنصر يستخدم بشكل متكرر لتمثيل عدم وجود قيمة ‪ ،‬كما هو الحال عندما ال يتم تمرير الوسيطات االفتراضية إلى‬
‫‪.‬النوع‪ NoneType‬هو المثيل الوحيد من‪ SyntaxError. None‬غير قانونية ورفع أ‪ None ‬دالة‪ .‬التخصيصات‬

‫‪NotImplemented‬‬

‫على سبيل ( قيمة خاصة يجب إرجاعها بواسطة الطرق الخاصة الثنائية‬
‫لإلشارة إلى أن العملية لم يتم تنفيذها فيما يتعلق بالنوع )إلخ ‪ __eq__()، __lt__()، __add__()، __rsub__()،‬المثال‬
‫لنفس )وغيرها)(__‪ __imul__()، __iand‬على سبيل المثال( اآلخر ؛‪ ‬يمكن إرجاعها بواسطة الطرق في مكان الثنائية الخاصة‬
‫‪.‬النوع‪ types.NotImplementedType‬هو المثيل الوحيد من‪. NotImplemented‬الغرض‪ .‬ال ينبغي تقييمها في سياق منطقي‬

‫ملحوظة‬

‫‪ ‬‬

‫سيحاول المترجم الفوري العملية المنعكسة‪ L‬على النوع اآلخر (أو ‪ NotImplemented،‬عندما ترجع الطريقة الثنائية (أو الموضعية)‬
‫ً‬
‫اعتمادا على عامل التشغيل)‪ .‬إذا عادت جميع المحاوالت‬ ‫فسيقوم ‪ NotImplemented،‬بعض اإلجراءات االحتياطية األخرى ‪،‬‬
‫سيؤدي‪ ‬اإلرجاع بشكل غير صحيح‪ ‬إلى ظهور رسالة خطأ مضللة ‪. NotImplemented‬المترجم بإصدار استثناء مناسب‪L‬‬
‫‪ Python.‬إرجاع القيمة إلى كود‪ NotImplemented‬أو‬

‫‪.‬راجع‪ ‬تنفيذ العمليات الحسابية‪ ‬للحصول على أمثلة‬

‫ملحوظة‬

‫‪ ‬‬

‫قابلة للتبديل ‪ ،‬على الرغم من أن لها أسماء‪ L‬وأغراض متشابهة ‪ NotImplemented‬وغير‪NotImplementedError‬‬


‫‪.‬للحصول على تفاصيل حول وقت استخدامها‪ . NotImplementedError‬انظر‬

‫تم إهمال‪ ‬التقييم‪ ‬في سياق منطقي‪ .‬بينما يتم تقييمه حاليًا على أنه صحيح ‪ ،‬فإنه ‪:NotImplemented ‬تم التغيير في اإلصدار ‪3.9‬‬
‫‪ Python.‬طرح إصدار في المستقبل من‪ TypeError‬سيتم‪ DeprecationWarning. ‬سيصدر ملف‬

‫‪Ellipsis‬‬

‫نفس عالمة القطع "‪  ."... ‬تستخدم القيمة الخاصة في الغالب باالقتران مع بنية التقطيع الموسعة ألنواع بيانات الحاوية المعرفة‪ L‬من قبل‬
‫‪.‬النوع‪ types.EllipsisType‬هو المثيل الوحيد من‪. Ellipsis‬المستخدم‬

‫__‪__debug‬‬

‫‪.‬البيان‪ assert‬بخيار‪ .‬انظر أيضا‪ -O‬يكون هذا الثابت صحيحً ا إذا لم تكن بايثون قد بدأت‬

‫ملحوظة‬

‫‪ ‬‬

‫ولذلك ‪ SyntaxError)،‬تعيينات لهم‪ ،‬وحتى اسم سمة‪ ،‬رفع( ال يمكن إعادة تعيين‪ __debug__ ‬و‪ None، False، True‬أسماء‬
‫‪".‬يمكن اعتبار الثوابت "الحقيقية‬

‫‪ ‬الوحدة النمطية‪ site‬الثوابت المضافة‪ L‬بواسطة‬

‫يضيف عدة الثوابت إلى )يتم إعطاء خيار سطر األوامر‪ -S‬والتي يتم استيرادها تلقائيا أثناء بدء التشغيل‪ ،‬إال إذا كان( حدة‪ site‬و‬
‫‪.‬مساحة االسم المضمنة‪  .‬وهي مفيدة لقذيفة المترجم التفاعلي وال ينبغي استخدامها في البرامج‬

‫‪ ) ‬كود‪  =  ‬ال شيء ‪quit( ‬‬

‫‪ ) ‬كود‪  =  ‬ال شيء ‪exit( ‬‬

‫للخروج" ‪ ،‬وعند استدعائها ‪ EOF) ،‬أي( ‪ Ctrl-D‬أو )( ‪ "Use quit‬الكائنات التي عند طباعتها ‪ ،‬اطبع رسالة مثل‬
‫‪.‬باستخدام رمز الخروج المحدد‪ SystemExit‬ارفعها‪L‬‬

‫‪Pg. 170‬‬
‫‪copyright‬‬

‫‪credits‬‬

‫‪.‬الكائنات التي تطبع نص حقوق النشر أو االعتمادات عند طباعتها أو استدعاؤها ‪ ،‬على التوالي‬

‫‪license‬‬

‫الكائن الذي عند طباعته ‪ ،‬يطبع الرسالة "نوع الترخيص () لرؤية نص الترخيص الكامل" ‪ ،‬وعندما يتم االتصال به ‪ ،‬يعرض نص‬
‫‪.‬الترخيص الكامل بطريقة تشبه الصفحة (شاشة واحدة في كل مرة)‬

‫‪ ‬أنواع‬

‫‪.‬تصف األقسام التالية األنواع القياسية المضمنة في المترجم الفوري‬

‫‪.‬األنواع المضمنة الرئيسية هي األرقام والتسلسالت والتعيينات والفئات والمثيالت واالستثناءات‬

‫بعض فئات المجموعة قابلة للتغيير‪  .‬الطرق التي تضيف أو تطرح أو تعيد ترتيب أعضائها في مكانها‪ ، L‬وال تعيد عنصرً ا معي ًنا ‪ ،‬ال‬
‫‪ُ  None.‬ترجع أب ًدا نسخة المجموعة نفسها ولكن‬

‫يتم دعم بعض العمليات بواسطة عدة أنواع من الكائنات ؛‪ ‬على وجه الخصوص ‪ ،‬يمكن مقارنة جميع الكائنات عمليًا من أجل‬
‫يتم استخدام الوظيفة ‪ ). ‬الوظيفة‪ ‬المختلفة قليالً)(‪ str‬الوظيفة أو)(‪ repr‬مع( المساواة ‪ ،‬واختبار قيمة الحقيقة ‪ ،‬وتحويلها إلى سلسلة‬
‫‪.‬الوظيفة)(‪ print‬األخيرة ضمنيًا عندما تتم كتابة كائن بواسطة‬

‫‪ ‬اختبار قيمة الحقيقة‬

‫‪.‬شرط أو المعامل العمليات المنطقية أدناه‪ while‬أو‪ if‬أي كائن يمكن اختبار لقيمة الحقيقة‪ ،‬الستخدامها في‬

‫طريقة ُترجع صفرً ا ‪ __len__() ،‬أو‪ False‬طريقة ُترجع)(__‪ __bool‬بشكل افتراضي ‪ ،‬يعتبر الكائن صحيحً ا ما لم تحدد فئته إما‬
‫‪:‬عند استدعائها مع الكائن‪ 1 .‬فيما‪ ‬يلي معظم العناصر المضمنة التي تعتبر خاطئة‬

‫‪‬‬ ‫‪ False.‬و‪: None‬تم تعريف الثوابت على أنها خاطئة‬

‫‪‬‬ ‫)‪j، Decimal(0)، Fraction(0, 1‬صفر من أي نوع رقمي‪0 ،0.0 ،0 :‬‬

‫‪‬‬ ‫)‪: ''، ()، []، {}، set()، range(0‬تسلسل فارغة ومجموعات‬

‫(‪. ‬للصواب ‪ ،‬ما لم يُذكر خالف ذلك‪/ True‬للخطأ و‪ False1 ‬العمليات والوظائف المضمنة التي لها نتيجة منطقية تعود دائمًا‪ 0 ‬أو‬
‫)‪.‬دائما يعود واحد من المعامالت الخاصة بهم‪ and‬و‪ or‬استثناء هام‪ :‬العمليات المنطقية‬

‫‪ - and، or، not‬العمليات المنطقية‬

‫‪:‬هذه هي العمليات المنطقية ‪ ،‬مرتبة حسب‪ L‬األولوية التصاعدية‬

‫عملية‬ ‫نتيجة‬ ‫ملحوظات‬

‫‪x or y‬‬ ‫‪ x‬وإال ‪ y ،‬خطأ ‪ ،‬ثم‪ x ‬إذا كانت‬ ‫)‪(1‬‬

‫‪x and ‬‬
‫إذا كانت‪ ‬س‪ ‬خطأ ‪ ،‬ثم‪ ‬س‪ ، ‬وإال‪ ‬ص‬ ‫)‪(2‬‬
‫‪y‬‬

‫‪not x‬‬ ‫‪False‬وإال ‪ True،‬خطأ ‪ ،‬إذن‪ x ‬إذا كانت‬ ‫)‪(3‬‬

‫‪:‬ملحوظات‬

‫‪.‬هذا عامل تشغيل ماس كهربائى ‪ ،‬لذا فهو يقيم الوسيطة الثانية فقط إذا كانت األولى خاطئة ‪1.‬‬

‫‪.‬هذا عامل دائرة قصر ‪ ،‬لذا فهو يقيم الوسيطة الثانية فقط إذا كانت األولى صحيحة ‪2.‬‬

‫‪Pg. 171‬‬
‫لديه أولوية أقل من المشغلين غير منطقية‪ ،‬لذلك‪ ‬يتم تفسيره على أنه‪ ، ‬و‪ ‬هو خطأ في بناء ‪3. not‬‬
‫‪.not a == bnot (a == b)a == not b‬الجملة‬

‫‪Comparisons‬‬

‫توجد ثماني عمليات مقارنة في بايثون‪ .‬لديهم جميعً ا نفس األولوية (وهي أعلى من تلك الخاصة بالعمليات المنطقية)‪ .‬يمكن ربط‬
‫ولكن في كلتا الحالتين ‪ ،‬ال يتم ( يتم تقييمه مرة واحدة فقط‪ y ‬المقارنات بشكل تعسفي ؛‪ ‬على سبيل المثال ‪ ،‬يعادل‪ ، ‬باستثناء أن‬
‫‪).x < y <= zx < y and y <= zx < y‬على اإلطالق عندما‪ ‬يتبين أنه خطأ‪ z ‬تقييم‬

‫‪:‬يلخص هذا الجدول عمليات المقارنة‬

‫عملية‬ ‫المعنى‬

‫<‬ ‫بدقة أقل من‬

‫=<‬ ‫اصغر من او يساوي‬

‫>‬ ‫بدقة أكبر من‬

‫=>‬ ‫أكبر من أو يساوي‬

‫==‬ ‫مساو‬

‫=!‬ ‫غير متساوي‬

‫‪is‬‬ ‫هوية الكائن‬

‫‪is no‬‬
‫رفض هوية الكائن‬
‫‪t‬‬

‫أبدا بالتساوي‪ .‬و‪== ‬يعرف مشغل دائما لكن بالنسبة لبعض‬ ‫كائنات من أنواع مختلفة ‪ ،‬باستثناء األنواع الرقمية المختلفة ‪ ،‬ال تقارن ً‬
‫و‪> ،=< ،< ‬و‪ => ‬يتم تعريف المشغلين فقط حيث كانت منطقية‪ .‬على ‪ is. ‬أنواع الكائنات (على سبيل المثال‪ ،‬كائنات فئة) ما يعادل‬
‫‪.‬استثناء عندما تكون إحدى الوسيطات رقمًا مركبًا‪ TypeError‬سبيل المثال ‪ ،‬تثير‬

‫‪.‬الطريقة)(__‪ __eq‬عاد ًة ما ُت قارن األمثلة غير المتطابقة لفئة على أنها غير متكافئة ما لم تحدد الفئة‬

‫مثيالت الفئة ال يمكن أن يؤمر فيما يتعلق حاالت أخرى من نفس الفئة‪ ،‬أو أنواع أخرى من وجوه‪ ،‬ما لم تحدد الدرجة ما يكفي من‬
‫كافية‪ ،‬إذا كنت تريد المعاني )(__‪ __eq‬و)(__‪، __lt‬بشكل عام()(__‪ __ge‬و ‪ __lt__()، __le__()، __gt__()،‬األساليب‬
‫‪).‬التقليدية لل عوامل المقارنة‬

‫‪.is not‬و‪ ‬مشغلي ال يمكن تخصيص‪ .‬كما يمكن تطبيقها على أي كائنين وال تثير استثنا ًء مطل ًقا‪ is‬سلوك‬

‫)(__‪.not in__contains‬أو تنفيذ‪ ‬األسلوب‪ iterable ‬و‪ ‬معتمدة من قبل أنواع التي‪، in‬عمليتين أكثر مع نفس األولوية النحوية‬

‫‪ - int، float، complex‬أنواع األرقام‬

‫هناك ثالثة أنواع متميزة الرقمية‪ :‬األعداد الصحيحة‪ ، ‬أرقام النقطة العائمة‪ ، ‬و‪ ‬األعداد المركبة‪ . ‬باإلضافة إلى ذلك ‪ ،‬تعد القيم‬
‫المنطقية نوعً ا فرعيًا من األعداد الصحيحة‪ .‬األعداد الصحيحة لها دقة غير محدودة‪ .‬عادة ما يتم تنفيذ أرقام الفاصلة العائمة‬
‫؛‪  ‬تتوفر معلومات حول الدقة والتمثيل الداخلي ألرقام الفاصلة العائمة للجهاز الذي يعمل عليه ‪ C‬باستخدام‪ ‬ضعف‪ ‬في‬
‫تحتوي األعداد المركبة على جزء حقيقي وخيالي ‪ ،‬وكل منهما عبارة عن رقم فاصلة عائمة‪ .‬الستخراج ‪ sys.float_info. ‬برنامجك‬
‫تتضمن المكتبة القياسية األنواع الرقمية (‪ z.imag. ‬و‪ z.real‬هذه األجزاء من رقم مركب‪ ‬ض‪ ، ‬استخدم‬
‫ألرقام الفاصلة العائمة بدقة يمكن تحديدها من قبل ‪decimal.Decimal،‬لألسباب المنطقية ‪ ،‬و ‪ fractions.Fraction،‬اإلضافية‬
‫)‪.‬المستخدم‬

‫‪Pg. 172‬‬
‫يتم إنشاء األرقام بواسطة حرفية رقمية أو كنتيجة لوظائف وعوامل مضمنة‪  .‬ينتج عن األعداد الصحيحة غير المزخرفة (بما في ذلك‬
‫األرقام السداسية والثمانية والثنائية) أعداد صحيحة‪  .‬تنتج القيم الحرفية الرقمية التي تحتوي على فاصلة عشرية أو عالمة األس أرقامًا‬
‫به ينتج عنه رقم تخيلي (رقم مركب به جزء حقيقي صفري) والذي يمكنك إضافته إلى'‪ 'J‬أو'‪ 'j‬فاصلة عائمة‪ .‬إلحاق رقم‪ ‬حرفي رقمي‬
‫‪.‬عدد صحيح أو عائم للحصول على رقم معقد بأجزاء حقيقية وخيالية‬

‫الحساب المختلط تما ًم ا‪ :‬عندما يكون لدى عامل حسابي ثنائي معامالت من أنواع عددية مختلفة ‪ ،‬يتم توسيع المعامل ‪ Python‬تدعم‬
‫ذي النوع "الضيق" إلى النوع اآلخر ‪ ،‬حيث يكون العدد الصحيح أضيق من النقطة العائمة ‪ ،‬والتي تكون أضيق من‬
‫المعامل‪  .‬تتصرف المقارنة بين أعداد األنواع المختلفة وكأن القيم الدقيقة لتلك األرقام تتم مقارنتها‪2 .‬‬

‫‪.‬يمكن استخدامها إلنتاج أعداد من نوع خاص)(‪ complex‬و)(‪ int()، float‬منشئات‬

‫‪ :‬تدعم جميع األنواع الرقمية (باستثناء المعقدة) العمليات التالية (للتعرف على أولويات العمليات ‪ ،‬راجع‪ ‬أسبقية المشغل‪) ‬‬

‫ملحوظا‬
‫عملية‬ ‫نتيجة‬ ‫وثائق كاملة‬
‫ت‬

‫‪x + y‬‬ ‫‪ y‬و‪ x ‬مجموع‬

‫‪x - y‬‬ ‫‪ y‬و‪ x ‬الفرق بين‬

‫‪x * y‬‬ ‫‪ y‬و‪ x ‬حاصل‪ ‬ضرب‬

‫‪x / y‬‬ ‫‪ y‬و‪ x ‬حاصل قسمة‪L‬‬

‫‪x // y‬‬ ‫‪ y‬و‪ x ‬حاصل القسمة األرضية لـ‬ ‫)‪(1‬‬

‫‪x % y‬‬ ‫‪ x / y‬ما تبقى من‬ ‫)‪(2‬‬

‫‪-x‬‬ ‫س‪ ‬نفي‬

‫‪+x‬‬ ‫لم يتغير‪x ‬‬

‫)‪abs(x‬‬ ‫‪ x‬القيمة المطلقة أو مقدار‬ ‫)(‪abs‬‬

‫)‪int(x‬‬ ‫تم‪ ‬تحويلها إلى عدد صحيح ‪x‬‬ ‫)‪(3)(6‬‬ ‫)(‪int‬‬

‫)‪float(x‬‬ ‫إلى النقطة العائمة‪ x ‬تم‪ ‬تحويل‬ ‫)‪(4)(6‬‬ ‫)(‪float‬‬

‫االفتراضي هو ‪ im . im ‬جزء وهمي ‪ re ،‬عدد معقد مع جزء حقيقي‬


‫)‪complex(re, im‬‬ ‫)‪(6‬‬ ‫)(‪complex‬‬
‫‪.‬الصفر‬

‫)(‪c.conjugate‬‬ ‫مرافق العدد المركب‪ ‬ج‬

‫)‪divmod(x, y‬‬ ‫)‪ (x // y, x % y‬الزوج‬ ‫)‪(2‬‬ ‫)(‪divmod‬‬

‫)‪pow(x, y‬‬ ‫‪ y‬مرفوع‪ ‬للقوة ‪x ‬‬ ‫)‪(5‬‬ ‫)(‪pow‬‬

‫‪x ** y‬‬ ‫‪ y‬مرفوع‪ ‬للقوة ‪x ‬‬ ‫)‪(5‬‬

‫‪:‬ملحوظات‬

‫‪Pg. 173‬‬
‫‪1.‬‬ ‫يشار إليها أي ً‬
‫ضا باسم القسمة الصحيحة‪  .‬القيمة الناتجة هي عدد صحيح كامل ‪ ،‬على الرغم من أن نوع النتيجة ليس‬
‫والنتيجة هي دائما تقريب نحو الالنهاية ناقص‪2//1 :‬هو‪2//)1-( ،0 ‬هو‪)2-(//1 ،1- ‬هو‪ ،1- ‬و‪ int. -(//)1-( ‬بالضرورة‬
‫‪)2.‬هو‪0 ‬‬

‫‪.‬إذا كان ذلك مناسبًا)(‪ abs‬ليس لألعداد المركبة‪ .‬بدالً من ذلك ‪ ،‬قم بالتحويل إلى عوامات باستخدام ‪2.‬‬

‫)(‪ math.floor‬؛‪ ‬رؤية وظائف ‪ C‬قد يتم تقريب أو اقتطاع التحويل من النقطة العائمة إلى عدد صحيح كما في ‪3.‬‬
‫‪.‬عن التحويالت واضحة المعالم)(‪ math.ceil‬و‬

‫والنهاية موجبة أو )‪ Not a Number (NaN‬ببادئة اختيارية "‪ "+‬أو "‪ "-‬لـ "‪ "inf‬و "‪ "nan‬أي ً‬
‫ضا السالسل ‪ float‬يقبل ‪4.‬‬
‫‪.‬سالبة‬

‫‪.pow(0, 0)0 ** 01‬يعرف الثعبان‪ ‬و‪ ‬أن يكون‪ ، ‬كما هو شائع لغات البرمجة ‪5.‬‬

‫‪).‬الخاصية‪ Nd‬نقاط الرمز مع( ‪ Unicode‬تتضمن القيم الحرفية الرقمية المقبولة األرقام‪0 ‬إلى‪9 ‬أو أي مكافئ لـ ‪6.‬‬

‫للحصول على قائمة ‪ https://www.unicode.org/Public/13.0.0/ucd/extracted/DerivedNumericType.txt ‬راجع‬


‫‪.‬الخاصية‪ Nd‬كاملة بنقاط الرمز مع‬

‫‪:‬أيضً ا العمليات التالية )‪ float‬و‪ ( int‬األنواع‪ numbers.Real‬تشمل جميع‬

‫عملية‬ ‫نتيجة‬

‫‪math.trunc(x‬‬
‫‪Integral‬مقطوع إلى‪x ‬‬
‫)‬

‫فسيتم تعيينه افتراضيًا على ‪ n ،‬من‪ ‬األرقام ‪ ،‬مع تقريب نصف إلى زوجي‪ .‬إذا‪ ‬تم حذف ‪ n‬مقربة إلى‪x ‬‬
‫)]‪round(x[, n‬‬
‫‪0.‬‬

‫)‪math.floor(x‬‬ ‫س ‪ Integral <= ‬أعظم‬

‫)‪math.ceil(x‬‬ ‫‪ Integral> = x‬األقل‬

‫‪ cmath.‬و‪ math‬لمزيد من العمليات الرقمية ‪ ،‬راجع‪ ‬الوحدات النمطية‬

‫‪ ‬على أنواع صحيحة ‪ Bitwise‬عمليات‬

‫منطقية فقط لألعداد الصحيحة‪ .‬يتم حساب‪ L‬نتيجة العمليات األحادية كما لو تم تنفيذها في تكملة ثنائية مع عدد ال ‪ Bitwise‬عمليات‬
‫‪.‬حصر له من بتات اإلشارة‬

‫أولويات العمليات ثنائية البت هي كلها أقل من العمليات الرقمية وأعلى من المقارنات ؛‪ ‬العملية األحادية‪~ ‬لها نفس أولوية العمليات‬
‫‪.‬الرقمية األحادية األخرى (‪+ ‬و‪)- ‬‬

‫‪:‬يسرد هذا الجدول عمليات البت التي تم فرزها حسب‪ L‬األولوية التصاعدية‬

‫عملية‬ ‫نتيجة‬ ‫ملحوظات‬

‫‪x | y‬‬ ‫‪ y‬و‪ x ‬أحادي المعامل‪ ‬أو‪ ‬من‬ ‫)‪(4‬‬

‫على مستوى أحادي‬


‫‪x ^ y‬‬ ‫)‪(4‬‬
‫‪ y‬و‪ x ‬المعامل‪ ‬أو‪ ‬من‬

‫‪x & y‬‬ ‫أحادي المعامل‪ ‬و‪ ‬من‪ ‬العاشر‪ ‬و‪ ‬ذ‬ ‫)‪(4‬‬

‫‪Pg. 174‬‬
‫عملية‬ ‫نتيجة‬ ‫ملحوظات‬

‫‪x << ‬‬
‫بت‪ n ‬لليسار بمقدار‪ x ‬إزاحة‬ ‫)‪(1)(2‬‬
‫‪n‬‬

‫‪x >> ‬‬
‫بت‪ n ‬لليمين بمقدار‪ x ‬إزاحة‬ ‫)‪(1)(3‬‬
‫‪n‬‬

‫‪~x‬‬ ‫مقلوبة‪ x ‬بتات‬

‫‪:‬ملحوظات‬

‫‪".‬في رفع قيمة "أ‪ ValueError‬تعد أعداد المناوبات السلبية غير قانونية وتتسبب ‪1.‬‬

‫)‪ .pow(2, n‬بتات تعادل الضرب في‪ n ‬إزاحة لليسار بمقدار ‪2.‬‬

‫)‪ .pow(2, n‬بتات تعادل قسمة األرضية على‪ n ‬إن اإلزاحة الصحيحة بمقدار ‪3.‬‬

‫‪4.‬‬ ‫إجراء هذه الحسابات مع بتة إضافية واحدة على األقل لتمديد اإلشارة في تمثيل مكمل اثنين محددين (عرض بت عمل‪ ‬أو‬
‫أكثر) كافٍ للحصول على نفس النتيجة كما لو كان هناك عدد ال حصر له من بتات اإلشارة‪.‬‬
‫))(‪1 + max(x.bit_length(), y.bit_length‬‬

‫‪ ‬طرق إضافية ألنواع العدد الصحيح‬

‫‪:numbers.Integral‬يطبق‪ ‬الفئة األساسية التجريدية‪ . ‬باإلضافة إلى ذلك ‪ ،‬فإنه يوفر بعض الطرق األخرى ‪ int‬النوع‬

‫)(‪int.bit_length‬‬

‫‪:‬قم بإرجاع عدد وحدات البت الالزمة لتمثيل عدد صحيح في نظام ثنائي ‪ ،‬باستثناء اإلشارة واألصفار البادئة‬

‫>>>‬

‫‪>>> n = -37‬‬

‫)‪>>> bin(n‬‬

‫'‪'-0b100101‬‬

‫)(‪>>> n.bit_length‬‬

‫‪6‬‬

‫هكذا‪ . ‬بالتساوي ‪ ،‬عندما‪ ‬تكون ‪ k‬العدد الصحيح اإليجابي الفريد)(‪ x.bit_length‬غير صفري ‪ ،‬فسيكون‪ x‬بتعبير أدق ‪ ،‬إذا كان‬
‫‪**(k-‬صغيرة بما يكفي للحصول على لوغاريتم مدور بشكل صحيح ‪ ،‬إذن‪ . ‬إذا كانت‪ ‬صفرً ا ‪ ،‬فسيتم‪ ‬إرجاعها‪2. ‬‬
‫‪1) <= abs(x) < 2**kabs(x)k = 1 + int(log(abs(x), 2))xx.bit_length()0‬‬

‫‪:‬أي ما يعادل‬

‫‪def bit_length(self):‬‬

‫)‪s = bin(self‬‬ ‫'‪# binary representation: bin(-37) --> '-0b100101‬‬

‫‪s = s.lstrip('-0b') # remove leading zeros and minus sign‬‬

‫)‪return len(s‬‬ ‫‪# len('100101') --> 6‬‬

‫الجديد في اإلصدار ‪3.1.1‬‬

‫‪Pg. 175‬‬
‫)(‪int.bit_count‬‬

‫‪ :‬إرجاع عدد اآلحاد في التمثيل الثنائي للقيمة المطلقة للعدد الصحيح‪ .‬يُعرف هذا أي ً‬
‫ضا باسم عدد السكان‪ .‬مثال‬

‫>>>‬

‫‪>>> n = 19‬‬

‫)‪>>> bin(n‬‬

‫'‪'0b10011‬‬

‫)(‪>>> n.bit_count‬‬

‫‪3‬‬

‫)(‪>>> (-n).bit_count‬‬

‫‪3‬‬

‫‪:‬أي ما يعادل‬

‫‪def bit_count(self):‬‬

‫)"‪return bin(self).count("1‬‬

‫الجديد في اإلصدار ‪3.10.1‬‬

‫‪ ) ‬الطول‪ ، ‬ترتيب البايت‪ ، * ، ‬التوقيع‪  =  ‬خطأ ‪int.to_bytes( ‬‬

‫‪.‬إرجاع مصفوفة بايت تمثل عد ًدا صحيحً ا‬

‫>>>‬

‫)'‪>>> (1024).to_bytes(2, byteorder='big‬‬

‫'‪b'\x04\x00‬‬

‫)'‪>>> (1024).to_bytes(10, byteorder='big‬‬

‫'‪b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00‬‬

‫)‪>>> (-1024).to_bytes(10, byteorder='big', signed=True‬‬

‫'‪b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00‬‬

‫‪>>> x = 1000‬‬

‫)'‪>>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little‬‬

‫'‪b'\xe8\x03‬‬

‫يتم رفع إذا كان صحيحا ليس للتمثيل مع عدد معين من وحدات ‪ OverflowError ‬يتم تمثيل العدد الصحيح باستخدام‪ ‬طول‪ ‬بايت‪ .‬و‬
‫‪.‬البايت‬

‫والبت األكثر أهمية هو في بداية ‪ "big"،‬هو‪ byteorder ‬حجة يحدد ترتيب البايت تستخدم لتمثيل العدد الصحيح‪ .‬إذا‪ byteorder ‬و‬
‫والبت األكثر أهمية هو في نهاية صفيف بايت‪ .‬لطلب ترتيب البايت األصلي للنظام ‪ "little"،‬هو‪ byteorder ‬صفيف بايت‪ .‬إذا‬
‫‪.‬كقيمة ترتيب البايت‪ sys.byteorder‬المضيف ‪ ،‬استخدم‬

‫‪Pg. 176‬‬
‫ويعطى عدد صحيح سلبية‪ False ،‬و‪ ‬قعت‪  L‬تحدد حجة ما إذا كان استخدام متمم ثنائي لتمثيل صحيح‪ .‬إذا‪ ‬وقعت‪ ‬و‬
‫‪ False.‬يظهر‪ .‬القيمة االفتراضية‪ ‬للموقع‪ ‬هي ‪ OverflowError‬وهو‬

‫الجديد في اإلصدار ‪3.2.1‬‬

‫‪ ) ‬وقع‪  =  ‬خطأ ‪ ، byteorder ، * ، ‬بايت ‪classmethod  int.from_bytes( ‬‬

‫‪.‬إرجاع العدد الصحيح الذي يمثله مصفوفة معينة من البايتات‬

‫>>>‬

‫)'‪>>> int.from_bytes(b'\x00\x10', byteorder='big‬‬

‫‪16‬‬

‫)'‪>>> int.from_bytes(b'\x00\x10', byteorder='little‬‬

‫‪4096‬‬

‫)‪>>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True‬‬

‫‪-1024‬‬

‫)‪>>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False‬‬

‫‪64512‬‬

‫)'‪>>> int.from_bytes([255, 0, 0], byteorder='big‬‬

‫‪16711680‬‬

‫‪.‬يجب أن تكون‪ ‬الوسيطة‪ ‬بايت‪ ‬إما‪ ‬كائ ًنا يشبه البايت‪ ‬أو‪ ‬كائ ًنا‪ ‬متكررً ا إلنتاج البايت‬

‫والبت األكثر أهمية هو في بداية ‪ "big"،‬هو‪ byteorder ‬حجة يحدد ترتيب البايت تستخدم لتمثيل العدد الصحيح‪ .‬إذا‪ byteorder ‬و‬
‫والبت األكثر أهمية هو في نهاية صفيف بايت‪ .‬لطلب ترتيب البايت األصلي للنظام ‪ "little"،‬هو‪ byteorder ‬صفيف بايت‪ .‬إذا‬
‫‪.‬كقيمة ترتيب البايت‪ sys.byteorder‬المضيف ‪ ،‬استخدم‬

‫‪.‬و‪ ‬قعت‪ ‬تشير حجة ما إذا كان استخدام متمم ثنائي لتمثيل صحيح‬

‫الجديد في اإلصدار ‪3.2.1‬‬

‫)(‪int.as_integer_ratio‬‬

‫قم بإرجاع زوج من األعداد الصحيحة التي تكون نسبتها مساوية تمامًا للعدد الصحيح األصلي وبها مقام موجب‪ .‬النسبة الصحيحة‬
‫‪.‬لألعداد الصحيحة (األعداد الصحيحة) هي دائمًا العدد الصحيح كبسط‪1 ‬ومقام‬

‫الجديد في اإلصدار ‪3.8.1‬‬

‫‪ Float ‬طرق إضافية على‬

‫‪.numbers.Real‬أيضً ا على الطرق اإلضافية التالية ‪ float‬النوع العائم يطبق‪ ‬الفئة األساسية المجردة‪ . ‬يحتوي‬

‫)(‪float.as_integer_ratio‬‬

‫على ‪ OverflowError‬قم بإرجاع زوج من األعداد الصحيحة التي تكون نسبتها تساوي تمامًا العدد األصلي مع مقام موجب‪ .‬يرفع‬
‫‪ ValueErrorNaNs.‬الالنهايات وعلى‬

‫)(‪float.is_integer‬‬

‫‪:‬وبخالف ذلك‪ ، False‬إذا كان مثيل الطفو محدو ًدا بقيمة تكاملية‪ True‬العودة‬

‫‪Pg. 177‬‬
‫>>>‬

‫)(‪>>> (-2.0).is_integer‬‬

‫‪True‬‬

‫)(‪>>> (3.2).is_integer‬‬

‫‪False‬‬

‫داخليًا كأرقام ثنائية ‪ ،‬فإن ‪ Python‬هناك طريقتان تدعمان التحويل من سالسل سداسية عشرية وإليها‪ .‬نظرً ا ألنه يتم تخزين عوامات‬
‫تحويل عدد عشري إلى‪ ‬سلسلة‪ ‬عشرية‪ ‬أو منها‪ ‬عاد ًة ما ينطوي على خطأ تقريب صغير‪ .‬في المقابل ‪ ،‬تسمح السالسل السداسية‬
‫‪.‬العشرية بالتمثيل الدقيق وتحديد أرقام الفاصلة العائمة‪ .‬يمكن أن يكون هذا مفي ًدا عند تصحيح األخطاء وفي العمل العددي‬

‫)(‪float.hex‬‬

‫‪x‬إرجاع تمثيل رقم الفاصلة العائمة كسلسلة سداسية عشرية‪  .‬بالنسبة ألرقام الفاصلة العائمة المحدودة ‪ ،‬سيتضمن هذا التمثيل دائمًا‪0 ‬‬
‫‪.‬وأس‪ p‬بادئة وتتبع‬

‫‪ ) ‬ق ‪classmethod  float.fromhex( ‬‬

‫‪.‬على مسافة بيضاء في المقدمة والخلفية‪ s ‬أسلوب فئة إلعادة تعويم يمثله عشري سلسلة‪ ‬الصورة‪ . ‬قد تحتوي‪ ‬السلسلة‬

‫‪.‬هي طريقة فئة)(‪ float.fromhex‬هذه طريقة مثيل ‪ ،‬بينما)(‪ float.hex‬الحظ أن‬

‫‪:‬تأخذ السلسلة السداسية العشرية الشكل‬

‫]‪[sign] ['0x'] integer ['.' fraction] ['p' exponent‬‬

‫عبارة عن سالسل من األرقام السداسية ‪ fraction‬ويكون‪ -، integer ‬إما من خالل‪+ ‬أو‪ sign‬حيث يكون الخيار االختياري‬


‫وهو عدد صحيح عشري بعالمة بادئة اختيارية‪ .‬الحالة ليست مهمة‪ ، L‬ويجب أن يكون هناك رقم سداسي ‪ ، exponent ‬العشرية‬
‫‪ C99 ،‬عشري واحد على األقل في العدد الصحيح أو في الكسر‪ .‬يشبه بناء الجملة هذا النحو المحدد في القسم ‪ 6.4.4.2‬من معيار‬
‫نقطة عائمة سداسية )(‪ float.hex‬وما بعده‪ .‬على وجه الخصوص ‪ ،‬يمكن استخدام ناتج ‪ Java 1.5‬وكذلك البنية المستخدمة‪ L‬في‬
‫أو‪ C ‬ويتم قبول‪ ‬السالسل السداسية العشرية التي ينتجها‪ ‬حرف تنسيق‪ Java ، Double.toHexString‬أو‪ C %a‬عشرية في كود‬
‫‪ float.fromhex().‬بواسطة‪Java ‬‬

‫الحظ أن األس مكتوب بالنظام العشري بدالً من النظام السداسي عشري ‪ ،‬وأنه يعطي قوة ‪ 2‬التي يتم بها ضرب المعامل‪ .‬على سبيل‬
‫تمثل‪ ‬السلسلة السداسية العشرية رقم الفاصلة‪ ‬العائمة‪ ، ‬أو‪x3.a7p10**2.0 * )2**16/.7 + 16/.10 + 3(: ‬المثال ‪0 ،‬‬
‫‪103740.0‬‬

‫>>>‬

‫)'‪>>> float.fromhex('0x3.a7p10‬‬

‫‪3740.0‬‬

‫‪:‬تطبيق التحويل العكسي‪3740.0 ‬يعطي سلسلة سداسية عشرية مختلفة تمثل نفس الرقم‬

‫>>>‬

‫)‪>>> float.hex(3740.0‬‬

‫'‪'0x1.d380000000000p+11‬‬

‫‪ ‬تجزئة األنواع الرقمية‬

‫ربما من أنواع مختلفة‪ ،‬انها شرط أن‪ ‬كلما‪( ‬انظر‪ ‬الوثائق سيلة لمزيد من التفاصيل)‪ .‬لسهولة التنفيذ والكفاءة عبر ‪ y،‬و‪ x‬ألرقام‬
‫مجموعة متنوعة من أنواع الرقمية (بما في ذلك‪ ، ، ‬و‪ )  ‬ويستند التجزئة بايثون ألنواع رقمية على وظيفة رياضية واحدة وهذا ما‬
‫يعرف عن أي عدد العقالني‪ ،‬وبالتالي ينطبق على جميع حاالت‪ ‬و‪ ، ‬وجميع حاالت محدودة من‪ ‬و‪ُ  . ‬تعطى هذه الوظيفة أساسً ا عن‬

‫‪Pg. 178‬‬
‫كسمة‪ L‬ل ‪ Python‬طريق معامل التخفيض ألوليم‪ ‬ثابت‪ . ‬يتم توفير قيمة‪ ‬لـ‬
‫‪ .hash(x) == hash(y)x == y__hash__()intfloatdecimal.Decimalfractions.Fractionintfractions.Fractionflo‬ـ‬
‫‪atdecimal.DecimalPPPmodulussys.hash_info‬‬

‫الطويلة وعلى‪ ‬األجهزة ذات ‪ 64‬بت ‪ C‬حاليًا ‪ ،‬يتم استخدام العنصر األساسي‪ ‬على األجهزة ذات ‪ 32‬بت‪ CPython: ‬تفاصيل تنفيذ‬
‫‪.P = 2**31 - 1P = 2**61 - 1‬طويلة ‪C‬‬

‫‪:‬فيما يلي القواعد بالتفصيل‬

‫‪‬‬ ‫إذا كان‪ً  ‬‬


‫عددا منطقيًا غير سالب‪ ‬وال يقبل القسمة عليه‪ ، ‬فعرِّ ف‪ ‬كـ‪ ، ‬حيث‪ ‬يعطي‬ ‫‪‬‬
‫‪ .x = m / nnPhash(x)m * invmod(n, P) % Pinvmod(n, P)nP‬معكوس‪ ‬المقياس‬

‫‪‬‬ ‫إذا كان‪ ‬عد ًدا منطقيًا غير سالب وقابل‪ ‬للقسمة على‪( ‬لكنه‪ ‬ليس كذلك)‪ ، ‬فال يوجد نمط معكوس‪ ‬وال تنطبق القاعدة‬
‫‪ .x = m / nnPmnPhash(x)sys.hash_info.inf‬أعاله ؛‪ ‬في هذه الحالة تعرف‪ ‬على أنها قيمة ثابتة‬

‫‪‬‬ ‫‪ .x = m / nhash(x)-hash(-x)-1-2‬إذا كان‪ ‬رقمًا منطقيًا سالبًا ‪ ،‬حدد‪ ‬كـ‪ . ‬إذا كانت التجزئة الناتجة‪ ، ‬فاستبدلها‪ L‬بـ‬

‫‪‬‬ ‫تستخدم كقيم تجزئة ال نهاية إيجابية أو الالنهاية السالبة (على ‪ -sys.hash_info.inf ‬و‪ sys.hash_info.inf‬قيم معينة‬
‫‪.‬التوالي)‬

‫‪‬‬ ‫بحيث ‪ modulo ‬يتم دمج قيم التجزئة لألجزاء الحقيقية والخيالية عن طريق الحوسبة‪ ، ‬وتقليل ‪ z،‬للرقم‪ complex‬بالنسبة‬
‫تكمن فيه‪ . ‬مرة أخرى ‪ ،‬إذا كانت النتيجة كذلك‪ ، ‬يتم‪ ‬استبدالها‬
‫‪ .hash(z.real) + sys.hash_info.imag * hash(z.imag)2**sys.hash_info.widthrange(-‬بـ‬
‫‪2**(sys.hash_info.width - 1), 2**(sys.hash_info.width - 1))-1-2‬‬

‫المكافئ للتجزئة المضمنة ‪ ،‬لحساب تجزئة رقم ‪ Python ،‬لتوضيح القواعد المذكورة أعاله ‪ ،‬إليك بعض األمثلة على كود‬
‫‪ complex:‬أو ‪ float،‬منطقي‬

‫‪import sys, math‬‬

‫‪def hash_fraction(m, n):‬‬

‫‪"""Compute the hash of a rational number m / n.‬‬

‫‪Assumes m and n are integers, with n positive.‬‬

‫‪Equivalent to hash(fractions.Fraction(m, n)).‬‬

‫"""‬

‫‪P = sys.hash_info.modulus‬‬

‫)‪# Remove common factors of P. (Unnecessary if m and n already coprime.‬‬

‫‪while m % P == n % P == 0:‬‬

‫‪m, n = m // P, n // P‬‬

‫‪if n % P == 0:‬‬

‫‪hash_value = sys.hash_info.inf‬‬

‫‪Pg. 179‬‬
else:

# Fermat's Little Theorem: pow(n, P-1, P) is 1, so

# pow(n, P-2, P) gives the inverse of n modulo P.

hash_value = (abs(m) % P) * pow(n, P - 2, P) % P

if m < 0:

hash_value = -hash_value

if hash_value == -1:

hash_value = -2

return hash_value

def hash_float(x):

"""Compute the hash of a float x."""

if math.isnan(x):

return object.__hash__(x)

elif math.isinf(x):

return sys.hash_info.inf if x > 0 else -sys.hash_info.inf

else:

return hash_fraction(*x.as_integer_ratio())

def hash_complex(z):

"""Compute the hash of a complex number z."""

hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)

# do a signed reduction modulo 2**sys.hash_info.width

M = 2**(sys.hash_info.width - 1)

hash_value = (hash_value & (M - 1)) - (hash_value & M)

if hash_value == -1:

hash_value = -2

return hash_value

‫أنواع التكرار‬ 

Pg. 180
‫مفهوم التكرار عبر الحاويات‪ .‬يتم تنفيذ ذلك باستخدام طريقتين متميزتين ؛‪ ‬هذه تستخدم للسماح للفئات المعرفة من قبل ‪ Python‬تدعم‬
‫‪.‬المستخدم لدعم التكرار‪ .‬المتواليات ‪ ،‬الموصوفة أدناه بمزيد من التفصيل ‪ ،‬تدعم دائمًا طرق التكرار‬

‫‪:‬يجب تحديد طريقة واحدة لكائنات الحاوية لتوفير دعم التكرار‬

‫)(__‪container.__iter‬‬

‫إرجاع كائن مكرر‪ .‬الكائن مطلوب لدعم بروتوكول المكرر الموضح أدناه‪ .‬إذا كانت الحاوية تدعم أنوا ًعا مختلفة من التكرار ‪ ،‬فيمكن‬
‫توفير طرق إضافية لطلب التكرارات على وجه التحديد ألنواع التكرار هذه‪( .‬مثال على كائن يدعم أشكااًل متعددة من التكرار سيكون‬
‫في ‪ Python‬فتحة بنية النوع لكائنات‪ tp_iter‬هيكل شجرة يدعم كل من اجتياز العرض أوالً والعمق أوالً‪ ).‬تتوافق هذه الطريقة مع‬
‫‪Python / C API.‬‬

‫‪  :‬كائنات المكرر نفسها مطلوبة لدعم الطريقتين التاليتين ‪ ،‬والتي تشكل معًا‪ ‬بروتوكول المكرر‬

‫)(__‪iterator.__iter‬‬

‫تتوافق هذه الطريقة ‪ in. ‬و‪ for‬أعد كائن المكرر نفسه‪ .‬هذا مطلوب للسماح باستخدام كل من الحاويات والمكررات مع‪ ‬العبارات‬
‫‪ Python / C API.‬في ‪ Python‬فتحة بنية النوع لكائنات‪ tp_iter‬مع‬

‫)(__‪iterator.__next‬‬

‫االستثناء‪ .‬تتوافق هذه الطريقة ‪ StopIteration‬إرجاع العنصر التالي من الحاوية‪ .‬إذا لم تكن هناك عناصر أخرى ‪ ،‬فقم بإثارة‬
‫‪ Python / C API.‬في ‪ Python‬فتحة بنية النوع لكائنات‪ tp_iternext‬مع‬

‫العديد من كائنات التكرار لدعم التكرار على أنواع التسلسل العامة والخاصة والقواميس وغيرها من األشكال ‪ Python‬تحدد‬
‫‪.‬المتخصصة‪ .‬األنواع المحددة ليست مهمة‪ L‬بعد تنفيذها لبروتوكول المكرر‬

‫يجب أن تستمر في القيام بذلك في االستدعاءات الالحقة‪ .‬تعتبر ‪ StopIteration،‬رفع طريقة المكرر)(__‪ __next‬بمجرد‬


‫‪.‬التطبيقات التي ال تخضع لهذه الخاصية معطلة‬

‫‪ ‬أنواع المولدات‬

‫تم تنفيذ طريقة‪ ‬كائن الحاوية‪ ‬كمولد ‪ ،‬فسوف يقوم تلقائيًا)(__‪ __iter‬طريقة مالئمة لتنفيذ بروتوكول المكرر‪ .‬إذا‪ Python ‬يوفر‪ ‬مولد‬
‫يمكن العثور‪ ‬على‪ ‬مزيد من المعلومات حول ‪ __next__(). ‬و)(__‪ __iter‬بإرجاع كائن مكرر (تقنيًا ‪ ،‬كائن منشئ) لتزويد‪ ‬الطرق‬
‫‪ .‬المولدات في‪ ‬وثائق تعبير العائد‬

‫‪ - list، tuple، range‬أنواع التسلسل‬

‫هناك ثالثة أنواع أساسية من التسلسالت‪ :‬القوائم ‪ ،‬والمجموعات ‪ ،‬وكائنات النطاق‪ .‬أنواع تسلسل إضافية مصممة‪ L‬خصيصا لمعالجة‬
‫‪.‬من‪ ‬البيانات الثنائية‪ ‬و‪ ‬سالسل نصية‪ ‬تم وصفها في أقسام مخصصة‬

‫‪ ‬عمليات التسلسل الشائعة‬


‫العمليات الواردة في الجدول التالي مدعومة من قبل معظم أنواع التسلسالت ‪ ،‬سواء كانت قابلة للتغيير أو غير قابلة‬
‫لجعله أسهل لتنفيذ هذه العمليات على أنواع تسلسل المخصصة بشكل ‪ ABC‬يتم توفير‪ collections.abc.Sequence‬للتغيير‪ .‬و‬
‫‪.‬صحيح‬

‫متواليات من نفس ‪ t ‬و‪ ، s ‬يسرد هذا الجدول عمليات التسلسل مرتبة حسب األولوية التصاعدية‪ .‬في الجدول‬
‫‪ s .‬كائن عشوائي يفي بأي نوع وقيود تفرضها‪ x ‬أعداد صحيحة و‪ k ‬و‪ j ‬و‪ i ‬و‪ ، n ‬النوع‬

‫و‪ ‬عمليات تكون له نفس األولويات عمليات المقارنة‪ .‬العمليات‪( ‬التسلسل) و‪( ‬التكرار) لها نفس أولوية العمليات الرقمية ‪ in‬و‬
‫*‪not in+‬المقابلة‪3 .‬‬

‫‪Pg. 181‬‬
‫ملحوظ‬
‫عملية‬ ‫نتيجة‬
‫ات‬

‫إذا كان ‪True‬‬


‫‪x in s‬‬ ‫‪ x ‬يساوي‪ s ‬عنصر‬ ‫)‪(1‬‬
‫‪False‬وإال ‪،‬‬

‫إذا كان ‪False‬‬


‫‪x not in s‬‬ ‫‪ x ‬يساوي‪ s ‬عنصر‬ ‫)‪(1‬‬
‫‪True‬وإال ‪،‬‬

‫‪s + t‬‬ ‫‪ t‬و‪ s ‬تسلسل‬ ‫)‪(6)(7‬‬

‫‪ n * ‬أو‪s * n ‬‬ ‫إلى ‪ s ‬يعادل إضافة‬


‫)‪(2)(7‬‬
‫‪s‬‬ ‫مرة‪ n ‬نفسه‬

‫ط‪ ‬البند الرابع‬
‫]‪s[i‬‬ ‫من‪ ‬الصورة‪ ، ‬أصل‬ ‫)‪(3‬‬
‫‪0‬‬

‫شريحة‬
‫]‪s[i:j‬‬ ‫)‪(3)(4‬‬
‫‪ j‬إلى‪ i ‬من‪ s ‬من‬

‫شريحة‬
‫]‪s[i:j:k‬‬ ‫‪ j ‬إلى‪ i ‬من‪ s ‬من‬ ‫)‪(3)(5‬‬
‫‪ k‬بالخطوة‬

‫)‪len(s‬‬ ‫‪ s‬طول‬

‫أصغر عنصر‬
‫)‪min(s‬‬
‫‪ s‬من‬

‫)‪max(s‬‬ ‫‪ s‬أكبر عنصر من‬

‫فهرس أول ظهور‬


‫عند (‪ s ‬في‪ x ‬لـ‬
‫‪s.index(x[, i‬‬
‫أو ‪ i ‬الفهرس‬ ‫)‪(8‬‬
‫)]]‪[, j‬‬
‫بعده‪ ‬وقبل‬
‫)‪ j ‬الفهرس‬

‫إجمالي عدد‬
‫)‪s.count(x‬‬
‫‪ s‬في‪ x ‬تكرارات‬

‫تدعم التسلسالت من نفس النوع أيضً ا المقارنات‪  .‬على وجه الخصوص ‪ ،‬تتم مقارنة المجموعات والقوائم بشكل معجمي من خالل‬
‫مقارنة العناصر المقابلة‪  .‬هذا يعني أنه للمقارنة بالتساوي ‪ ،‬يجب أن يقارن كل عنصر بالتساوي ويجب أن يكون التسلسالن من نفس‬
‫النوع وأن يكون لهما نفس الطول‪( .‬للحصول على التفاصيل الكاملة ‪ ،‬راجع‪ ‬المقارنات‪ ‬في مرجع اللغة‪).‬‬

‫‪:‬ملحوظات‬

‫‪Pg. 182‬‬
‫فقط الختبار االحتواء البسيط في الحالة العامة‪ ، L‬فإن بعض التسلسالت المتخصصة ‪ inand ‬بينما‪ُ  ‬تستخدم العمليات ‪1.‬‬
‫ضا لالختبار الالحق‬ ‫‪(:not instrbytesbytearray‬مثل‪ ، ‬و‪ ) ‬تستخدم أي ً‬

‫>>>‬

‫"‪>>> "gg" in "eggs‬‬

‫‪True‬‬

‫الحظ أن العناصر الموجودة في ‪ s ). ‬والتي ينتج عنها تسلسل فارغ من نفس النوع مثل(‪ ‬أقل من‪ n ‬يتم التعامل مع‪ ‬قيم ‪2.‬‬
‫تسلسل‪ ‬الصورة‪ ‬ال يتم نسخ‪ .‬تمت اإلشارة إليهم عدة مرات‪ .‬هذا غالبًا ما يطارد مبرمجي بايثون الجدد ؛‪ ‬انصح‪00:‬‬

‫>>>‬

‫‪>>> lists = [[]] * 3‬‬

‫‪>>> lists‬‬

‫]][ ‪[[], [],‬‬

‫)‪>>> lists[0].append(3‬‬

‫‪>>> lists‬‬

‫]]‪[[3], [3], [3‬‬

‫ما حدث هو أن‪]][[  ‬هذه قائمة مكونة من عنصر واحد تحتوي على قائمة فارغة ‪ ،‬لذا فإن العناصر الثالثة‪ ‬جميعها إشارات إلى هذه‬
‫القائمة الفارغة المفردة‪ .‬تعديل أي من عناصر‪ ‬تعديل هذه القائمة المنفردة‪ .‬يمكنك إنشاء قائمة بقوائم مختلفة بهذه الطريقة‪:‬‬
‫‪3 * ]][[lists‬‬

‫>>>‬

‫])‪>>> lists = [[] for i in range(3‬‬

‫)‪>>> lists[0].append(3‬‬

‫)‪>>> lists[1].append(5‬‬

‫)‪>>> lists[2].append(7‬‬

‫‪>>> lists‬‬

‫]]‪[[3], [5], [7‬‬

‫‪ .‬يتوفر المزيد من الشرح في إدخال األسئلة الشائعة‪ .‬كيف أقوم بإنشاء قائمة متعددة األبعاد؟‬

‫أو‪ ‬يتم تعويضه‪ .‬لكن الحظ أن‪ ‬هذا ال ‪ s : ‬سالبة ‪ ،‬يكون المؤشر متناسبًا مع نهاية التسلسل‪ j ‬أو‪ i ‬إذا كانت ‪3.‬‬
‫‪ .len(s) + ilen(s) + j-00‬يزال‬

‫أكبر من‪ j  ، ‬أو‪ i ‬على‪ ‬هذا النحو‪ . ‬إذا كان ‪ k‬على أنها تسلسل العناصر ذات الفهرس‪ j ‬إلى‪ i ‬من‪ُ  s ‬تعرَّ ف شريحة ‪4.‬‬
‫تكون الشريحة ‪ j ،‬أكبر من أو يساوي‪ i ‬أو‪ ‬استخدم‪ . ‬إذا كان‪ j ‬فاستخدم‪ . ‬إذا‪ ‬تم حذف‪ ‬أنا‪ ‬أو‪ ‬استخدم‪ . ‬إذا‪ ‬تم حذف‬
‫)‪.i <= k < jlen(s)len(s)None0Nonelen(s‬فارغة‬

‫‪5.‬‬ ‫شريحة من‪ ‬الصورة‪ ‬من‪ ‬أنا‪ ‬ل‪ ‬ي‪ ‬مع خطوة‪ ‬ك‪ ‬يعرف بأنه سلسلة من البنود مع مؤشر‪ ‬مثل ذلك‪ . ‬وبعبارة أخرى‪ ،‬فإن‬
‫إلى‪ j ‬و‪ i ‬موجبة ‪ ،‬يتم تقليل‪ k ‬المؤشرات هي‪ ، ، ، ‬وهلم جرا‪ ،‬ووقف عند‪ ‬ي‪ ‬يتم التوصل (ولكن أبدا بما‪ ‬ي‪ .) ‬عندما تكون‬ ‫‪ ‬‬
‫‪x = i + n*k0 <= n < (j-‬أو‪ j ‬أو‪ i ‬إلى‪ ‬إذا كانت أكبر‪ .‬إذا‪ ‬تم حذف‪ j ‬و‪ i ‬سالبة ‪ ،‬يتم تقليل‪  k ‬إذا كانت أكبر‪ .‬عندما تكون‬
‫مالحظة ‪ ،‬ال ‪ k ). ‬والتي تعتمد نهايتها على عالمة( "تصبح قيم "نهاية ‪i)/kii+ki+2*ki+3*klen(s)len(s) - 1None،‬‬
‫‪.‬يتم التعامل معها مثل‪ None، 1 ‬صفرً ا‪ .‬إذا‪ ‬ك‪ ‬هو‪ k ‬يمكن أن يكون‬

‫‪Pg. 183‬‬
‫‪6.‬‬ ‫ً‬
‫جديدا‪  .‬هذا يعني أن بناء تسلسل عن طريق التسلسل المتكرر‬ ‫دائ ًم ا ما ينتج عن التسلسل الثابت غير القابل للتغيير كائ ًنا‬
‫سيكون له تكلفة وقت تشغيل تربيعية في إجمالي طول التسلسل‪ .‬للحصول على تكلفة وقت تشغيل خطي ‪ ،‬يجب عليك‬
‫‪:‬التبديل إلى أحد البدائل أدناه‬

‫‪o‬‬ ‫في النهاية أو الكتابة )(‪ str.join‬كائنات‪ ‬متسلسلة‪ ، ‬فيمكنك إنشاء‪ L‬قائمة واستخدامها‪ str‬إذا كانت‬
‫مثيل واسترداد قيمتها عند اكتمالها‪ io.StringIO ‬إلى‬

‫‪o‬‬ ‫أو يمكنك ‪ io.BytesIO،‬أو)(‪ bytes.join‬كائنات‪ ‬متسلسلة‪ ، ‬فيمكنك بالمثل استخدام‪ bytes‬إذا كانت هناك‬


‫كائنات قابلة للتغيير ولها آلية تكملة فعالة‪. bytearray ‬كائن‪ bytearray‬إجراء تسلسل موضعي مع‬

‫‪o‬‬ ‫بدال‪ list‬األشياء‪ ،‬تمديد‪ tuple‬إذا وصل‬

‫‪o‬‬ ‫لألنواع األخرى ‪ ،‬تحقق من وثائق الفصل ذات الصلة‬


‫ً‬
‫أنماطا معينة ‪ ،‬وبالتالي ال تدعم التسلسل )‪ range‬مثل( بعض أنواع التسلسل ‪7.‬‬ ‫تدعم فقط تسلسالت العناصر التي تتبع‬
‫‪.‬التسلسلي أو التكرار‬

‫تسمح هذه ‪ j . ‬و‪ i ‬ال تدعم جميع التطبيقات تمرير الحجج اإلضافية‪ s . ‬في‪ x ‬عندما‪ ‬ال توجد‪ ValueError‬يزيد‪8. index‬‬
‫الحجج بالبحث الفعال عن األقسام الفرعية للتسلسل‪ .‬يعد تمرير الوسائط اإلضافية مكاف ًئا تقريبًا‬
‫فقط بدون نسخ أي بيانات ويكون الفهرس الذي يتم إرجاعه متعل ًقا ببداية التسلسل بدالً من ‪ s[i:j].index(x)،‬لالستخدام‬
‫‪.‬بداية الشريحة‬

‫‪ ‬أنواع التسلسل غير القابل للتغيير‬


‫العملية الوحيدة التي تنفذها أنواع التسلسل غير القابل للتغيير بشكل عام والتي ال يتم تنفيذها أي ً‬
‫ضا بواسطة أنواع التسلسل القابل‬
‫‪.‬المضمنة‪ hash() ‬للتغيير هي دعم‬

‫‪.‬الحاالت‪ frozenset ‬و‪ set‬المفاتيح وتخزينها في‪ dict‬الحاالت‪ ،‬الستخدامها‪ tuple‬يسمح هذا الدعم تسلسل ثابتة‪ ،‬مثل‬

‫‪ TypeError.‬ستؤدي محاولة تجزئة تسلسل غير قابل للتغيير يحتوي على قيم غير قابلة للتجزئة إلى‬

‫‪ ‬أنواع التسلسل المتغير‬

‫يتم توفير‪  collections.abc.MutableSequence‬يتم تحديد العمليات في الجدول التالي على أنواع التسلسل القابل للتغيير‪ .‬و‬
‫‪.‬لجعله أسهل لتنفيذ هذه العمليات على أنواع تسلسل المخصصة بشكل صحيح ‪ABC‬‬

‫و‪ ‬العاشر‪  ‬هو كائن التعسفي الذي يلبي أي قيود نوع ‪ iterable‬في الجدول‪ ‬الصورة‪ ‬هو مثيل قابلة للتغيير نوع تسلسل‪ ،‬تي‪ ‬أي كائن‬
‫‪ ).0 <= x <= 255‬ال يقبل إال األعداد الصحيحة التي تلبي تقييد القيمة‪، bytearray‬على سبيل المثال(‪ ‬وقيمة التي تفرضها‪ ‬الصورة‬

‫ملح‬
‫عملية‬ ‫نتيجة‬ ‫وظا‬
‫ت‬

‫يتم‬
‫‪s[i] = x‬‬ ‫‪ s ‬من‪ i ‬استبدال‪ ‬العنصر‬
‫‪ x‬بـ‬

‫يتم‬
‫‪ i ‬من‪ s ‬استبدال‪ ‬شريحة‬
‫‪s[i:j] = t‬‬
‫القابلة ‪ t ‬بمحتويات‪ j ‬إلى‬
‫للتكرار‬

‫]‪del s[i:j‬‬ ‫][‪ s[i:j] = ‬مثل‬

‫‪Pg. 184‬‬
‫ملح‬
‫عملية‬ ‫نتيجة‬ ‫وظا‬
‫ت‬

‫يتم ‪s[i:j:k] ‬‬
‫‪s[i:j:k] = t‬‬ ‫‪ t ‬استبدال‪ ‬عناصر‬ ‫)‪(1‬‬
‫‪ t‬بعناصر‬

‫]‪ s[i:j:k‬يزيل عناصر‬
‫]‪del s[i:j:k‬‬
‫من القائمة‬

‫بنهاية التسلسل ‪ x ‬يلحق‬


‫‪s.append‬‬
‫)‪(s[len(s):len(s‬مثل‪) ‬‬
‫)‪(x‬‬
‫]‪] = [x‬‬

‫يزيل كافة‪ L‬العناصر‬


‫)(‪s.clear‬‬ ‫)‪(5‬‬
‫]‪ )del s[:‬مثل(‪ s ‬من‬

‫ينشئ نسخة ضحلة‬


‫)(‪s.copy‬‬ ‫)‪(5‬‬
‫)]‪ s[:‬مثل(‪ s ‬من‬

‫تمتد‪ ‬الصورة‪ ‬مع‬
‫محتويات‪ ‬ر‪( ‬بالنسبة‬
‫(‪s.extend‬‬
‫للجزء األكبر‬
‫‪ s += t‬أو‪t) ‬‬
‫‪s[len(s):len(s)] ‬نفس‪) ‬‬
‫‪= t‬‬

‫مع تكرار ‪ s ‬تحديثات‬


‫‪s *= n‬‬ ‫)‪(6‬‬
‫مرة‪ n ‬محتوياتها‬

‫في ‪ s ‬في‪ x ‬يُدرج‬
‫‪s.insert(i, ‬‬ ‫الفهرس المعطى‬
‫)‪x‬‬ ‫‪ )s[i:i] = ‬مثل(‪ i ‬بواسطة‬
‫]‪[x‬‬

‫‪ ‬أو‪s.pop() ‬‬ ‫يسترد العنصر‬


‫)‪(2‬‬
‫)‪s.pop(i‬‬ ‫‪ s‬ويزيله أيضً ا من‪ i ‬في‬

‫‪s.remove‬‬ ‫إزالة العنصر األول‬


‫)‪(3‬‬
‫)‪(x‬‬ ‫‪ x‬يساوي]‪ s[i‬حيث‪ s ‬من‬

‫(‪s.reverse‬‬ ‫في ‪ s ‬يعكس عناصر‬


‫)‪(4‬‬
‫)‬ ‫مكانها‪L‬‬

‫‪:‬ملحوظات‬

‫‪.‬بنفس طول الشريحة التي يتم استبدالها‪ t ‬يجب أن يكون لـ ‪1.‬‬

‫‪.‬وسيطة اختيارية‪ ‬ط‪ ‬االفتراضي‪ ،1- ‬بحيث افتراضيا يتم إزالة العنصر األخير وعاد ‪2.‬‬

‫‪Pg. 185‬‬
‫‪ s .‬في‪ x ‬عندما‪ ‬ال توجد‪ ValueError‬يزيد)(‪3. remove‬‬

‫الطريقة بتعديل التسلسل المطبق لتوفير المساحة عند عكس تسلسل كبير‪ .‬لتذكير المستخدمين بأنه يعمل )(‪ reverse‬تقوم ‪4.‬‬
‫‪.‬من خالل التأثير الجانبي ‪ ،‬فإنه ال يقوم بإرجاع التسلسل المعكوس‬

‫‪ dict‬مثل( ترد على االتساق مع واجهات حاويات قابلة للتغيير التي ال تدعم عمليات التقطيع)(‪ copy‬و)(‪5. clear‬‬
‫ولكن معظم فئات التسلسل المتغير ‪ collections.abc.MutableSequenceABC ،‬ليس جزءًا من)(‪ set). copy‬و‬
‫‪.‬الملموس توفره‬

‫‪.‬األساليب)(‪ copy‬و‪:clear() ‬في اإلصدار الجديد ‪3.3‬‬

‫التسلسل‪ .‬ال يتم نسخ ‪ n ‬تمسح‪ ‬القيم الصفرية والسالبة لـ‪ __index__(). ‬هي عدد صحيح ‪ ،‬أو كائن مطبق‪ n ‬القيمة ‪6.‬‬
‫‪ .s * n‬العناصر الموجودة في التسلسل ؛‪ ‬يتم الرجوع إليها عدة مرات‪ ،‬كما هو موضح في‪ ‬إطار‪ ‬عمليات تسلسل المشتركة‬

‫‪Lists‬‬

‫القوائم عبارة عن تسلسالت قابلة للتغيير ‪ُ ،‬تستخدم عاد ًة لتخزين مجموعات من العناصر المتجانسة (حيث تختلف درجة التشابه‬
‫‪.‬الدقيقة حسب‪ L‬التطبيق)‬

‫‪ ] ) ‬متكرر ‪ list( [ ‬فئة‬

‫‪:‬يمكن إنشاء القوائم بعدة طرق‬

‫‪‬‬ ‫][‪: ‬استخدام زوج من األقواس المربعة للداللة على القائمة الفارغة‬

‫‪‬‬ ‫]‪: [a]،[a, b, c‬باستخدام األقواس المربعة‪ ،‬وفصل العناصر بفواصل‬

‫‪‬‬ ‫]‪: [x for x in iterable‬استخدام قائمة الفهم‬

‫‪‬‬ ‫)‪list(iterable‬أو)(‪: list‬باستخدام مُنشئ النوع‬

‫قد يكون إما التسلسل‪ ،‬حاوية التي تدعم ‪ . iterable ‬يُنشئ المُنشئ قائمة عناصرها هي نفسها وبنفس ترتيب‪ ‬العناصر القابلة‪ ‬للتكرار‬
‫على سبيل ‪ iterable[:]. ‬التكرار‪ ،‬أو كائن مكرر‪ .‬إذا كان‪ ‬التكرار‪ ‬عبارة عن قائمة بالفعل ‪ ،‬فسيتم‪ ‬عمل نسخة وإعادتها ‪ ،‬على غرار‬
‫‪ ، .‬العائدات‪ ‬و‪ ‬العائدات‪  . ‬إذا لم يتم تقديم أي وسيطة ‪ ،‬يقوم المنشئ بإنشاء قائمة فارغة جديدة)'‪، list('abc‬المثال‬
‫][]‪['a', 'b', 'c']list( (1, 2, 3) )[1, 2, 3‬‬

‫‪.‬المضمنة‪ sorted() ‬تنتج العديد من العمليات األخرى أي ً‬


‫ضا قوائم ‪ ،‬بما في ذلك‬

‫‪:‬قوائم تنفيذ كل من‪ ‬القواسم المشتركة‪ ‬و‪ ‬قابلة للتغيير‪ ‬عمليات التسلسل‪ .‬توفر القوائم أي ً‬


‫ضا الطريقة اإلضافية التالية‬

‫‪ ) ‬مفتاح‪  =  ‬ال يوجد‪ ، ‬عكس‪  =  ‬خطأ ‪sort( * ، ‬‬

‫تقوم هذه الطريقة بفرز القائمة في مكانها ‪ ،‬باستخدام‪< ‬المقارنات بين العناصر‪ ‬فقط‪ . ‬ال يتم منع االستثناءات ‪ -‬في حالة فشل أي‬
‫‪.‬عمليات مقارنة ‪ ،‬ستفشل عملية الفرز بالكامل (ومن المحتمل أن ُتترك القائمة في حالة معدلة جزئيًا)‬

‫‪:‬يقبل وسيطتين ال يمكن تمريرهما إال من خالل الكلمات‪ L‬الرئيسية (‪ ‬وسيطات الكلمات الرئيسية فقط‪sort()) ‬‬

‫على سبيل ( يحدد‪ ‬المفتاح‪ ‬دالة من وسيطة واحدة ُتستخدم الستخراج مفتاح مقارنة من كل عنصر قائمة‪L‬‬
‫يتم حساب المفتاح المقابل لكل عنصر في القائمة مرة واحدة ثم يتم استخدامه لعملية الفرز ‪ ، key=str.lower). ‬المثال‬
‫‪.‬تعني‪ ‬القيمة االفتراضية لـ‪ ‬أنه يتم فرز عناصر القائمة مباشر ًة دون حساب قيمة مفتاح منفصلة‪. None ‬بأكملها‬

‫‪.‬وظيفة ل‪ ‬مفتاح‪ ‬وظيفة‪.x CMP ‬تتوفر األداة المساعدة لتحويل أسلوب اإلصدار ‪ functools.cmp_to_key()2‬و‬

‫‪.‬فسيتم فرز عناصر القائمة كما لو تم عكس كل مقارنة ‪ True،‬العكس‪ ‬هو قيمة منطقية‪ .‬إذا تم التعيين على‬

‫تقوم هذه الطريقة بتعديل التسلسل في المكان لتوفير المساحة عند فرز تسلسل كبير‪ .‬لتذكير المستخدمين بأنه يعمل من خالل التأثير‬
‫‪).‬لطلب نسخة قائمة تم فرزها بشكل صريح)(‪ sorted‬استخدمه( الجانبي ‪ ،‬فإنه ال يقوم بإرجاع التسلسل الذي تم فرزه‬

‫‪Pg. 186‬‬
‫مكفول طريقة لتكون مستقرة‪ .‬يكون الفرز مستقرً ا إذا كان يضمن عدم تغيير الترتيب النسبي للعناصر التي تقارن متساوية ‪ sort()-‬و‬
‫‪.‬وهذا مفيد للفرز في عدة ممرات (على سبيل المثال ‪ ،‬الفرز حسب القسم ‪ ،‬ثم حسب درجة الراتب)‬

‫‪ .‬للحصول على أمثلة حول الفرز ودورة تعليمية موجزة عن الفرز ‪ ،‬راجع‪ ‬فرز كيفية‬

‫أثناء فرز القائمة ‪ ،‬يكون تأثير محاولة تغيير القائمة ‪ ،‬أو حتى فحصها ‪ ،‬غير محدد‪ .‬يؤدي تطبيق لغة ‪ CPython: ‬تفاصيل تنفيذ‬
‫ما إذا كان بإمكانه اكتشاف أن القائمة قد تم ‪ ValueError‬البرمجة بلغة لغة البايثون إلى ظهور القائمة فارغة طوال المدة ‪ ،‬ويزيد‬
‫‪.‬تغييرها أثناء عملية الفرز‬

‫‪Tuples‬‬

‫التي ‪-tuples‬مثل ‪ (2‬عبارة عن تسلسالت غير قابلة للتغيير ‪ُ ،‬تستخدم عاد ًة لتخزين مجموعات من البيانات غير المتجانسة ‪Tuples‬‬
‫ضا في الحاالت التي تتطلب تسلساًل غير قابل للتغيير من البيانات المتجانسة ‪ُ Tuples‬تستخدم‪). ‬المدمج في‪ enumerate() ‬ينتجها‬
‫أي ً‬
‫‪).‬مثيل‪ dict‬أو‪ set‬مثل السماح بالتخزين في‪ ‬مثيل(‬

‫‪ ] ) ‬متكرر ‪ tuple( [ ‬فئة‬

‫‪:‬يمكن إنشاء المجموعات بعدة طرق‬

‫‪‬‬ ‫)(‪: ‬استخدام زوج من األقواس لإلشارة إلى المجموعة الفارغة‬

‫‪‬‬ ‫)‪(a,‬أو‪: a,‬استخدام فاصلة الحقة لمجموعة مفرد‬

‫‪‬‬ ‫)‪a, b, c(a, b, c‬فصل العناصر بفواصل‪ :‬أو‬

‫‪‬‬ ‫)‪tuple(iterable‬أو)(‪: tuple‬المدمج في)(‪ tuple‬باستخدام‬

‫قد يكون إما التسلسل‪ ،‬حاوية التي تدعم ‪ُ  . iterable ‬تنشئ المُنشئ مجموعة عناصرها متطابقة وبنفس ترتيب‪ ‬العناصر القابلة‪ ‬للتكرار‬
‫بالفعل ‪ ،‬فسيتم إرجاعها دون تغيير‪ .‬على سبيل ‪ tuple‬التكرار‪ ،‬أو كائن مكرر‪ .‬إذا كان‪ ‬التكراري‪ ‬عبارة عن بنية‬
‫‪ ، .‬العائدات‪ ‬و‪ ‬العائدات‪  . ‬إذا لم يتم تقديم أي وسيطة ‪ ،‬يقوم المنشئ بإنشاء مجموعة فارغة جديدة)'‪، tuple('abc‬المثال‬
‫)()‪('a', 'b', 'c')tuple( [1, 2, 3] )(1, 2, 3‬‬

‫الحظ أن الفاصلة هي التي تصنع الصف ‪ ،‬وليس األقواس‪  .‬األقواس اختيارية ‪ ،‬باستثناء حالة الصف الفارغة ‪ ،‬أو عندما تكون‬
‫‪-tuple‬ضرورية لتجنب الغموض النحوي‪ .‬على سبيل المثال ‪ ،‬هو استدعاء دالة مع ثالث وسيطات ‪ ،‬بينما‪ ‬هو استدعاء دالة مع ‪3‬‬
‫))‪.f(a, b, c)f((a, b, c‬كوسيطة وحيدة‬

‫‪ .‬بتنفيذ جميع‪ ‬عمليات التسلسل‪ ‬الشائعة ‪ Tuples‬يقوم‬

‫بالنسبة للمجموعات غير المتجانسة من البيانات حيث يكون الوصول باالسم أكثر وضوحً ا من الوصول عن طريق‬
‫‪.‬بسيط ‪ tuple‬فقد يكون اختيارً ا أكثر مالءمة من كائن)(‪ ، collections.namedtuple‬الفهرس‬

‫‪Ranges‬‬

‫‪.‬الحلقات‪ for ‬يمثل نوع غير قابل للتغيير تسلسل األرقام ويستخدم عادة لحلقات عددا محددا من المرات في‪ range‬و‬

‫‪ ) ‬توقف ‪ range( ‬فئة‬

‫)‪ ‬ابدأ‪ ، ‬توقف‪ ، [  ‬خطوة‪ range( ]  ‬فئة‬

‫إذا‪ ‬تم ‪). ‬الطريقة الخاصة__‪ __index‬أو أي كائن يقوم بتنفيذ‪ int‬إما‪ ‬مضمنة( يجب أن تكون وسيطات مُنشئ النطاق أعدا ًدا صحيحة‬
‫حذف وسيطة‪ ‬الخطوة ‪ ،‬يتم تعيينها افتراضيًا على‪ .1 ‬إذا‪ ‬تم حذف وسيطة‪ ‬البداية‪ ، ‬فسيتم تعيينها افتراضيًا على‪ .0 ‬إذا‬
‫‪.‬يتم رفعها‪ ، ValueError‬كانت‪ ‬الخطوة‪ ‬صفر‬

‫‪ .r[i] = start + step*ii >= 0r[i] < stop‬يتم تحديد‪ ‬محتويات النطاق‪ ‬بواسطة الصيغة‪ ‬حيث‪ ‬و‪ ، r‬للخطوة‪ ‬اإليجابية‬

‫‪ .r[i] = start + step*ii >= 0r[i] > stop‬بالنسبة‪ ‬لخطوة‪ ‬سالبة‪ ، ‬ال تزال محتويات النطاق تحددها الصيغة‪ ، ‬لكن القيود هي‪ ‬و‬

‫‪Pg. 187‬‬
‫لم يفي بقيد القيمة‪ .‬تدعم النطاقات‪ L‬المؤشرات السلبية ‪ ،‬ولكن يتم تفسيرها على أنها فهرسة‪ L‬من ]‪ r[0‬سيكون كائن النطاق فار ًغا إذا‬
‫‪.‬نهاية التسلسل الذي تحدده المؤشرات اإليجابية‬

‫قد ترتفع‪ ‬بعض الميزات )(‪ len‬هو مسموح به ولكن‪ sys.maxsize‬النطاقات‪ L‬التي تحتوي على قيم مطلقة أكبر مما‬
‫‪( OverflowError.‬مثل‪) ‬‬

‫‪:‬أمثلة النطاق‬

‫>>>‬

‫))‪>>> list(range(10‬‬

‫]‪[0, 1, 2, 3, 4, 5, 6, 7, 8, 9‬‬

‫))‪>>> list(range(1, 11‬‬

‫]‪[1, 2, 3, 4, 5, 6, 7, 8, 9, 10‬‬

‫))‪>>> list(range(0, 30, 5‬‬

‫]‪[0, 5, 10, 15, 20, 25‬‬

‫))‪>>> list(range(0, 10, 3‬‬

‫]‪[0, 3, 6, 9‬‬

‫))‪>>> list(range(0, -10, -1‬‬

‫]‪[0, -1, -2, -3, -4, -5, -6, -7, -8, -9‬‬

‫))‪>>> list(range(0‬‬

‫][‬

‫))‪>>> list(range(1, 0‬‬

‫][‬

‫تقوم النطاقات‪ L‬بتنفيذ جميع‪ ‬عمليات التسلسل‪ ‬الشائعة‪ ‬باستثناء التسلسل والتكرار (نظرً ا لحقيقة أن كائنات النطاق ال يمكنها إال تمثيل‬
‫نمطا صار ًما ‪ ،‬وعادة ما ينتهك التكرار والتسلسل هذا النمط)‬‫‪.‬التسلسالت التي تتبع ً‬

‫‪start‬‬

‫قيمة‪ ‬معلمة‪ ‬البدء‪( ‬أو‪0 ‬إذا لم يتم توفير المعلمة)‬

‫‪stop‬‬

‫قيمة‪ ‬معلمة‪ ‬اإليقاف‬

‫‪step‬‬

‫قيمة‪ ‬معلمة‪ ‬الخطوة‪( ‬أو‪1 ‬إذا لم يتم توفير المعلمة)‬

‫الكائن سوف تتخذ دائما نفس المبلغ (صغير) من الذاكرة‪ ،‬ال ‪ range‬هي أن‪ tuple‬أو‪ list‬نوع أكثر من العادية‪ range‬االستفادة من‬
‫‪).‬الفردية بحاجة ‪subranges‬القيم‪ ،‬وحساب العناصر و‪ step‬و‪ start، stop‬كما أنه يخزن فقط( يهم حجم مجموعة أنها تمثل‬

‫وتوفر ميزات مثل اختبارات االحتواء ‪ ،‬والبحث عن فهرس العناصر ‪ collections.abc.SequenceABC ، ،‬تنفذ كائنات النطاق‬
‫‪:‬والتقطيع ‪ ،‬ودعم الفهارس السالبة (انظر‪ ‬أنواع التسلسل ‪ -‬القائمة ‪ ،‬والصف ‪ ،‬والنطاق‪) ‬‬

‫>>>‬

‫‪Pg. 188‬‬
‫)‪>>> r = range(0, 20, 2‬‬

‫‪>>> r‬‬

‫)‪range(0, 20, 2‬‬

‫‪>>> 11 in r‬‬

‫‪False‬‬

‫‪>>> 10 in r‬‬

‫‪True‬‬

‫)‪>>> r.index(10‬‬

‫‪5‬‬

‫]‪>>> r[5‬‬

‫‪10‬‬

‫]‪>>> r[:5‬‬

‫)‪range(0, 10, 2‬‬

‫]‪>>> r[-1‬‬

‫‪18‬‬

‫مجموعة اختبار األجسام من أجل المساواة مع‪== ‬و‪=! ‬مقارنتها حسب تسلسل‪ .‬أي أن كائني النطاق يعتبران متساويين إذا كانا يمثالن‬
‫الصفات‪ ،‬وعلى سبيل المثال ‪ step‬و‪ start، stop‬الحظ أن كائنين النطاق الذي يساوي مقارنة قد يكون مختلفا(‪. ‬نفس تسلسل القيم‬
‫)‪  ).range(0) == range(2, 1, 3)range(0, 3, 2) == range(0, 4, 2‬أو‬

‫العناصر للعضوية في وقت ثابت بدالً‪ int‬دعم التقطيع والمؤشرات السلبية‪ .‬اختبار‪ ABC. ‬تم التغيير في اإلصدار ‪ :3.2‬تنفيذ التسلسل‬
‫‪.‬من التكرار بين جميع العناصر‬

‫تم التغيير في اإلصدار ‪ :3.3‬حدد '==' و '! =' لمقارنة كائنات النطاق بنا ًء على تسلسل القيم التي تحددها (بدالً من المقارنة بنا ًء‬
‫‪.‬على هوية الكائن)‬

‫‪: The start، stopand step attributes.‬الجديد في اإلصدار ‪3.3‬‬

‫أنظر أيضا‬

‫‪‬‬ ‫‪.‬يبين كيفية تنفيذ نسخة كسول من مجموعة مناسبة لتطبيقات النقاط العائمة‪ linspace ‬و‪ ‬صفة‬

‫‪ - str‬نوع تسلسل النص‬

‫تتم ‪ Unicode. ‬كائنات أو‪ ‬سالسل‪ . ‬السالسل هي‪ ‬متواليات‪ ‬ثابتة‪ ‬لنقاط كود‪ str‬باستخدام ‪ Python‬يتم التعامل مع البيانات النصية في‬
‫‪:‬كتابة السالسل الحرفية بعدة طرق‬

‫‪‬‬ ‫'‪: 'allows embedded "double" quotes‬ونقلت واحدة‬

‫‪‬‬ ‫"‪: ."allows embedded 'single' quotes‬عالمات االقتباس المزدوجة‬

‫‪‬‬ ‫"""‪: ،'''Three single quotes'''"""Three double quotes‬الثالثي المقتبس‬

‫قد تمتد السالسل الثالثية بين عالمات االقتباس على عدة أسطر ‪ -‬سيتم تضمين جميع المسافات البيضاء المرتبطة في السلسلة‬
‫‪.‬الحرفية‬

‫‪Pg. 189‬‬
‫سيتم تحويل القيم الحرفية للسلسلة التي تعد جز ًء ا من تعبير واحد والتي تحتوي على مسافة بيضاء فقط ضم ًنا إلى سلسلة حرفية‬
‫هذا هو‬ .‫واحدة‬ .("spam " "eggs") == "spam eggs"

‫راجع‬ String and Bytes literals  ‫ بما في ذلك تسلسالت الهروب‬، ‫لمزيد من المعلومات حول األشكال المختلفة للسلسلة الحرفية‬
‫ المدعومة‬، r‫"( والبادئة‬raw") ‫التي تعطل معظم معالجة تسلسل الهروب‬.

ً ‫يمكن أي‬ str ‫الباني‬.
‫ضا إنشاء سالسل من كائنات أخرى باستخدام‬

‫ أي للسلسلة غير‬.1 ‫ تؤدي فهرسة سلسلة نصية إلى إنتاج سالسل بطول‬، ‫نظرً ا لعدم وجود نوع "حرف" منفصل‬
‫الفارغة‬ s ، .s[0] == s[0:1]

There is also no mutable string type, but str.join() or io.StringIO can be used to efficiently construct


strings from multiple fragments.

Changed in version 3.3:  For backwards compatibility with the Python 2 series, the u prefix is once
again permitted on string literals. It has no effect on the meaning of string literals and cannot be
combined with the r prefix.

class  str(object='')

class  str(object=b'', encoding='utf-8', errors='strict')

Return a string version of object. If object is not provided, returns the empty string. Otherwise, the
behavior of str() depends on whether encoding or errors is given, as follows.

If neither encoding nor errors is given, str(object) returns object.__str__(), which is the “informal” or


nicely printable string representation of object. For string objects, this is the string itself.
If object does not have a __str__() method, then str() falls back to returning repr(object).

If at least one of encoding or errors is given, object should be a bytes-like


object (e.g. bytes or bytearray). In this case, if object is a bytes (or bytearray) object,
then str(bytes, encoding, errors) is equivalent to bytes.decode(encoding, errors). Otherwise, the
bytes object underlying the buffer object is obtained before calling bytes.decode(). See Binary
Sequence Types — bytes, bytearray, memoryview and Buffer Protocol for information on buffer
objects.

Passing a bytes object to str() without the encoding or errors arguments falls under the first case of


returning the informal string representation (see also the -b command-line option to Python). For
example:

>>>

>>> str(b'Zoot!')

"b'Zoot!'"

For more information on the str class and its methods, see Text Sequence Type — str and the String
Methods section below. To output formatted strings, see the Formatted string literals and Format
String Syntax sections. In addition, see the Text Processing Services section.

String Methods

Strings implement all of the common sequence operations, along with the additional methods
described below.

Pg. 190
Strings also support two styles of string formatting, one providing a large degree of flexibility and
customization (see str.format(), Format String Syntax and Custom String Formatting) and the other
based on C printf style formatting that handles a narrower range of types and is slightly harder to use
correctly, but is often faster for the cases it can handle (printf-style String Formatting).

The Text Processing Services section of the standard library covers a number of other modules that
provide various text related utilities (including regular expression support in the re module).

str.capitalize()

Return a copy of the string with its first character capitalized and the rest lowercased.

Changed in version 3.8:  The first character is now put into titlecase rather than uppercase. This
means that characters like digraphs will only have their first letter capitalized, instead of the full
character.

str.casefold()

Return a casefolded copy of the string. Casefolded strings may be used for caseless matching.

Casefolding is similar to lowercasing but more aggressive because it is intended to remove all case
distinctions in a string. For example, the German lowercase letter 'ß' is equivalent to "ss". Since it is
already lowercase, lower() would do nothing to 'ß'; casefold() converts it to "ss".

The casefolding algorithm is described in section 3.13 of the Unicode Standard.

New in version 3.3.

str.center(width[, fillchar])

Return centered in a string of length width. Padding is done using the specified fillchar (default is an


ASCII space). The original string is returned if width is less than or equal to len(s).

str.count(sub[, start[, end]])

Return the number of non-overlapping occurrences of substring sub in the range [start, end].


Optional arguments start and end are interpreted as in slice notation.

str.encode(encoding='utf-8', errors='strict')

Return an encoded version of the string as a bytes object. Default encoding is 'utf-8'. errors may be
given to set a different error handling scheme. The default for errors is 'strict', meaning that encoding
errors raise a UnicodeError. Other possible values
are 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' and any other name registered
via codecs.register_error(), see section Error Handlers. For a list of possible encodings, see
section Standard Encodings.

By default, the errors argument is not checked for best performances, but only used at the first
encoding error. Enable the Python Development Mode, or use a debug build to check errors.

Changed in version 3.1:  Support for keyword arguments added.

Changed in version 3.9:  The errors is now checked in development mode and in debug mode.

str.endswith(suffix[, start[, end]])

Pg. 191
Return True if the string ends with the specified suffix, otherwise return False. suffix can also be a
tuple of suffixes to look for. With optional start, test beginning at that position. With optional end,
stop comparing at that position.

str.expandtabs(tabsize=8)

Return a copy of the string where all tab characters are replaced by one or more spaces, depending
on the current column and the given tab size. Tab positions occur every tabsize characters (default is
8, giving tab positions at columns 0, 8, 16 and so on). To expand the string, the current column is set
to zero and the string is examined character by character. If the character is a tab (\t), one or more
space characters are inserted in the result until the current column is equal to the next tab position.
(The tab character itself is not copied.) If the character is a newline (\n) or return (\r), it is copied and
the current column is reset to zero. Any other character is copied unchanged and the current column
is incremented by one regardless of how the character is represented when printed.

>>>

>>> '01\t012\t0123\t01234'.expandtabs()

'01 012 0123 01234'

>>> '01\t012\t0123\t01234'.expandtabs(4)

'01 012 0123 01234'

str.find(sub[, start[, end]])

Return the lowest index in the string where substring sub is found within the slice s[start:end].
Optional arguments start and end are interpreted as in slice notation. Return -1 if sub is not found.

Note

The find() method should be used only if you need to know the position of sub. To check if sub is a
substring or not, use the in operator:

>>>

>>> 'Py' in 'Python'

True

str.format(*args, **kwargs)

Perform a string formatting operation. The string on which this method is called can contain literal
text or replacement fields delimited by braces {}. Each replacement field contains either the numeric
index of a positional argument, or the name of a keyword argument. Returns a copy of the string
where each replacement field is replaced with the string value of the corresponding argument.

>>>

>>> "The sum of 1 + 2 is {0}".format(1+2)

'The sum of 1 + 2 is 3'

Pg. 192
‫‪See Format String Syntax for a description of the various formatting options that can be specified in‬‬
‫‪format strings.‬‬

‫‪Note‬‬

‫‪ ‬‬

‫وظيفة ))‪: '{:n}'.format(1234‬مثال( نوع‪ n‬مع )والفئات الفرعية‪ ( int، float، complex، decimal.Decimal‬عند تنسيق عدد‬


‫إذا )(‪ localeconv‬مجاالت‪ thousands_sep‬و‪ decimal_point‬لغة إلى فك‪ LC_NUMERIC‬لغة إلى‪ LC_CTYPE‬يحدد مؤقتا‬
‫اللغة‪ .‬يؤثر هذا التغيير المؤقت على ‪ LC_CTYPE‬لغة مختلفة من‪ LC_NUMERIC‬أو أطول من ‪ 1‬بايت‪ ،‬و ‪ ASCII‬كانت غير‬
‫‪.‬مؤشرات الترابط األخرى‬

‫اإلعدادات المحلية‪ ‬مؤق ًتا ‪ LC_CTYPE‬بالنوع ‪ ،‬تقوم الوظيفة بتعيين‪ n‬تم التغيير في اإلصدار ‪ :3.7‬عند تنسيق رقم‬
‫‪.‬المحلية في بعض الحاالت‪ LC_NUMERIC‬إلى‪ ‬اإلعدادات‬

‫‪ ) ‬رسم الخرائط ‪str.format_map( ‬‬

‫هذا مفيد إذا ‪ dict. ‬يتم استخدامه مباشرة وال يتم نسخه إلى ملف‪ mapping‬باستثناء ما ‪ str.format(**mapping)،‬على غرار‬
‫‪:‬فئة فرعية ديكت‪ mapping‬كانت على سبيل المثال‬

‫>>>‬

‫‪>>> class Default(dict):‬‬

‫‪...‬‬ ‫‪def __missing__(self, key):‬‬

‫‪...‬‬ ‫‪return key‬‬

‫‪...‬‬

‫))'‪>>> '{name} was born in {country}'.format_map(Default(name='Guido‬‬

‫'‪'Guido was born in country‬‬

‫الجديد في اإلصدار ‪3.2.1‬‬

‫‪str.index( sub  [ ، start  [ ، end  ] ] ) ‬‬

‫‪.‬عندما ال يتم العثور على السلسلة الفرعية‪ ValueError‬ولكن رفع ‪ find()،‬مثل‬

‫)(‪str.isalnum‬‬

‫وإال‪ .‬يكون ‪ ، False‬إذا كانت جميع األحرف في السلسلة أبجدية رقمية وكان هناك حرف واحد على األقل‪ True‬قم باإلرجاع‬
‫‪ c.isnumeric().‬أو ‪ True: c.isalpha()، c.isdecimal()، c.isdigit()،‬أبجديًا رقميًا إذا تم إرجاع أحد العناصر التالية‪ c‬الحرف‬

‫)(‪str.isalpha‬‬

‫وإال‪ .‬األحرف األبجدية ‪ ، False‬إذا كانت جميع األحرف في السلسلة أبجدية وكان هناك حرف واحد على األقل‪ True‬قم باإلرجاع‬
‫أو "‪ "Lm‬أي تلك التي لها خاصية فئة عامة هي ‪ "Letter" ،‬على أنها ‪ Unicode‬هي تلك األحرف المحددة في قاعدة بيانات أحرف‬
‫‪ Unicode.‬الحظ أن هذا يختلف عن الخاصية "األبجدية" المحددة في معيار‪ "Lo". ‬أو "‪ "Ll‬أو "‪ "Lu‬أو "‪"Lt‬‬

‫)(‪str.isascii‬‬

‫على نقاط ‪ ASCII‬وإال‪ .‬تحتوي أحرف‪ ASCII ، False‬إذا كانت السلسلة فارغة أو كانت جميع األحرف في السلسلة‪ True‬قم باإلرجاع‬
‫‪ U + 0000-U + 007F.‬رمز في النطاق‬

‫الجديد في اإلصدار ‪3.7.1‬‬

‫)(‪str.isdecimal‬‬

‫‪Pg. 193‬‬
‫العودة‬ True‫ إذا كانت جميع األحرف في السلسلة أحرف عشرية وكان هناك حرف واحد على األقل‬، False  ‫األحرف العشرية‬ .‫وإال‬
‫ على سبيل المثال‬، 10 ‫ هي تلك التي يمكن استخدامها لتكوين األرقام في األساس‬U + 0660 ، ARABIC-INDIC DIGIT
ZERO. ‫ الحرف العشري رسميًا هو حرف في فئة‬Unicode ‫" العامة‬Nd".

str.isdigit()

‫قم باإلرجاع‬ True‫ وكان هناك حرف واحد على األقل‬L‫ إذا كانت جميع األحرف في السلسلة أرقا ًما‬، False‫تتضمن األرقام أحر ًفا‬ .‫وإال‬
‫ يغطي هذا األرقام التي ال يمكن استخدامها لتكوين أرقام‬ .‫ مثل األرقام المرتفعة المتوافقة‬، ‫ عشرية تحتاج إلى معالجة خاصة‬L‫وأرقا ًما‬
‫ الرقم هو حرف له قيمة الخاصية‬، ‫بشكل رسمي‬ .‫ مثل أرقام الخروستي‬، 10 ‫ في األساس‬Numeric_Type = Digit ‫أو‬
Numeric_Type = Decimal.

str.isidentifier()

‫قم باإلرجاع‬ True‫والكلمات الرئيسية‬ ‫إذا كانت السلسلة معر ًفا صالحً ا وف ًقا لتعريف اللغة ومعرفات القسم‬ .
ً
‫استدعاء‬ keyword.iskeyword()‫الختبار ما إذا كانت السلسلة‬ s‫ مثل‬، ‫محجوزا‬ ‫معرّ ًفا‬ def‫و‬ class.

‫مثال‬:

>>>

>>> from keyword import iskeyword

>>> 'hello'.isidentifier(), iskeyword('hello')

True, False

>>> 'def'.isidentifier(), iskeyword('def')

True, True

str.islower()

‫قم باإلرجاع‬ True‫في السلسلة صغيرة وكان هناك حرف واحد على األقل مغلف‬ 4 ‫ إذا كانت جميع األحرف المغطاة‬، False‫وإال‬.

str.isnumeric()

Return True if all characters in the string are numeric characters, and there is at least one
character, False otherwise. Numeric characters include digit characters, and all characters that have
the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION ONE FIFTH. Formally, numeric
characters are those with the property value Numeric_Type=Digit, Numeric_Type=Decimal or
Numeric_Type=Numeric.

str.isprintable()

Return True if all characters in the string are printable or the string is empty, False otherwise.
Nonprintable characters are those characters defined in the Unicode character database as “Other”
or “Separator”, excepting the ASCII space (0x20) which is considered printable. (Note that printable
characters in this context are those which should not be escaped when repr() is invoked on a string. It
has no bearing on the handling of strings written to sys.stdout or sys.stderr.)

str.isspace()

Return True if there are only whitespace characters in the string and there is at least one
character, False otherwise.

Pg. 194
‫أو ‪")،‬فاصل والفضاء" (‪ Zs ‬إما الفئة العامة هي ‪ unicodedata)،‬انظر( ‪ Unicode‬حرف غير‪ ‬بيضاء‪ ‬إذا في قاعدة البيانات حرف‬
‫‪ S.‬أو‪ WS، B‬فئتها ثنائية االتجاه هي واحدة من‬

‫)(‪str.istitle‬‬

‫باإلرجاع إذا كانت السلسلة عبارة عن سلسلة مكتوبة بالعناوين وكان هناك حرف واحد على األقل ‪ ،‬على سبيل المثال ‪ ،‬قد ‪ True‬قم‬
‫‪.‬خالف ذلك‪  False‬تتبع األحرف الكبيرة فقط األحرف غير المسماة واألحرف الصغيرة فقط ذات األحرف الصغيرة‪ .‬العودة‬

‫)(‪str.isupper‬‬

‫‪.‬وإال‪ ، False‬إذا كانت جميع األحرف المغطاة‪ 4 ‬في السلسلة كبيرة وكان هناك حرف مغطى واحد على األقل‪ True‬قم باإلرجاع‬

‫>>>‬

‫)(‪>>> 'BANANA'.isupper‬‬

‫‪True‬‬

‫)(‪>>> 'banana'.isupper‬‬

‫‪False‬‬

‫)(‪>>> 'baNana'.isupper‬‬

‫‪False‬‬

‫)(‪>>> ' '.isupper‬‬

‫‪False‬‬

‫‪ ) ‬متكرر ‪str.join( ‬‬

‫إذا كان هناك أي قيم غير سلسلة في‪ ‬التكرار‪ A  ، ‬سيتم رفع‪ . TypeError‬إرجاع سلسلة عبارة عن سلسلة من السالسل في‪ ‬التكرار‬
‫‪.‬الكائنات‪ .‬الفاصل بين العناصر هو السلسلة التي توفر هذه الطريقة‪ bytes‬بما في ذلك‬

‫‪ [ ، fillchar  ] ) ‬العرض ‪str.ljust( ‬‬

‫االفتراضي هو مسافة(‪ ‬أعد السلسلة إلى اليسار مضبوطة في سلسلة طولها‪ ‬عرض‪ . ‬يتم إجراء الحشو باستخدام‪ ‬حرف التعبئة‪ ‬المحدد‬
‫‪ len(s).‬يتم إرجاع السلسلة األصلية إذا كان‪ ‬العرض‪ ‬أقل من أو يساوي‪ASCII). ‬‬

‫)(‪str.lower‬‬

‫‪.‬قم بإعادة نسخة من السلسلة مع تحويل جميع األحرف المغطاة‪ 4 ‬إلى أحرف صغيرة‬

‫‪ Unicode.‬تم وصف خوارزمية الغالف السفلي المستخدمة‪ L‬في القسم ‪ 3.13‬من معيار‬

‫‪ ] ) ‬حرف ‪str.lstrip( [ ‬‬

‫إعادة نسخة من السلسلة مع إزالة األحرف البادئة‪ .‬و‪ ‬حرف‪ ‬الحجة هي سلسلة تحديد مجموعة من األحرف المراد إزالتها‪ .‬إذا تم حذف‬
‫بشكل‪ ‬افتراضي على إزالة المسافة البيضاء‪ .‬و‪ ‬حرف‪ ‬الحجة ليست بادئة‪ .‬بدالً من ذلك ‪ ،‬يتم ‪ chars‬يتم تعيين‪ ‬وسيطة ‪ None،‬أو‬
‫‪:‬تجريد جميع مجموعات قيمها‬

‫>>>‬

‫)(‪>>> ' spacious '.lstrip‬‬

‫' ‪'spacious‬‬

‫)'‪>>> 'www.example.com'.lstrip('cmowz.‬‬

‫‪Pg. 195‬‬
'example.com'

‫ابحث‬ str.removeprefix()‫على سبيل المثال‬ .‫عن طريقة تزيل سلسلة بادئة واحدة بدالً من كل مجموعة من األحرف‬:

>>>

>>> 'Arthur: three!'.lstrip('Arthur: ')

'ee!'

>>> 'Arthur: three!'.removeprefix('Arthur: ')

'three!'

‫ثابت‬ str.maketrans( x  [ ، y  [ ، z  ] ] ) 

‫تقوم هذه الطريقة الثابتة بإرجاع جدول ترجمة يمكن استخدامه من أجله‬ str.translate().

‫ فيجب أن تكون قامو ًسا يعين ترتيبي‬، ‫ إذا كانت هناك وسيطة واحدة فقط‬Unicode (‫) )أعداد صحيحة‬1 ‫أو أحرف (سالسل بطول‬
‫ إلى ترتيبي‬Unicode ‫أو سالسل (ذات أطوال عشوائية) أو‬ None. ‫سيتم بعد ذلك تحويل مفاتيح األحرف إلى أرقام ترتيبية‬.

‫ سيتم تعيين كل حرف في‬، ‫ وفي القاموس الناتج‬، ‫ فيجب أن تكونا سالسل متساوية الطول‬، ‫ إذا كان هناك وسيطان‬x ‫إلى الحرف في‬
‫ نفس الموضع في‬y. ‫ سيتم تعيين أحرفها‬، ‫ فيجب أن تكون سلسلة‬، ‫إذا كانت هناك وسيطة ثالثة‬ None‫في النتيجة‬.

str.partition(  ‫سبتمبر‬ ) 

Split the string at the first occurrence of sep, and return a 3-tuple containing the part before the
separator, the separator itself, and the part after the separator. If the separator is not found, return a
3-tuple containing the string itself, followed by two empty strings.

str.removeprefix(prefix, /)

If the string starts with the prefix string, return string[len(prefix):]. Otherwise, return a copy of the
original string:

>>>

>>> 'TestHook'.removeprefix('Test')

'Hook'

>>> 'BaseTestCase'.removeprefix('Test')

'BaseTestCase'

New in version 3.9.

str.removesuffix(suffix, /)

If the string ends with the suffix string and that suffix is not empty, return string[:-len(suffix)].
Otherwise, return a copy of the original string:

>>>

>>> 'MiscTests'.removesuffix('Tests')

'Misc'

>>> 'TmpDirMixin'.removesuffix('Tests')

Pg. 196
'TmpDirMixin'

New in version 3.9.

str.replace(old, new[, count])

Return a copy of the string with all occurrences of substring old replaced by new. If the optional
argument count is given, only the first count occurrences are replaced.

str.rfind(sub[, start[, end]])

Return the highest index in the string where substring sub is found, such that sub is contained
within s[start:end]. Optional arguments start and end are interpreted as in slice notation. Return -
1 on failure.

str.rindex(sub[, start[, end]])

Like rfind() but raises ValueError when the substring sub is not found.

str.rjust(width[, fillchar])

Return the string right justified in a string of length width. Padding is done using the
specified fillchar (default is an ASCII space). The original string is returned if width is less than or
equal to len(s).

str.rpartition(sep)

Split the string at the last occurrence of sep, and return a 3-tuple containing the part before the
separator, the separator itself, and the part after the separator. If the separator is not found, return a
3-tuple containing two empty strings, followed by the string itself.

str.rsplit(sep=None, maxsplit=- 1)

Return a list of the words in the string, using sep as the delimiter string. If maxsplit is given, at
most maxsplit splits are done, the rightmost ones. If sep is not specified or None, any whitespace
string is a separator. Except for splitting from the right, rsplit() behaves like split() which is described
in detail below.

str.rstrip([chars])

Return a copy of the string with trailing characters removed. The chars argument is a string specifying
the set of characters to be removed. If omitted or None, the chars argument defaults to removing
whitespace. The chars argument is not a suffix; rather, all combinations of its values are stripped:

>>>

>>> ' spacious '.rstrip()

' spacious'

>>> 'mississippi'.rstrip('ipz')

'mississ'

See str.removesuffix() for a method that will remove a single suffix string rather than all of a set of
characters. For example:

>>>

Pg. 197
>>> 'Monty Python'.rstrip(' Python')

'M'

>>> 'Monty Python'.removesuffix(' Python')

'Monty'

str.split(sep=None, maxsplit=- 1)

Return a list of the words in the string, using sep as the delimiter string. If maxsplit is given, at
most maxsplit splits are done (thus, the list will have at most maxsplit+1 elements). If maxsplit is not
specified or -1, then there is no limit on the number of splits (all possible splits are made).

If sep is given, consecutive delimiters are not grouped together and are deemed to delimit empty
strings (for example, '1,,2'.split(',') returns ['1', '', '2']). The sep argument may consist of multiple
characters (for example, '1<>2<>3'.split('<>') returns ['1', '2', '3']). Splitting an empty string with a
specified separator returns [''].

For example:

>>>

>>> '1,2,3'.split(',')

['1', '2', '3']

>>> '1,2,3'.split(',', maxsplit=1)

['1', '2,3']

>>> '1,2,,3,'.split(',')

['1', '2', '', '3', '']

If sep is not specified or is None, a different splitting algorithm is applied: runs of consecutive
whitespace are regarded as a single separator, and the result will contain no empty strings at the
start or end if the string has leading or trailing whitespace. Consequently, splitting an empty string or
a string consisting of just whitespace with a None separator returns [].

For example:

>>>

>>> '1 2 3'.split()

['1', '2', '3']

>>> '1 2 3'.split(maxsplit=1)

['1', '2 3']

>>> ' 1 2 3 '.split()

['1', '2', '3']

str.splitlines([keepends])

Pg. 198
Return a list of the lines in the string, breaking at line boundaries. Line breaks are not included in the
resulting list unless keepends is given and true.

This method splits on the following line boundaries. In particular, the boundaries are a superset
of universal newlines.

Representation Description

\n Line Feed

\r Carriage Return

\r\n Carriage Return + Line Feed

\v or \x0b Line Tabulation

\f or \x0c Form Feed

\x1c File Separator

\x1d Group Separator

\x1e Record Separator

\x85 Next Line (C1 Control Code)

\u2028 Line Separator

\u2029 Paragraph Separator

Changed in version 3.2:  \v and \f added to list of line boundaries.

For example:

>>>

>>> 'ab c\n\nde fg\rkl\r\n'.splitlines()

['ab c', '', 'de fg', 'kl']

>>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)

['ab c\n', '\n', 'de fg\r', 'kl\r\n']

Unlike split() when a delimiter string sep is given, this method returns an empty list for the empty
string, and a terminal line break does not result in an extra line:

>>>

>>> "".splitlines()

[]

>>> "One line\n".splitlines()

Pg. 199
['One line']

For comparison, split('\n') gives:

>>>

>>> ''.split('\n')

['']

>>> 'Two lines\n'.split('\n')

['Two lines', '']

str.startswith(prefix[, start[, end]])

Return True if string starts with the prefix, otherwise return False. prefix can also be a tuple of


prefixes to look for. With optional start, test string beginning at that position. With optional end, stop
comparing string at that position.

str.strip([chars])

Return a copy of the string with the leading and trailing characters removed. The chars argument is a
string specifying the set of characters to be removed. If omitted or None, the chars argument
defaults to removing whitespace. The chars argument is not a prefix or suffix; rather, all
combinations of its values are stripped:

>>>

>>> ' spacious '.strip()

'spacious'

>>> 'www.example.com'.strip('cmowz.')

'example'

The outermost leading and trailing chars argument values are stripped from the string. Characters
are removed from the leading end until reaching a string character that is not contained in the set of
characters in chars. A similar action takes place on the trailing end. For example:

>>>

>>> comment_string = '#....... Section 3.2.1 Issue #32 .......'

>>> comment_string.strip('.#! ')

'Section 3.2.1 Issue #32'

str.swapcase()

Return a copy of the string with uppercase characters converted to lowercase and vice versa. Note
that it is not necessarily true that s.swapcase().swapcase() == s.

str.title()

Return a titlecased version of the string where words start with an uppercase character and the
remaining characters are lowercase.

Pg. 200
For example:

>>>

>>> 'Hello world'.title()

'Hello World'

The algorithm uses a simple language-independent definition of a word as groups of consecutive


letters. The definition works in many contexts but it means that apostrophes in contractions and
possessives form word boundaries, which may not be the desired result:

>>>

>>> "they're bill's friends from the UK".title()

"They'Re Bill'S Friends From The Uk"

A workaround for apostrophes can be constructed using regular expressions:

>>>

>>> import re

>>> def titlecase(s):

... return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",

... lambda mo: mo.group(0).capitalize(),

... s)

...

>>> titlecase("they're bill's friends.")

"They're Bill's Friends."

str.translate(table)

Return a copy of the string in which each character has been mapped through the given translation
table. The table must be an object that implements indexing via __getitem__(), typically
a mapping or sequence. When indexed by a Unicode ordinal (an integer), the table object can do any
of the following: return a Unicode ordinal or a string, to map the character to one or more other
characters; return None, to delete the character from the return string; or raise
a LookupError exception, to map the character to itself.

You can use str.maketrans() to create a translation map from character-to-character mappings in


different formats.

See also the codecs module for a more flexible approach to custom character mappings.

str.upper()

Return a copy of the string with all the cased characters 4 converted to uppercase. Note
that s.upper().isupper() might be False if s contains uncased characters or if the Unicode category of
the resulting character(s) is not “Lu” (Letter, uppercase), but e.g. “Lt” (Letter, titlecase).

The uppercasing algorithm used is described in section 3.13 of the Unicode Standard.

Pg. 201
str.zfill(width)

Return a copy of the string left filled with ASCII '0' digits to make a string of length width. A leading
sign prefix ('+'/'-') is handled by inserting the padding after the sign character rather than before. The
original string is returned if width is less than or equal to len(s).

For example:

>>>

>>> "42".zfill(5)

'00042'

>>> "-42".zfill(5)

'-0042'

printf-style String Formatting

Note

The formatting operations described here exhibit a variety of quirks that lead to a number of
common errors (such as failing to display tuples and dictionaries correctly). Using the
newer formatted string literals, the str.format() interface, or template strings may help avoid these
errors. Each of these alternatives provides their own trade-offs and benefits of simplicity, flexibility,
and/or extensibility.

String objects have one unique built-in operation: the % operator (modulo). This is also known as the
string formatting or interpolation operator. Given format % values (where format is a
string), % conversion specifications in format are replaced with zero or more elements of values. The
effect is similar to using the sprintf() in the C language.

If format requires a single argument, values may be a single non-tuple


object. 5 Otherwise, values must be a tuple with exactly the number of items specified by the format
string, or a single mapping object (for example, a dictionary).

A conversion specifier contains two or more characters and has the following components, which
must occur in this order:

1. The '%' character, which marks the start of the specifier.

2. Mapping key (optional), consisting of a parenthesised sequence of characters (for


example, (somename)).

3. Conversion flags (optional), which affect the result of some conversion types.

4. Minimum field width (optional). If specified as an '*' (asterisk), the actual width is read from
the next element of the tuple in values, and the object to convert comes after the minimum
field width and optional precision.

5. Precision (optional), given as a '.' (dot) followed by the precision. If specified as '*' (an


asterisk), the actual precision is read from the next element of the tuple in values, and the
value to convert comes after the precision.

Pg. 202
6. Length modifier (optional).

7. Conversion type.

When the right argument is a dictionary (or other mapping type), then the formats in the
string must include a parenthesised mapping key into that dictionary inserted immediately after
the '%' character. The mapping key selects the value to be formatted from the mapping. For example:

>>>

>>> print('%(language)s has %(number)03d quote types.' %

... {'language': "Python", "number": 2})

Python has 002 quote types.

In this case no * specifiers may occur in a format (since they require a sequential parameter list).

The conversion flag characters are:

ً
‫معدّل الطول‬ ‫( قد يكون‬ h، l‫أو‬ L) ‫ على سبيل المثال‬- ‫ ولكن يتم تجاهله ألنه ليس ضروريًا لبايثون‬، ‫موجودا‬ ، %ld‫مطابق لـ‬ %d.

‫أنواع التحويل هي‬:

Pg. 203
Pg. 204
‫‪:‬ملحوظات‬

‫‪.‬قبل الرقم األول )'‪ ( '0o‬يتسبب النموذج البديل في إدخال محدد ثماني بادئ ‪1.‬‬

‫قبل الرقم )الشكل المستخدم'‪ 'X‬أو'‪ 'x‬اعتما ًدا على ما إذا‪ ‬كان التنسيق('‪X‬أو‪x'0' ‬يؤدي النموذج البديل إلى إدخال بادئة‪2. 0' ‬‬
‫‪.‬األول‬

‫‪.‬يتسبب النموذج البديل في احتواء النتيجة دائمًا على فاصلة عشرية ‪ ،‬حتى لو لم تتبعها أرقام ‪3.‬‬

‫‪.‬تحدد الدقة عدد األرقام بعد الفاصلة العشرية واالفتراضية إلى ‪6‬‬

‫‪.‬يتسبب النموذج البديل في احتواء النتيجة دائ ًم ا على فاصلة عشرية ‪ ،‬وال تتم إزالة األصفار الالحقة كما لو كانت ‪4.‬‬

‫‪ .‬تحدد الدقة عدد األرقام المعنوية قبل وبعد الفاصلة العشرية واالفتراضية إلى ‪6‬‬

‫‪.‬أحرف‪ N‬يتم اقتطاع اإلخراج إلى ‪ N،‬إذا كانت الدقة ‪5.‬‬

‫‪ .‬ارى‪6. 237 ‬‬

‫‪.‬التحويالت ال تفترض أن هذه‪'0\' ‬هي نهاية السلسلة‪ %s‬لها طول واضح ‪ ،‬فإن ‪ Python‬نظرً ا ألن سالسل‬

‫‪.‬بالتحويالت‪ %g‬لم تعد ُتستبدل ‪e50‬تحويالت األرقام التي تزيد قيمتها المطلقة عن ‪:%f 1‬تم التغيير في اإلصدار ‪3.1‬‬

‫‪ - bytes، bytearray، memoryview‬أنواع التسلسل الثنائي‬

‫‪Pg. 205‬‬
‫استخدام‪ ‬بروتوك‪ memoryview‬يتم دعمها من خالل‪ bytearray. ‬و‪ bytes‬األنواع األساسية المضمنة لمعالجة البيانات الثنائية هي‬
‫‪.‬ول المخزن المؤقت‪  ‬للوصول إلى ذاكرة الكائنات الثنائية األخرى دون الحاجة إلى عمل نسخة‬

‫القيم العائمة الدقة ‪ IEEE754‬تدعم وحدة التخزين الفعال من أنواع البيانات األساسية مثل األعداد الصحيحة ‪ 32‬بت و‪ array‬و‬
‫‪.‬المزدوجة‬

‫‪ ‬كائنات بايت‬

‫‪ ASCII‬كائنات البايت هي تسلسالت ثابتة من بايت واحد‪ .‬نظرً ا ألن العديد من البروتوكوالت الثنائية الرئيسية تعتمد على ترميز نص‬
‫ً‬
‫ارتباطا وثي ًقا بكائنات السلسلة ‪ ASCII‬فإن كائنات البايت تقدم عدة طرق صالحة فقط عند العمل مع البيانات المتوافقة مع ‪،‬‬ ‫وترتبط‬
‫‪.‬بعدة طرق أخرى‬

‫‪ ] ) ‬المصدر‪ ، [  ‬ترميز‪ ، [  ‬أخطاء‪ bytes( [ ] ]  ‬فئة‬

‫‪:‬البادئة‪ b‬أوالً ‪ ،‬تكون صيغة البايتات الحرفية هي نفسها إلى حد كبير تلك المستخدمة في السالسل الحرفية ‪ ،‬باستثناء إضافة‬

‫‪‬‬ ‫'‪: b'still allows embedded "double" quotes‬ونقلت واحدة‬

‫‪‬‬ ‫"‪: .b"still allows embedded 'single' quotes‬عالمات االقتباس المزدوجة‬

‫‪‬‬ ‫"""‪: ،b'''3 single quotes'''b"""3 double quotes‬الثالثي المقتبس‬

‫بالبايت الحرفية (بغض النظر عن ترميز كود المصدر المعلن)‪ .‬يجب إدخال أي قيم ثنائية تزيد عن ‪ ASCII 127‬يُسمح فقط بأحرف‬
‫‪.‬في وحدات بايت حرفية باستخدام تسلسل اإلفالت المناسب‪L‬‬

‫‪ String and‬بادئة لتعطيل معالجة تسلسالت الهروب‪ .‬راجع‪ r‬كما هو الحال مع السالسل الحرفية ‪ ،‬قد تستخدم البايتات الحرفية أيضًا‬
‫‪.‬لمزيد من المعلومات حول األشكال المختلفة للبايتات الحرفية ‪ ،‬بما في ذلك تسلسالت الهروب المدعومة‪Bytes literals ‬‬

‫فإن كائنات البايت تتصرف في الواقع مثل التسلسالت الثابتة لألعداد ‪ ASCII ،‬بينما تستند وحدات البايت الحرفية والتمثيالت إلى نص‬
‫الصحيحة ‪ ،‬مع تقييد كل قيمة في التسلسل بحيث‪( ‬محاوالت انتهاك هذا التقييد ستطلق‪ .) ‬يتم إجراء ذلك بشكل متعمد للتأكيد على أنه‬
‫ويمكن معالجتها‪ L‬بشكل مفيد باستخدام بعض الخوارزميات ‪ ASCII‬بينما تتضمن العديد من التنسيقات الثنائية عناصر قائمة على‬
‫تطبيق خوارزميات معالجة‪ L‬النص بشكل أعمى على ( الموجهة للنص ‪ ،‬فإن هذا ليس هو الحال عمومًا للبيانات الثنائية التعسفية‬
‫‪).0 <= x < 256ValueError‬إلى تلف البيانات ‪ ASCII‬تنسيقات البيانات الثنائية غير عاد ًة ما يؤدي التوافق مع‬

‫‪:‬باإلضافة إلى األشكال الحرفية ‪ ،‬يمكن إنشاء كائنات البايت بعدة طرق أخرى‬

‫‪‬‬ ‫)‪: bytes(10‬كائن بايت مملوء بصفر بطول محدد‬

‫‪‬‬ ‫))‪: bytes(range(20‬من عدد صحيح متكرر‬

‫‪‬‬ ‫)‪: bytes(obj‬نسخ البيانات الثنائية الموجودة عبر بروتوكول المخزن المؤقت‬

‫‪.‬انظر أي ً‬
‫ضا إلى‪ ‬وحدات البايت‪ ‬المضمنة‬

‫نظرً ا ألن رقمين سداسي عشريين يتوافقان بدقة مع بايت واحد ‪ ،‬فإن األرقام السداسية العشرية هي تنسيق شائع االستخدام لوصف‬
‫‪:‬البيانات الثنائية‪ .‬وف ًق ا لذلك ‪ ،‬يحتوي نوع البايت على طريقة تصنيف إضافية لقراءة البيانات بهذا التنسيق‬

‫‪ ) ‬سلسلة ‪classmethod  fromhex( ‬‬

‫طريقة الفئة‪ ‬هذه‪ ‬بإرجاع كائن بايت ‪ ،‬وفك تشفير كائن السلسلة المحدد‪ .‬يجب أن تحتوي السلسلة على رقمين سداسي ‪ bytes‬تقوم‬
‫‪ ASCII.‬عشريين لكل بايت ‪ ،‬مع تجاهل المسافات البيضاء‬

‫>>>‬

‫)' ‪>>> bytes.fromhex('2Ef0 F1f2‬‬

‫'‪b'.\xf0\xf1\xf2‬‬

‫‪Pg. 206‬‬
‫‪.‬البيضاء في السلسلة ‪ ،‬وليس المسافات‪ L‬فقط ‪ ASCII‬يتخطى اآلن كل مسافات‪:bytes.fromhex() ‬تم التغيير في اإلصدار ‪3.7‬‬

‫‪.‬توجد وظيفة تحويل عكسي لتحويل كائن بايت إلى تمثيل سداسي عشري‬

‫‪hex( [ sep  [ ، bytes_per_sep  ] ] ) ‬‬

‫‪.‬قم بإرجاع كائن سلسلة يحتوي على رقمين سداسي عشري لكل بايت في المثيل‬

‫>>>‬

‫)(‪>>> b'\xf0\xf1\xf2'.hex‬‬

‫'‪'f0f1f2‬‬

‫فاصل حرف واحد‪ ‬لتضمينها في ‪ sep ‬إذا كنت ترغب في تسهيل قراءة السلسلة السداسية العشرية ‪ ،‬يمكنك تحديد‪ ‬معلمة‬
‫اختيارية ثانية‪ ‬في التباعد‪ .‬القيم الموجبة تحسب موضع الفاصل من‪ bytes_per_sep ‬اإلخراج‪ .‬افتراضيا بين كل بايت‪ .‬تتحكم‪ ‬معلمة‬
‫‪.‬اليمين ‪ ،‬والقيم السالبة من اليسار‬

‫>>>‬

‫'‪>>> value = b'\xf0\xf1\xf2‬‬

‫)'‪>>> value.hex('-‬‬

‫'‪'f0-f1-f2‬‬

‫)‪>>> value.hex('_', 2‬‬

‫'‪'f0_f1f2‬‬

‫)‪>>> b'UUDDLRLRAB'.hex(' ', -4‬‬

‫'‪'55554444 4c524c52 4142‬‬

‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫االختيارية‪ ‬إلدراج الفواصل بين وحدات ‪ bytes_per_sep ‬و‪ sep ‬يدعم اآلن‪ ‬معلمات‪:bytes.hex() L‬تم التغيير في اإلصدار ‪3.8‬‬


‫‪.‬البايت في اإلخراج السداسي‬

‫سوف يكون صحيحا‪ ، b[0] ،‬لبايت الكائن‪ ‬ب ‪ (tuple))،‬أقرب إلى الصفوف( منذ بايت الكائنات هي سالسل من األعداد الصحيحة‬
‫سيكون بايت كائن من طول ‪( . 1‬وهذا يتناقض مع سالسل نصية‪ ،‬على حد سواء حيث الفهرسة وتشريح سينتج ]‪ b[0:1‬في حين‬
‫سلسلة بطول ‪)1‬‬

‫ألنه غالبًا ما يكون أكثر فائدة من مثال‪ . ‬يمكنك دائمًا تحويل كائن بايت إلى )'‪ ( b'...‬يستخدم تمثيل كائنات البايت التنسيق الحرفي‬
‫)‪ .bytes([46, 46, 46])list(b‬قائمة من األعداد الصحيحة باستخدام‬

‫ملحوظة‬

‫‪ ‬‬

‫تم السماح بمجموعة متنوعة من التحويالت الضمنية بين سالسل ‪ 8‬بت ‪ Python 2.x ،‬في سلسلة ‪ Python 2.x:‬بالنسبة لمستخدمي‬
‫كان هذا حاًل بدياًل للتوافق مع اإلصدارات السابقة لمراعاة ‪ Unicode. ‬وسالسل )لنوع بيانات ثنائي مضمن ‪.x‬أقرب شيء يقدم ‪(2‬‬
‫اختفت تلك ‪ Python 3.x ،‬إضافة الحقة‪ .‬في ‪ Unicode‬كانت تدعم في األصل نصًا ‪ 8‬بت فقط ‪ ،‬وكان نص ‪ Python‬حقيقة أن‬
‫صريحة ‪ ،‬وستتم مقارنة كائنات البايت ‪ Unicode‬التحويالت الضمنية ‪ -‬يجب أن تكون التحويالت بين البيانات الثنائية ‪ 8‬بت ونص‬
‫‪.‬والسلسلة دائمًا‬

‫‪ Bytearray ‬كائنات‬

‫‪.‬لألشياء‪ bytes ‬الكائنات هي نظير قابل للتغيير‪bytearray‬‬

‫‪Pg. 207‬‬
‫‪ ] ) ‬المصدر‪ ، [  ‬ترميز‪ ، [  ‬أخطاء‪ bytearray( [ ] ]  ‬فئة‬

‫‪:‬وبدالً من ذلك يتم إنشاؤها دائمًا عن طريق استدعاء المُنشئ ‪ bytearray ،‬ال يوجد بناء جملة حرفي مخصص لكائنات‬

‫‪‬‬ ‫)(‪: bytearray‬إنشاء مثيل فارغ‬

‫‪‬‬ ‫)‪: bytearray(10‬إنشاء مثيل ممتلئ بصفر بطول معين‬

‫‪‬‬ ‫))‪: bytearray(range(20‬من عدد صحيح متكرر‬

‫‪‬‬ ‫)'!‪: bytearray(b'Hi‬نسخ البيانات الثنائية الموجودة عبر بروتوكول المخزن المؤقت‬

‫قابلة للتغيير ‪ ،‬فهي تدعم‪ ‬عمليات التسلسل‪ ‬القابل للتغيير‪ ‬باإلضافة إلى عمليات البايت الشائعة وعمليات ‪ bytearray‬نظرً ا ألن كائنات‬
‫‪ Bytearray .‬و ‪ Bytes‬السطر‪ ‬البايت‪ ‬الموصوفة في عمليات‬

‫‪.‬المدمج‪ bytearray ‬انظر أيضً ا إلى‬

‫نظرً ا ألن رقمين سداسي عشريين يتوافقان بدقة مع بايت واحد ‪ ،‬فإن األرقام السداسية العشرية هي تنسيق شائع االستخدام لوصف‬
‫‪:‬على طريقة فئة إضافية لقراءة البيانات بهذا التنسيق ‪ bytearray‬البيانات الثنائية‪ .‬وف ًقا لذلك ‪ ،‬يحتوي نوع‬

‫‪ ) ‬سلسلة ‪classmethod  fromhex( ‬‬

‫وفك تشفير كائن السلسلة المحدد‪ .‬يجب أن تحتوي السلسلة على رقمين ‪ bytearray ،‬طريقة الفئة‪ ‬هذه‪ ‬بإرجاع كائن‪ bytearray‬تقوم‬
‫‪ ASCII.‬سداسي عشريين لكل بايت ‪ ،‬مع تجاهل المسافات البيضاء‬

‫>>>‬

‫)' ‪>>> bytearray.fromhex('2Ef0 F1f2‬‬

‫)'‪bytearray(b'.\xf0\xf1\xf2‬‬

‫‪.‬البيضاء في السلسلة ‪ ،‬وليس المسافات‪ L‬فقط ‪ ASCII‬يتخطى اآلن كل مسافات‪:bytearray.fromhex() ‬تم التغيير في اإلصدار ‪3.7‬‬

‫‪.‬إلى تمثيل سداسي عشري ‪ bytearray‬توجد وظيفة تحويل عكسي لتحويل كائن‬

‫‪hex( [ sep  [ ، bytes_per_sep  ] ] ) ‬‬

‫‪.‬قم بإرجاع كائن سلسلة يحتوي على رقمين سداسي عشري لكل بايت في المثيل‬

‫>>>‬

‫)(‪>>> bytearray(b'\xf0\xf1\xf2').hex‬‬

‫'‪'f0f1f2‬‬

‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫يدعم )(‪ bytes.hex()، bytearray.hex‬تم التغيير في اإلصدار ‪ :3.8‬على‪ ‬غرار‬


‫‪.‬االختيارية‪ ‬إلدراج فواصل بين البايت في اإلخراج السداسي‪ bytes_per_sep ‬و‪ sep ‬اآلن‪ ‬معلمات‪L‬‬

‫سوف يكون ]‪ ، b[0‬ب ‪ bytearray ‬هي متواليات من األعداد الصحيحة (أقرب إلى القائمة)‪ ،‬لكائن ‪ bytearray‬منذ األجسام‬
‫من طول ‪( .1‬وهذا يتناقض مع سالسل نصية‪ ،‬على حد سواء حيث الفهرسة ‪ bytearray‬سيكون كائن]‪ b[0:1‬صحيحا‪ ،‬في حين‬
‫وتشريح سينتج سلسلة بطول ‪)1‬‬

‫ألنه غالبًا ما يكون أكثر فائدة من على سبيل ))'‪ ( bytearray(b'...‬التنسيق الحرفي للبايت ‪ bytearray‬يستخدم تمثيل كائنات‬
‫)‪ .bytearray([46, 46, 46])list(b‬إلى قائمة من األعداد الصحيحة باستخدام ‪ bytearray‬المثال‪ . ‬يمكنك دائمًا تحويل كائن‬

‫‪ Bytearray ‬و ‪ Bytes‬عمليات‬

‫‪Pg. 208‬‬
‫عمليات التسلسل‪ ‬الشائعة‪  . ‬إنها تتفاعل ليس فقط مع المعامالت من نفس النوع ‪ ،‬ولكن مع أي‪ ‬كائن ‪ bytearray ‬تدعم كائنات بايت و‬
‫يشبه البايت‪ . ‬نظرً ا لهذه المرونة ‪ ،‬يمكن مزجها بحرية في العمليات دون التسبب في أخطاء‪ .‬ومع ذلك ‪ ،‬قد يعتمد نوع اإلرجاع‬
‫‪.‬للنتيجة على ترتيب المعامالت‪L‬‬

‫ملحوظة‬

‫‪ ‬‬

‫السالسل كوسيطات لها ‪ ،‬تمامًا كما ال تقبل األساليب الموجودة على السالسل ‪ bytearray‬ال تقبل العمليات على كائنات بايت و‬
‫‪:‬البايت كوسيطات لها‪ .‬على سبيل المثال ‪ ،‬عليك أن تكتب‬

‫"‪a = "abc‬‬

‫)"‪b = a.replace("a", "f‬‬

‫‪:‬و‬

‫"‪a = b"abc‬‬

‫)"‪b = a.replace(b"a", b"f‬‬

‫وبالتالي يجب تجنبها عند العمل مع ‪ ASCII ،‬تفترض بعض عمليات البايت وسجالت البايت استخدام تنسيقات ثنائية متوافقة مع‬
‫‪.‬بيانات ثنائية عشوائية‪ .‬يتم تغطية هذه القيود أدناه‬

‫ملحوظة‬

‫‪ ‬‬

‫إلى تلف ‪ ASCII‬لمعالجة البيانات الثنائية التي لم يتم تخزينها بتنسيق يستند إلى ‪ ASCII‬قد يؤدي استخدام هذه العمليات المستندة إلى‬
‫‪.‬البيانات‬

‫‪.‬مع بيانات ثنائية عشوائية ‪ bytearray‬يمكن استخدام الطرق التالية على كائنات بايت و‬

‫‪bytes.count( sub  [ ، start  [ ، end  ] ] ) ‬‬

‫‪bytearray.count( sub  [ ، start  [ ، end  ] ] ) ‬‬

‫قم بإرجاع عدد التكرارات غير المتداخلة للفرع‪ ‬الفرعي‪ ‬التالي‪ ‬في النطاق [‪ ‬البداية‪ ، ‬النهاية‪ .] ‬يتم تفسير‪ ‬الوسيطات‬
‫‪.‬كما في تدوين الشرائح‪ start and end ‬االختيارية‬

‫‪.‬قد تكون الالحقة التي يجب البحث عنها أي‪ ‬كائن يشبه البايت‪ ‬أو عد ًدا صحيحً ا في النطاق من ‪ 0‬إلى ‪255‬‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.3‬قبول أيضً ا عد ًدا صحيحً ا في النطاق من ‪ 0‬إلى ‪ 255‬باعتباره التالي‬

‫‪ ، /  ) ‬بادئة ‪bytes.removeprefix( ‬‬

‫‪ ، /  ) ‬بادئة ‪bytearray.removeprefix( ‬‬

‫‪:‬خالف ذلك ‪ ،‬قم بإرجاع نسخة من البيانات الثنائية األصلية‪ bytes[len(prefix):]. ‬إذا بدأت البيانات الثنائية‪ ‬بسلسلة‪ ‬البادئة‪ ، ‬فارجع‬

‫>>>‬

‫)'‪>>> b'TestHook'.removeprefix(b'Test‬‬

‫'‪b'Hook‬‬

‫)'‪>>> b'BaseTestCase'.removeprefix(b'Test‬‬

‫'‪b'BaseTestCase‬‬

‫‪Pg. 209‬‬
‫‪ .‬و‪ ‬بادئة‪ ‬قد يكون أي‪ ‬بايت مثل الكائن‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬هذه الطريقة‪ ‬ال‪  ‬تعمل في مكان ‪ -‬أنها تنتج دائما كائن جديد‪ ،‬حتى لو لم يتم إجراء أية تغييرات ‪ bytearray‬ال النسخة‬

‫الجديد في اإلصدار ‪3.9.1‬‬

‫‪ ، /  ) ‬الحقة ‪bytes.removesuffix( ‬‬

‫‪ ، /  ) ‬الحقة ‪bytearray.removesuffix( ‬‬

‫خالف ذلك ‪ ،‬قم بإرجاع نسخة ‪ bytes[:-len(suffix)]. ‬إذا نهايات البيانات الثنائية مع‪ ‬الحقة‪ ‬سلسلة وأن‪ ‬احقة‪ ‬ليست فارغة‪ ،‬وعودة‬
‫‪:‬من البيانات الثنائية األصلية‬

‫>>>‬

‫)'‪>>> b'MiscTests'.removesuffix(b'Tests‬‬

‫'‪b'Misc‬‬

‫)'‪>>> b'TmpDirMixin'.removesuffix(b'Tests‬‬

‫'‪b'TmpDirMixin‬‬

‫‪ .‬ل‪ ‬احقة‪ ‬قد تكون أي‪ ‬بايت مثل الكائن‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬هذه الطريقة‪ ‬ال‪  ‬تعمل في مكان ‪ -‬أنها تنتج دائما كائن جديد‪ ،‬حتى لو لم يتم إجراء أية تغييرات ‪ bytearray‬ال النسخة‬

‫الجديد في اإلصدار ‪3.9.1‬‬

‫‪' ) ‬األخطاء‪'  =  ‬صارم ‪ =  'utf-8' ، ‬الترميز ‪bytes.decode( ‬‬

‫‪' ) ‬األخطاء‪'  =  ‬صارم ‪ =  'utf-8' ، ‬الترميز ‪bytearray.decode( ‬‬

‫يمكن إعطاء‪ ‬أخطاء‪ ‬لتعيين نظام معالجة أخطاء ‪ 'utf-8'. ‬إرجاع سلسلة تم فك تشفيرها من البايتات المحددة‪ .‬الترميز االفتراضي هو‬
‫القيم األخرى ‪ UnicodeError. ‬مما يعني أن أخطاء الترميز ترفع ملف ‪ 'strict'،‬مختلف‪ .‬اإلعداد االفتراضي‪ ‬لألخطاء‪ ‬هو‬
‫انظر القسم‪ ‬معالجات خطأ‪ . ‬للحصول على ‪ codecs.register_error()،‬وبأي اسم آخر مسجل عبر'‪ 'ignore'، 'replace‬الممكنة‬
‫‪ .‬قائمة الترميزات المحتملة ‪ ،‬راجع قسم الترميزات‪ ‬القياسية‬

‫بشكل افتراضي ‪ ،‬ال يتم التحقق من وسيطة‪ ‬األخطاء‪ ‬للحصول على أفضل أداء ‪ ،‬ولكن يتم استخدامها فقط عند أول خطأ في فك‬
‫‪ .‬أو استخدم بنية‪ ‬تصحيح‪  ‬األخطاء‪ ‬للتحقق من‪ ‬األخطاء ‪ Python ،‬التشفير‪ .‬قم بتمكين‪ ‬وضع تطوير‬

‫ملحوظة‬

‫‪ ‬‬

‫‪ bytearray.‬يسمح فك أي‪ ‬بايت مثل الكائن‪ ‬مباشرة‪ ،‬دون الحاجة إلى جعل بايت مؤقتة أو كائن‪ str‬تمرير‪ ‬ترميز‪ ‬حجة ل‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.1‬تمت إضافة دعم للوسائط األساسية‬

‫‪ .‬تغير في اإلصدار ‪ :3.9‬إن‪ ‬أخطاء‪ ‬محددا اآلن في نمط التنمية وفي‪ ‬وضع التصحيح‬

‫‪ ) ‬الحقة‪ ، [  ‬بداية‪ ، [  ‬نهاية‪bytes.endswith( ] ]  ‬‬

‫‪Pg. 210‬‬
‫‪ ) ‬الحقة‪ ، [  ‬بداية‪ ، [  ‬نهاية‪bytearray.endswith( ] ]  ‬‬

‫يمكن أن تكون‪ ‬الالحقة‪ ‬أيضً ا مجموعة من ‪ False. ‬إذا كانت البيانات الثنائية تنتهي‪ ‬بالالحقة‪ ‬المحددة‪ ، ‬وإال يتم إرجاعها‪ True‬العودة‬
‫‪.‬اللواحق للبحث عنها‪ .‬مع‪ ‬بدء‪ ‬اختياري‪ ، ‬ابدأ‪ ‬االختبار في هذا الموضع‪ .‬مع‪ ‬نهاية‪ ‬اختيارية‪ ، ‬توقف عن المقارنة في هذا الموضع‬

‫‪ .‬قد تكون الالحقة (اللواحق) التي سيتم البحث عنها عبارة عن أي‪ ‬كائن يشبه البايت‬

‫‪bytes.find( sub  [ ، start  [ ، end  ] ] ) ‬‬

‫‪bytearray.find( sub  [ ، start  [ ، end  ] ] ) ‬‬

‫قم بإرجاع أدنى فهرس في البيانات حيث‪ ‬تم العثور على‪ ‬الفرع الفرعي‪ ‬التالي‪ ، ‬بحيث‪ ‬يكون هذا الجزء‪ ‬الفرعي‪ ‬موجو ًدا في‬
‫كما في تدوين الشرائح‪ .‬العودة‪1- ‬إذا‪ ‬لم يتم العثور ‪ start and end ‬يتم تفسير‪ ‬الوسيطات االختيارية‪ s[start:end]. ‬الشريحة‬
‫‪ .‬على‪ ‬الفرعية‬

‫‪.‬قد تكون الالحقة التي يجب البحث عنها أي‪ ‬كائن يشبه البايت‪ ‬أو عد ًدا صحيحً ا في النطاق من ‪ 0‬إلى ‪255‬‬

‫ملحوظة‬

‫‪ ‬‬

‫ينبغي أن تستخدم الطريقة فقط إذا كنت بحاجة إلى معرفة موقف‪ ‬الفرعية‪ . ‬للتحقق مما إذا كانت‪ ‬السلسلة‪ ‬الفرعية‪ ‬عبارة عن )(‪ find‬و‬
‫‪:‬عامل التشغيل‪ in‬سلسلة فرعية أم ال ‪ ،‬استخدم‬

‫>>>‬

‫'‪>>> b'Py' in b'Python‬‬

‫‪True‬‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.3‬قبول أيضً ا عد ًدا صحيحً ا في النطاق من ‪ 0‬إلى ‪ 255‬باعتباره التالي‬

‫‪bytes.index( sub  [ ، start  [ ، end  ] ] ) ‬‬

‫‪bytearray.index( sub  [ ، start  [ ، end  ] ] ) ‬‬

‫‪.‬عندما ال يتم العثور على الالحقة‪ ValueError‬ولكن رفع ‪ find()،‬مثل‬

‫‪.‬قد تكون الالحقة التي يجب البحث عنها أي‪ ‬كائن يشبه البايت‪ ‬أو عد ًدا صحيحً ا في النطاق من ‪ 0‬إلى ‪255‬‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.3‬قبول أيضً ا عد ًدا صحيحً ا في النطاق من ‪ 0‬إلى ‪ 255‬باعتباره التالي‬

‫‪ ) ‬متكرر ‪bytes.join( ‬‬

‫‪ ) ‬متكرر ‪bytearray.join( ‬‬

‫إذا ‪ A ‬سيتم رفع‪  . TypeError‬قم بإرجاع كائن بايت أو بايت ‪ ،‬وهو عبارة عن سلسلة من تسلسالت البيانات الثنائية في‪ ‬قابلة للتكرار‬
‫الكائنات‪ .‬الفاصل بين العناصر هو محتويات بايت أو كائن ‪ str‬كان هناك أي قيم في‪ ‬التكرار‪ ‬ليست‪ ‬كائنات تشبه البايت‪ ، ‬بما في ذلك‬
‫‪.‬مخطط بايت يوفر هذه الطريقة‬

‫‪ ) ‬من‪ ، ‬إلى ‪ bytes.maketrans( ‬ثابت‬

‫‪ ) ‬من‪ ، ‬إلى ‪ bytearray.maketrans( ‬ثابت‬

‫تعيين كل حرف‪ ‬من‪ ‬الحرف في نفس )(‪ bytes.translate‬تقوم هذه الطريقة الثابتة بإرجاع جدول ترجمة يمكن استخدامه من أجل‬
‫‪.‬كائنات تشبه البايت‪ ‬ولها نفس الطول ‪ from and to ‬الموضع‪ ‬إلى‪ ‬؛‪ ‬يجب أن يكون كل‪ ‬من‬

‫‪New in version 3.1.‬‬

‫)‪bytes.partition(sep‬‬

‫‪Pg. 211‬‬
bytearray.partition(sep)

Split the sequence at the first occurrence of sep, and return a 3-tuple containing the part before the
separator, the separator itself or its bytearray copy, and the part after the separator. If the separator
is not found, return a 3-tuple containing a copy of the original sequence, followed by two empty
bytes or bytearray objects.

The separator to search for may be any bytes-like object.

bytes.replace(old, new[, count])

bytearray.replace(old, new[, count])

Return a copy of the sequence with all occurrences of subsequence old replaced by new. If the
optional argument count is given, only the first count occurrences are replaced.

The subsequence to search for and its replacement may be any bytes-like object.

Note

The bytearray version of this method does not operate in place - it always produces a new object,
even if no changes were made.

bytes.rfind(sub[, start[, end]])

bytearray.rfind(sub[, start[, end]])

Return the highest index in the sequence where the subsequence sub is found, such that sub is
contained within s[start:end]. Optional arguments start and end are interpreted as in slice notation.
Return -1 on failure.

The subsequence to search for may be any bytes-like object or an integer in the range 0 to 255.

Changed in version 3.3:  Also accept an integer in the range 0 to 255 as the subsequence.

bytes.rindex(sub[, start[, end]])

bytearray.rindex(sub[, start[, end]])

Like rfind() but raises ValueError when the subsequence sub is not found.

The subsequence to search for may be any bytes-like object or an integer in the range 0 to 255.

Changed in version 3.3:  Also accept an integer in the range 0 to 255 as the subsequence.

bytes.rpartition(sep)

bytearray.rpartition(sep)

Split the sequence at the last occurrence of sep, and return a 3-tuple containing the part before the
separator, the separator itself or its bytearray copy, and the part after the separator. If the separator
is not found, return a 3-tuple containing two empty bytes or bytearray objects, followed by a copy of
the original sequence.

The separator to search for may be any bytes-like object.

bytes.startswith(prefix[, start[, end]])

Pg. 212
bytearray.startswith(prefix[, start[, end]])

Return True if the binary data starts with the specified prefix, otherwise return False. prefix can also
be a tuple of prefixes to look for. With optional start, test beginning at that position. With
optional end, stop comparing at that position.

The prefix(es) to search for may be any bytes-like object.

bytes.translate(table, /, delete=b'')

bytearray.translate(table, /, delete=b'')

Return a copy of the bytes or bytearray object where all bytes occurring in the optional
argument delete are removed, and the remaining bytes have been mapped through the given
translation table, which must be a bytes object of length 256.

You can use the bytes.maketrans() method to create a translation table.

Set the table argument to None for translations that only delete characters:

>>>

>>> b'read this short text'.translate(None, b'aeiou')

b'rd ths shrt txt'

Changed in version 3.6:  delete is now supported as a keyword argument.

The following methods on bytes and bytearray objects have default behaviours that assume the use
of ASCII compatible binary formats, but can still be used with arbitrary binary data by passing
appropriate arguments. Note that all of the bytearray methods in this section do not operate in
place, and instead produce new objects.

bytes.center(width[, fillbyte])

bytearray.center(width[, fillbyte])

Return a copy of the object centered in a sequence of length width. Padding is done using the
specified fillbyte (default is an ASCII space). For bytes objects, the original sequence is returned
if width is less than or equal to len(s).

Note

The bytearray version of this method does not operate in place - it always produces a new object,
even if no changes were made.

bytes.ljust(width[, fillbyte])

bytearray.ljust(width[, fillbyte])

Return a copy of the object left justified in a sequence of length width. Padding is done using the
specified fillbyte (default is an ASCII space). For bytes objects, the original sequence is returned
if width is less than or equal to len(s).

Note

Pg. 213
 

The bytearray version of this method does not operate in place - it always produces a new object,
even if no changes were made.

bytes.lstrip([chars])

bytearray.lstrip([chars])

Return a copy of the sequence with specified leading bytes removed. The chars argument is a binary
sequence specifying the set of byte values to be removed - the name refers to the fact this method is
usually used with ASCII characters. If omitted or None, the chars argument defaults to removing ASCII
whitespace. The chars argument is not a prefix; rather, all combinations of its values are stripped:

>>>

>>> b' spacious '.lstrip()

b'spacious '

>>> b'www.example.com'.lstrip(b'cmowz.')

b'example.com'

The binary sequence of byte values to remove may be any bytes-like object. See removeprefix() for a
method that will remove a single prefix string rather than all of a set of characters. For example:

>>>

>>> b'Arthur: three!'.lstrip(b'Arthur: ')

b'ee!'

>>> b'Arthur: three!'.removeprefix(b'Arthur: ')

b'three!'

Note

‫ ال النسخة‬bytearray ‫ حتى لو لم يتم إجراء أية تغييرات‬،‫ أنها تنتج دائما كائن جديد‬- ‫ تعمل في مكان‬ ‫ال‬ ‫هذه الطريقة‬.

bytes.rjust( ]  ‫ملء بايت‬ ، [  ‫العرض‬ ) 

bytearray.rjust( ]  ‫ملء بايت‬ ، [  ‫العرض‬ ) 

‫المحدد‬ ‫بايت التعبئة‬ ‫يتم إجراء الحشو باستخدام‬ . ‫الطول‬ ‫عرض‬ ‫قم بإرجاع نسخة من الكائن إلى اليمين مبررة في تسلسل‬ (‫االفتراضي‬
L‫ هو مسافة‬ASCII). ‫بالنسبة‬ bytes‫أقل من أو يساوي‬ ‫العرض‬ ‫ يتم إرجاع التسلسل األصلي إذا كان‬، ‫للكائنات‬ len(s).

‫ملحوظة‬

‫ ال النسخة‬bytearray ‫ حتى لو لم يتم إجراء أية تغييرات‬،‫ أنها تنتج دائما كائن جديد‬- ‫ تعمل في مكان‬ ‫ال‬ ‫هذه الطريقة‬.

bytes.rsplit( sep  =  ‫ال شيء‬ ، maxsplit  =  - 1 ) 

bytearray.rsplit( sep  =  ‫ال شيء‬ ، maxsplit  =  - 1 ) 

Pg. 214
‫تعطى‪ ،‬في ‪  maxsplit ‬تقسيم تسلسل ثنائي في المتتالية من نفس النوع‪ ،‬وذلك باستخدام‪ ‬سبتمبر‪ ‬كسلسلة محدد‪ .‬إذا‬
‫فإن أي تتابع الحق يتكون فقط من مسافة‪ None، L‬أو‪ sep ‬االنقسامات‪ L‬تتم‪ ،‬و‪ ‬أقصى اليمين‪ ‬منها‪ .‬إذا‪ ‬لم يتم تحديد‪ maxsplit ‬معظم‬
‫‪.‬ما هو موصوف بالتفصيل أدناه)(‪ split‬يتصرف مثل)(‪ ، rsplit‬هو فاصل‪ .‬باستثناء االنفصال عن اليمين ‪ ASCII‬بيضاء‬

‫‪ ] ) ‬حرف ‪bytes.rstrip( [ ‬‬

‫‪ ] ) ‬حرف ‪bytearray.rstrip( [ ‬‬

‫إعادة نسخة من التسلسل مع إزالة بايتات الحقة محددة‪ .‬و‪ ‬حرف‪  ‬الحجة هي سلسلة ثنائي تحديد مجموعة من القيم بايت المراد إزالتها‬
‫بشكل‪ ‬افتر ‪ chars‬يتم تعيين‪ ‬وسيطة ‪ None،‬إذا تم حذف أو‪ - ASCII. ‬اسم يشير إلى حقيقة وعادة ما يستخدم هذا األسلوب مع أحرف‬
‫‪:‬و‪ ‬حرف‪ ‬الحجة ليست الحقة‪ .‬بدالً من ذلك ‪ ،‬يتم تجريد جميع مجموعات قيمها‪ ASCII. L‬اضي على إزالة المسافة البيضاء‬

‫>>>‬

‫)(‪>>> b' spacious '.rstrip‬‬

‫'‪b' spacious‬‬

‫)'‪>>> b'mississippi'.rstrip(b'ipz‬‬

‫'‪b'mississ‬‬

‫عن طريقة تزيل سلسلة الحقة )(‪ removesuffix‬قد يكون التسلسل الثنائي لقيم البايت المراد إزالتها أي‪ ‬كائن يشبه البايت‪ . ‬ابحث‬
‫‪:‬واحدة بدالً من كل مجموعة من األحرف‪ .‬على سبيل المثال‬

‫>>>‬

‫)'‪>>> b'Monty Python'.rstrip(b' Python‬‬

‫'‪b'M‬‬

‫)'‪>>> b'Monty Python'.removesuffix(b' Python‬‬

‫'‪b'Monty‬‬

‫ملحوظة‬
‫‪ ‬‬

‫‪.‬هذه الطريقة‪ ‬ال‪  ‬تعمل في مكان ‪ -‬أنها تنتج دائما كائن جديد‪ ،‬حتى لو لم يتم إجراء أية تغييرات ‪ bytearray‬ال النسخة‬

‫‪ ، maxsplit  =  - 1 ) ‬ال شيء ‪bytes.split( sep  = ‬‬

‫‪ ، maxsplit  =  - 1 ) ‬ال شيء ‪bytearray.split( sep  = ‬‬

‫وكان غير ‪  maxsplit ‬تقسيم تسلسل ثنائي في المتتالية من نفس النوع‪ ،‬وذلك باستخدام‪ ‬سبتمبر‪ ‬كسلسلة محدد‪ .‬إذا‪ ‬تم إعطاء‬
‫إذا‪ ‬لم يتم ‪). ‬العناصر‪ maxsplit+1 ‬وبالتالي ‪ ،‬ستحتوي القائمة على معظم(‪ maxsplit ‬سالب ‪ ،‬فيتم إجراء عمليات‪ ‬تقسيم‬
‫‪.‬أو تم تحديده‪ ،1- ‬فال يوجد حد لعدد االنقسامات‪( L‬يتم إجراء جميع االنقسامات الممكنة)‪ maxsplit ‬تحديد‬

‫على سبيل ( فلن يتم تجميع المحددات المتتالية معً ا ويتم اعتبارها لتحديد التكرارات الالحقة الفارغة ‪ sep ،‬إذا‪ ‬تم إعطاء‬
‫في‪ ‬سبتمبر‪ ‬قد تتكون حجة من سلسلة متعددة البايت (على سبيل المثال‪ ،‬يعود‪ .) ‬يعود ‪ ). ‬المرتجعات‪ ، b'1,,2'.split(b',') ‬المثال‬
‫‪ .‬تقسيم تسلسل فارغ بفاصل محدد‪ ‬أو‪ ‬اعتما ًدا على نوع الكائن الذي يتم تقسيمه‪ .‬في‪ ‬سبتمبر‪ ‬قد يكون حجة أي‪ ‬بايت مثل الكائن‬
‫])''‪[b'1', b'', b'2']b'1<>2<>3'.split(b'<>')[b'1', b'2', b'3'][b''][bytearray(b‬‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫)'‪>>> b'1,2,3'.split(b',‬‬

‫‪Pg. 215‬‬
‫]'‪[b'1', b'2', b'3‬‬

‫)‪>>> b'1,2,3'.split(b',', maxsplit=1‬‬

‫]'‪[b'1', b'2,3‬‬

‫)'‪>>> b'1,2,,3,'.split(b',‬‬

‫]''‪[b'1', b'2', b'', b'3', b‬‬

‫كفاصل ‪ ASCII‬تطبيق خوارزمية تقسيم مختلفة‪ :‬يتم اعتبار عمليات تشغيل المسافة‪ L‬البيضاء المتتالية‪ None‬أو تم‪ sep ‬إذا‪ ‬لم يتم تحديد‬
‫واحد ‪ ،‬ولن تحتوي النتيجة على سالسل فارغة في البداية أو النهاية إذا كان التسلسل يحتوي على مسافة بيضاء بادئة أو‬
‫‪ [].‬بدون فاصل محدد يعود ‪ ASCII‬الحقة‪  .‬وبالتالي ‪ ،‬فإن تقسيم تسلسل فارغ أو تسلسل يتكون فقط من مسافة‪ L‬بيضاء‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫)(‪>>> b'1 2 3'.split‬‬

‫]'‪[b'1', b'2', b'3‬‬

‫)‪>>> b'1 2 3'.split(maxsplit=1‬‬

‫]'‪[b'1', b'2 3‬‬

‫)(‪>>> b' 1 2 3 '.split‬‬

‫]'‪[b'1', b'2', b'3‬‬

‫‪ ] ) ‬حرف ‪bytes.strip( [ ‬‬

‫‪ ] ) ‬حرف ‪bytearray.strip( [ ‬‬

‫قم بإرجاع نسخة من التسلسل مع إزالة البايتات البادئة والزائدة المحددة‪ .‬و‪ ‬حرف‪ ‬الحجة هي سلسلة ثنائي تحديد مجموعة من القيم‬
‫يتم ‪ None،‬إذا تم حذف أو‪ ASCII. ‬بايت المراد إزالتها ‪ -‬اسم يشير إلى حقيقة وعادة ما يستخدم هذا األسلوب مع أحرف‬
‫و‪ ‬حرف‪ ‬الحجة ليست بادئة أو الحقة‪ .‬بدالً من ذلك ‪ ،‬يتم ‪ ASCII. ‬بشكل‪ ‬افتراضي على إزالة المسافة البيضاء ‪ chars‬تعيين‪ ‬وسيطة‬
‫‪:‬تجريد جميع مجموعات قيمها‬

‫>>>‬

‫)(‪>>> b' spacious '.strip‬‬

‫'‪b'spacious‬‬

‫)'‪>>> b'www.example.com'.strip(b'cmowz.‬‬

‫'‪b'example‬‬

‫‪ .‬قد يكون التسلسل الثنائي لقيم البايت المراد إزالتها أي‪ ‬كائن يشبه البايت‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬هذه الطريقة‪ ‬ال‪  ‬تعمل في مكان ‪ -‬أنها تنتج دائما كائن جديد‪ ،‬حتى لو لم يتم إجراء أية تغييرات ‪ bytearray‬ال النسخة‬

‫ويجب عدم تطبيقها على ‪ ASCII‬استخدام التنسيقات الثنائية المتوافقة مع ‪ bytearray‬و ‪ bytes‬تفترض الطرق التالية على كائنات‬
‫‪.‬في هذا القسم‪ ‬ال‪ ‬تعمل في مكانها ‪ ،‬وبدالً من ذلك تنتج كائنات جديدة ‪ bytearray‬البيانات الثنائية العشوائية‪ .‬الحظ أن جميع طرق‬

‫‪Pg. 216‬‬
‫)(‪bytes.capitalize‬‬

‫)(‪bytearray.capitalize‬‬

‫وكتابة البايت األول بحروف كبيرة والباقي بحروف ‪ ASCII ،‬قم بإرجاع نسخة من التسلسل مع ترجمة كل بايت على أنه حرف‬
‫‪.‬دون تغيير ‪ ASCII‬أقل‪ .‬يتم تمرير قيم البايت غير‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬هذه الطريقة‪ ‬ال‪  ‬تعمل في مكان ‪ -‬أنها تنتج دائما كائن جديد‪ ،‬حتى لو لم يتم إجراء أية تغييرات ‪ bytearray‬ال النسخة‬

‫‪ ) ‬حجم الجدولة‪bytes.expandtabs( 8  =  ‬‬

‫‪ ) ‬حجم الجدولة‪bytearray.expandtabs( 8  =  ‬‬

‫‪ ASCII ،‬بمسافة‪ L‬واحدة أو أكثر من مسافات‪ ASCII L‬قم بإرجاع نسخة من التسلسل حيث يتم استبدال جميع أحرف عالمة تبويب‬
‫اعتما ًدا على العمود الحالي وحجم عالمة التبويب المحدد‪ .‬تظهر مواضع الجدولة في كل‪ ‬بايت من‪ ‬حجم الجدولة‪( ‬االفتراضي هو ‪، 8‬‬
‫مع إعطاء مواضع جدولة في األعمدة ‪ 0‬و ‪ 8‬و ‪ 16‬وما إلى ذلك)‪  .‬لتوسيع التسلسل ‪ ،‬يتم تعيين العمود الحالي على صفر ويتم فحص‬
‫فسيتم إدراج حرف مسافة واحد أو أكثر في النتيجة ‪ ASCII ( b'\t') ،‬التسلسل بايت بايت‪ .‬إذا كان البايت عبارة عن حرف جدولة‬
‫حتى يصبح العمود الحالي مساويًا لموضع الجدولة التالي‪(  .‬لم يتم نسخ حرف الجدولة نفسه‪ ).‬إذا كان البايت الحالي عبارة عن سطر‬
‫يتم نسخه وإعادة تعيين العمود الحالي إلى الصفر‪ .‬يتم نسخ أي قيمة بايت أخرى ‪ (b'\r') ،‬أو حرف إرجاع )'‪ ASCII ( b'\n‬جديد‬
‫‪:‬بدون تغيير ويتم زيادة العمود الحالي بواحد بغض النظر عن كيفية تمثيل قيمة البايت عند الطباعة‬

‫>>>‬

‫)(‪>>> b'01\t012\t0123\t01234'.expandtabs‬‬

‫‪b'01‬‬ ‫‪012‬‬ ‫'‪0123 01234‬‬

‫)‪>>> b'01\t012\t0123\t01234'.expandtabs(4‬‬

‫'‪b'01 012 0123 01234‬‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬هذه الطريقة‪ ‬ال‪  ‬تعمل في مكان ‪ -‬أنها تنتج دائما كائن جديد‪ ،‬حتى لو لم يتم إجراء أية تغييرات ‪ bytearray‬ال النسخة‬

‫)(‪bytes.isalnum‬‬

‫)(‪bytearray.isalnum‬‬

‫ولم يكن التسلسل ‪ ASCII‬أبجدية أو أرقامًا عشرية ‪ ASCII‬إذا كانت جميع وحدات البايت في التسلسل أحرف‪ True‬قم باإلرجاع‬
‫ً‬
‫فارغا‬ ‫األبجدية هي قيم البايت الموجودة في ‪ ASCII‬وإال‪ .‬أحرف‪، False‬‬
‫هي قيم ‪ ASCII‬األرقام العشرية‪ b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'. ‬التسلسل‬
‫‪ b'0123456789'.‬البايت في التسلسل‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫)(‪>>> b'ABCabc1'.isalnum‬‬

‫‪True‬‬

‫)(‪>>> b'ABC abc1'.isalnum‬‬

‫‪Pg. 217‬‬
‫‪False‬‬

‫)(‪bytes.isalpha‬‬

‫)(‪bytearray.isalpha‬‬

‫وإال‪ .‬أحرف‪ ، False‬أبجدية ولم يكن التسلسل فار ًغا ‪ ASCII‬إذا كانت جميع وحدات البايت في التسلسل أحرف‪ True‬قم باإلرجاع‬
‫األبجدية هي قيم البايت الموجودة في ‪ASCII‬‬
‫‪ b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.‬التسلسل‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫)(‪>>> b'ABCabc'.isalpha‬‬

‫‪True‬‬

‫)(‪>>> b'ABCabc1'.isalpha‬‬

‫‪False‬‬

‫)(‪bytes.isascii‬‬

‫)(‪bytearray.isascii‬‬

‫في ‪ ASCII‬وإال‪ .‬تقع بايتات‪ ASCII ، False‬إذا كان التسلسل فار ًغا أو كانت جميع وحدات البايت في التسلسل‪ True‬قم باإلرجاع‬
‫‪x7F.‬النطاق ‪0-0‬‬

‫الجديد في اإلصدار ‪3.7.1‬‬

‫)(‪bytes.isdigit‬‬

‫)(‪bytearray.isdigit‬‬
‫ً‬
‫فارغا ‪ ASCII‬إذا كانت جميع وحدات البايت في التسلسل عبارة عن أرقام عشرية‪ True‬قم باإلرجاع‬ ‫وإال‪ .‬ا‪ ، False‬ولم يكن التسلسل‬
‫‪ b'0123456789'.‬هي قيم البايت في التسلسل ‪ ASCII‬ألرقام العشرية‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫)(‪>>> b'1234'.isdigit‬‬

‫‪True‬‬

‫)(‪>>> b'1.23'.isdigit‬‬

‫‪False‬‬

‫)(‪bytes.islower‬‬

‫)(‪bytearray.islower‬‬

‫‪.‬وإال‪ ، False‬كبيرة ‪ ASCII‬صغير واحد على األقل في التسلسل وال توجد أحرف ‪ ASCII‬إذا كان هناك حرف‪ True‬قم باإلرجاع‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫‪Pg. 218‬‬
‫)(‪>>> b'hello world'.islower‬‬

‫‪True‬‬

‫)(‪>>> b'Hello world'.islower‬‬

‫‪False‬‬

‫هي ‪ ASCII‬األحرف الكبيرة‪ b'abcdefghijklmnopqrstuvwxyz'. ‬الصغيرة هي قيم البايت الموجودة في التسلسل ‪ ASCII‬أحرف‬


‫‪ b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.‬قيم البايت في التسلسل‬

‫)(‪bytes.isspace‬‬

‫)(‪bytearray.isspace‬‬

‫وإال‪ .‬أ‪ ، False‬ولم يكن التسلسل فار ًغا ‪ ASCII‬إذا كانت جميع وحدات البايت في التسلسل عبارة عن مسافة‪ L‬بيضاء‪ True‬قم باإلرجاع‬
‫هي قيم البايت الموجودة في التسلسل‪( ‬مسافة ‪ ،‬عالمة تبويب ‪ ،‬سطر جديد ‪ ،‬إرجاع أول السطر ‪ ASCII ،‬حرف المسافات البيضاء‬
‫'‪.b' \t\n\r\x0b\f‬عالمة تبويب رأسية ‪ ،‬تغذية النموذج)‬

‫)(‪bytes.istitle‬‬

‫)(‪bytearray.istitle‬‬

‫لمزيد من )(‪ bytes.title‬وإال‪ .‬انظر‪ ، False‬ولم يكن التسلسل فار ًغا ‪ ASCII titlecase‬باإلرجاع إذا كان التسلسل هو‪ True‬قم‬
‫‪".‬التفاصيل حول تعريف "حالة العنوان‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫)(‪>>> b'Hello World'.istitle‬‬

‫‪True‬‬

‫)(‪>>> b'Hello world'.istitle‬‬

‫‪False‬‬

‫)(‪bytes.isupper‬‬

‫)(‪bytearray.isupper‬‬

‫‪ ، False‬صغيرة ‪ ASCII‬أبجدي كبير واحد على األقل في التسلسل وليس هناك أحرف ‪ ASCII‬إذا كان هناك حرف‪ True‬قم باإلرجاع‬
‫‪.‬وإال‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫)(‪>>> b'HELLO WORLD'.isupper‬‬

‫‪True‬‬

‫)(‪>>> b'Hello world'.isupper‬‬

‫‪False‬‬

‫هي ‪ ASCII‬األحرف الكبيرة‪ b'abcdefghijklmnopqrstuvwxyz'. ‬الصغيرة هي قيم البايت الموجودة في التسلسل ‪ ASCII‬أحرف‬


‫‪ b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.‬قيم البايت في التسلسل‬

‫‪Pg. 219‬‬
‫)(‪bytes.lower‬‬

‫)(‪bytearray.lower‬‬

‫‪.‬الكبيرة إلى نظيرتها الصغيرة المقابلة ‪ ASCII‬قم بإرجاع نسخة من التسلسل مع تحويل جميع أحرف‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫)(‪>>> b'Hello World'.lower‬‬

‫'‪b'hello world‬‬

‫هي ‪ ASCII‬األحرف الكبيرة‪ b'abcdefghijklmnopqrstuvwxyz'. ‬الصغيرة هي قيم البايت الموجودة في التسلسل ‪ ASCII‬أحرف‬


‫‪ b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.‬قيم البايت في التسلسل‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬هذه الطريقة‪ ‬ال‪  ‬تعمل في مكان ‪ -‬أنها تنتج دائما كائن جديد‪ ،‬حتى لو لم يتم إجراء أية تغييرات ‪ bytearray‬ال النسخة‬

‫‪ ) ‬يبقي‪  =  ‬خطأ ‪bytes.splitlines( ‬‬

‫‪ ) ‬يبقي‪  =  ‬خطأ ‪bytearray.splitlines( ‬‬

‫تستخدم هذه الطريقة‪ ‬نهج الخطوط‪ ‬الجديدة ‪ ASCII. ‬قم بإرجاع قائمة باألسطر في التسلسل الثنائي ‪ ،‬مع كسر حدود أسطر‬
‫‪.‬العالمية‪ ‬لتقسيم الخطوط‪  .‬ال يتم تضمين فواصل األسطر في القائمة الناتجة ما لم‪ ‬يتم‪ ‬توفير عمليات حفظ األسطر‪ ‬وصحيحة‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫)(‪>>> b'ab c\n\nde fg\rkl\r\n'.splitlines‬‬

‫]'‪[b'ab c', b'', b'de fg', b'kl‬‬

‫)‪>>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True‬‬

‫]'‪[b'ab c\n', b'\n', b'de fg\r', b'kl\r\n‬‬

‫فإن هذه الطريقة ُترجع قائمة فارغة للسلسلة الفارغة ‪ ،‬وال ينتج ‪ sep ،‬عندما‪ ‬يتم إعطاء‪ ‬سلسلة محددة)(‪ split‬على عكس ما يحدث‬
‫‪:‬عن فاصل السطر الطرفي سطرً ا إضافيًا‬

‫>>>‬

‫)'‪>>> b"".split(b'\n'), b"Two lines\n".split(b'\n‬‬

‫)]''‪([b''], [b'Two lines', b‬‬

‫)(‪>>> b"".splitlines(), b"One line\n".splitlines‬‬

‫)]'‪([], [b'One line‬‬

‫)(‪bytes.swapcase‬‬

‫)(‪bytearray.swapcase‬‬

‫‪.‬الصغيرة إلى نظيرتها ذات األحرف الكبيرة والعكس صحيح ‪ ASCII‬قم بإرجاع نسخة من التسلسل مع تحويل جميع أحرف‬

‫‪Pg. 220‬‬
‫‪:‬على سبيل المثال‬

‫>>>‬

‫)(‪>>> b'Hello World'.swapcase‬‬

‫'‪b'hELLO wORLD‬‬

‫هي ‪ ASCII‬األحرف الكبيرة‪ b'abcdefghijklmnopqrstuvwxyz'. ‬الصغيرة هي قيم البايت الموجودة في التسلسل ‪ ASCII‬أحرف‬


‫‪ b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.‬قيم البايت في التسلسل‬

‫على ‪ ASCII ،‬دائمًا ما يكون هذا هو الحال‪ ‬بالنسبة لإلصدارات الثنائية‪ .‬تحويالت الحالة متناظرة في ‪ str.swapcase()،‬على عكس‬
‫‪.bin.swapcase().swapcase() == bin‬العشوائية ‪ Unicode‬الرغم من أن هذا ال ينطبق بشكل عام على نقاط رمز‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬هذه الطريقة‪ ‬ال‪  ‬تعمل في مكان ‪ -‬أنها تنتج دائما كائن جديد‪ ،‬حتى لو لم يتم إجراء أية تغييرات ‪ bytearray‬ال النسخة‬

‫)(‪bytes.title‬‬

‫)(‪bytearray.title‬‬

‫كبير وتكون األحرف المتبقية صغيرة‪ .‬يتم ترك قيم ‪ ASCII‬قم بإرجاع نسخة عنوانها من التسلسل الثنائي حيث تبدأ الكلمات بحرف‬
‫‪.‬البايت غير المعدلة‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫)(‪>>> b'Hello world'.title‬‬

‫'‪b'Hello World‬‬

‫هي ‪ ASCII‬األحرف الكبيرة‪ b'abcdefghijklmnopqrstuvwxyz'. ‬الصغيرة هي قيم البايت الموجودة في التسلسل ‪ ASCII‬أحرف‬


‫‪.‬جميع قيم البايت األخرى غير محددة‪ b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. ‬قيم البايت في التسلسل‬
‫ً‬
‫بسيطا مستقاًل عن اللغة للكلمة كمجموعات‪ L‬من األحرف المتتالية‪ .‬يعمل التعريف في العديد من السياقات‬ ‫تستخدم الخوارزمية تعري ًفا‬
‫‪:‬ولكنه يعني أن الفاصالت العليا في االنقباضات والملكية تشكل حدو ًدا للكلمات ‪ ،‬والتي قد ال تكون النتيجة المرجوة‬

‫>>>‬

‫)(‪>>> b"they're bill's friends from the UK".title‬‬

‫"‪b"They'Re Bill'S Friends From The Uk‬‬

‫‪:‬يمكن إنشاء حل بديل للفواصل العليا باستخدام التعبيرات النمطية‬

‫>>>‬

‫‪>>> import re‬‬

‫‪>>> def titlecase(s):‬‬

‫‪...‬‬ ‫‪return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?",‬‬

‫‪...‬‬ ‫‪lambda mo: mo.group(0)[0:1].upper() +‬‬

‫‪...‬‬ ‫‪mo.group(0)[1:].lower(),‬‬

‫‪Pg. 221‬‬
‫‪...‬‬ ‫)‪s‬‬

‫‪...‬‬

‫)"‪>>> titlecase(b"they're bill's friends.‬‬

‫"‪b"They're Bill's Friends.‬‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬هذه الطريقة‪ ‬ال‪  ‬تعمل في مكان ‪ -‬أنها تنتج دائما كائن جديد‪ ،‬حتى لو لم يتم إجراء أية تغييرات ‪ bytearray‬ال النسخة‬

‫)(‪bytes.upper‬‬

‫)(‪bytearray.upper‬‬

‫‪.‬الصغيرة إلى نظيرتها ذات األحرف الكبيرة ‪ ASCII‬قم بإرجاع نسخة من التسلسل مع تحويل جميع أحرف‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫)(‪>>> b'Hello World'.upper‬‬

‫'‪b'HELLO WORLD‬‬

‫هي ‪ ASCII‬األحرف الكبيرة‪ b'abcdefghijklmnopqrstuvwxyz'. ‬الصغيرة هي قيم البايت الموجودة في التسلسل ‪ ASCII‬أحرف‬


‫‪ b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.‬قيم البايت في التسلسل‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬هذه الطريقة‪ ‬ال‪  ‬تعمل في مكان ‪ -‬أنها تنتج دائما كائن جديد‪ ،‬حتى لو لم يتم إجراء أية تغييرات ‪ bytearray‬ال النسخة‬

‫‪ ) ‬العرض ‪bytes.zfill( ‬‬

‫‪ ) ‬العرض ‪bytearray.zfill( ‬‬

‫)'‪ ( b'+'/ b'-‬لعمل تسلسل‪ ‬لعرض‪ ‬الطول‪ . ‬تتم معالجة‪ ‬بادئة اإلشارة‪ ASCII ‬بأرقام'‪ b'0‬قم بإرجاع نسخة من التسلسل األيسر ملي ًئا‬
‫للكائنات ‪ ،‬يتم إرجاع التسلسل األصلي إذا كان‪ bytes‬عن طريق إدخال المساحة‪ L‬المتروكة‪ ‬بعد‪ ‬حرف اإلشارة وليس قبلها‪ .‬بالنسبة‬
‫‪  len(seq).‬العرض‪ ‬أقل من أو يساوي‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫)‪>>> b"42".zfill(5‬‬

‫'‪b'00042‬‬

‫)‪>>> b"-42".zfill(5‬‬

‫'‪b'-0042‬‬

‫ملحوظة‬

‫‪ ‬‬

‫‪Pg. 222‬‬
‫‪.‬هذه الطريقة‪ ‬ال‪  ‬تعمل في مكان ‪ -‬أنها تنتج دائما كائن جديد‪ ،‬حتى لو لم يتم إجراء أية تغييرات ‪ bytearray‬ال النسخة‬

‫‪ ‬نمط تنسيق البايت‪printf-‬‬

‫ملحوظة‬

‫‪ ‬‬

‫تعرض عمليات التنسيق الموصوفة هنا مجموعة متنوعة من المراوغات التي تؤدي إلى عدد من األخطاء الشائعة (مثل الفشل في‬
‫‪.‬عرض المجموعات والقواميس بشكل صحيح)‪  .‬إذا كانت القيمة التي يتم طباعتها عبارة عن مجموعة أو قاموس ‪ ،‬فلفها في مجموعة‬

‫يُعرف هذا أيضًا ‪ (modulo). ‬لها عملية مدمجة‪ L‬فريدة واحدة‪% :‬عامل التشغيل )‪ ( bytes/ bytearray‬كائنات البايت‬
‫باسم‪ ‬عامل‪ ‬تنسيق‪ ‬البايت‪ ‬أو‪ ‬عامل‪ ‬االستيفاء‪ . ‬نظرً ا‪( ‬حيث يكون‪ ‬التنسيق‪ ‬عبارة عن كائن بايت) ‪ ،‬يتم استبدال‪ ‬مواصفات التحويل‬
‫)(‪.format % values%sprintf‬في‪ ‬التنسيق‪ ‬بصفر أو أكثر من عناصر‪ ‬القيم‪ . ‬التأثير مشابه الستخدام‪ ‬لغة سي‬

‫إذا‪ ‬تطلب‪ ‬التنسيق‪ ‬وسيطة واحدة ‪ ،‬فقد تكون‪ ‬القيم‪ ‬كائ ًنا واح ًدا غير مجموعة‪ 5 .‬وبخالف ذلك ‪ ،‬يجب أن تكون‪ ‬القيم‪ ‬عبارة عن‬
‫‪.‬مجموعة تحتوي بالضبط على عدد العناصر المحدد بواسطة كائن تنسيق البايت ‪ ،‬أو كائن تعيين واحد (على سبيل المثال ‪ ،‬قاموس)‬

‫‪:‬يحتوي محدد التحويل على حرفين أو أكثر ويحتوي على المكونات التالية ‪ ،‬والتي يجب أن تحدث بهذا الترتيب‬

‫‪.‬و‪'%' ‬الطابع‪ ،‬الذي يصادف بداية محدد ‪1.‬‬

‫‪ ، (somename)).‬على سبيل المثال( مفتاح التعيين (اختياري) ‪ ،‬يتكون من سلسلة من األحرف بين قوسين ‪2.‬‬

‫‪.‬أعالم التحويل (اختياري) ‪ ،‬والتي تؤثر على نتيجة بعض أنواع التحويل ‪3.‬‬

‫عرض الحقل األدنى (اختياري)‪ .‬إذا تم تحديده على أنه‪('*'  ‬عالمة النجمة) ‪ ،‬فسيتم قراءة العرض الفعلي من العنصر التالي ‪4.‬‬
‫‪.‬في المجموعة في‪ ‬القيم‪ ،  ‬ويأتي الكائن المراد تحويله بعد الحد األدنى لعرض الحقل والدقة االختيارية‬

‫‪5.‬‬ ‫الدقة (اختيارية) ‪ُ ،‬تعطى على شكل‪('.' ‬نقطة) متبوعة بالدقة‪ .‬إذا تم تحديدها كـ‪('*' ‬عالمة نجمية) ‪ ،‬تتم قراءة الدقة الفعلية‬
‫‪.‬من العنصر التالي في المجموعة في‪ ‬القيم‪ ، ‬وتأتي القيمة المراد تحويلها بعد الدقة‬

‫‪.‬معدل الطول (اختياري) ‪6.‬‬

‫‪.‬نوع التحويل ‪7.‬‬

‫عندما الحجة الصحيحة هي القاموس (أو غيرها من نوع رسم الخرائط)‪ ،‬ثم األشكال في كائن بايت‪ ‬يجب أن‪ ‬تتضمن مفتاح الخرائط‬
‫إلى أن القاموس تضاف مباشرة بعد‪'%' ‬الحرف‪ .‬يحدد مفتاح التعيين القيمة المراد تنسيقها من التعيين‪ .‬على سبيل ‪parenthesised‬‬
‫‪:‬المثال‬

‫>>>‬

‫‪>>> print(b'%(language)s has %(number)03d quote types.' %‬‬

‫‪...‬‬ ‫)}‪{b'language': b"Python", b"number": 2‬‬

‫'‪b'Python has 002 quote types.‬‬

‫‪.‬في هذه الحالة ‪* ،‬قد‪ ‬ال‪ ‬تظهر محددات في تنسيق (ألنها تتطلب قائمة معلمات‪ L‬متسلسلة)‬

‫‪:‬رموز عالمة التحويل هي‬

‫‪Pg. 223‬‬
‫ً‬
‫موجودا ‪ ،‬ولكن يتم تجاهله ألنه ليس ضروريًا لبايثون ‪ -‬على سبيل المثال )‪ L‬أو‪ ( h، l‬قد يكون‪ ‬معدّل الطول‬ ‫‪ %d.‬مطابق لـ‪، %ld‬‬

‫‪:‬أنواع التحويل هي‬

‫‪Pg. 224‬‬
‫‪:‬ملحوظات‬

‫‪.‬قبل الرقم األول )'‪ ( '0o‬يتسبب النموذج البديل في إدخال محدد ثماني بادئ ‪1.‬‬

‫قبل الرقم )الشكل المستخدم'‪ 'X‬أو'‪ 'x‬اعتما ًدا على ما إذا‪ ‬كان التنسيق('‪X‬أو‪x'0' ‬يؤدي النموذج البديل إلى إدخال بادئة‪2. 0' ‬‬
‫‪.‬األول‬

‫‪.‬يتسبب النموذج البديل في احتواء النتيجة دائمًا على فاصلة عشرية ‪ ،‬حتى لو لم تتبعها أرقام ‪3.‬‬

‫‪.‬تحدد الدقة عدد األرقام بعد الفاصلة العشرية واالفتراضية إلى ‪6‬‬

‫‪.‬يتسبب النموذج البديل في احتواء النتيجة دائ ًم ا على فاصلة عشرية ‪ ،‬وال تتم إزالة األصفار الالحقة كما لو كانت ‪4.‬‬

‫‪ .‬تحدد الدقة عدد األرقام المعنوية قبل وبعد الفاصلة العشرية واالفتراضية إلى ‪6‬‬

‫‪.‬أحرف‪ N‬يتم اقتطاع اإلخراج إلى ‪ N،‬إذا كانت الدقة ‪5.‬‬

‫‪.x.‬تم إيقاف العمل به ‪ ،‬ولكن لن تتم إزالته أثناء السلسلة ‪6. b'%s' 3‬‬

‫‪.x.‬تم إيقاف العمل به ‪ ،‬ولكن لن تتم إزالته أثناء السلسلة ‪7. b'%r' 3‬‬

‫‪ .‬ارى‪8. 237 ‬‬

‫ملحوظة‬

‫‪ ‬‬

‫‪.‬هذه الطريقة‪ ‬ال‪  ‬تعمل في مكان ‪ -‬أنها تنتج دائما كائن جديد‪ ،‬حتى لو لم يتم إجراء أية تغييرات ‪ bytearray‬ال النسخة‬

‫أنظر أيضا‬

‫‪ ‬‬

‫‪ bytearray‬إضافة‪ ٪‬تنسيق إلى بايت و ‪PEP 461 -‬‬

‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫‪ ‬مشاهدات الذاكرة‬

‫‪.‬بالوصول إلى البيانات الداخلية لكائن يدعم‪ ‬بروتوكول المخزن المؤقت‪ ‬دون نسخ ‪ Python‬تسمح الكائنات لكود‪memoryview‬‬

‫‪ ) ‬كائن ‪ memoryview( ‬فئة‬

‫يشير إلى ذلك‪ . ‬يجب أن يدعم‪ ‬الكائن‪ ‬بروتوكول المخزن المؤقت‪ .‬تتضمن الكائنات المضمنة التي ‪memoryview ‬قم بإنشاء‪ ‬كائن‬
‫‪ .bytesbytearray‬تدعم بروتوكول المخزن المؤقت‪ ‬و‬

‫على فكرة‪ ‬العنصر‪ ، ‬وهي وحدة الذاكرة الذرية التي يتعامل معها‪ L‬الكائن‪ ‬األصلي‪ . ‬بالنسبة للعديد من ‪ A ‬يحتوي‪memoryview‬‬
‫قد ‪ array.array‬يكون العنصر عبارة عن بايت واحد ‪ ،‬لكن األنواع األخرى مثل ‪ bytearray،‬و‪ bytes‬األنواع البسيطة مثل‬
‫‪.‬تحتوي على عناصر أكبر‬

‫‪Pg. 225‬‬
‫إذا كان‪ ‬الطول ‪ .1‬إذا كان‪ ‬الطول يساوي عدد العناصر في العرض‪ .‬بالنسبة لألبعاد األعلى ‪ ،‬يكون ‪ tolist. ‬يساوي طول)‪len(view‬‬
‫الطول مساويًا لطول تمثيل القائمة المتداخلة لطريقة العرض‪ .‬و‪ ‬سوف سمة تعطيك عدد البايتات في عنصر‬
‫‪.view.ndim = 0view.ndim = 1itemsize‬واحد‬

‫‪:‬التقطيع والفهرسة لكشف بياناتها‪ .‬سينتج عن التقطيع أحادي البعد عرض فرعي‪ A ‬تدعم‪memoryview‬‬

‫>>>‬

‫)'‪>>> v = memoryview(b'abcefg‬‬

‫]‪>>> v[1‬‬

‫‪98‬‬

‫]‪>>> v[-1‬‬

‫‪103‬‬

‫]‪>>> v[1:4‬‬

‫>‪<memory at 0x7f3ddc9f4350‬‬

‫)]‪>>> bytes(v[1:4‬‬

‫'‪b'bce‬‬

‫ضا دعم الفهرسة باستخدام عدد صحيح أو مجموعة‪ struct‬أحد محددات التنسيق األصلي من‪ format‬إذا كان‬ ‫الوحدة النمطية ‪ ،‬يتم أي ً‬
‫من األعداد الصحيحة وإرجاع‪ ‬عنصر‪ ‬واحد‪ ‬بالنوع الصحيح‪  .‬يمكن فهرسة مشاهدات الذاكرة أحادية البعد مع عدد صحيح أو عدد‬
‫هو ‪ ndim ‬بالضبط‪ ‬حيث‪ ndim ‬صحيح واحد‪ .‬يمكن فهرسة مشاهدات الذاكرة متعددة األبعاد مع مجموعات من‪ ‬األعداد الصحيحة‬
‫‪.‬عدد األبعاد‪  .‬يمكن فهرسة مشاهدات الذاكرة صفرية األبعاد باستخدام المجموعة الفارغة‬

‫‪:‬فيما يلي مثال بتنسيق غير بايت‬

‫>>>‬

‫‪>>> import array‬‬

‫)]‪>>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444‬‬

‫)‪>>> m = memoryview(a‬‬

‫]‪>>> m[0‬‬

‫‪-11111111‬‬

‫]‪>>> m[-1‬‬

‫‪44444444‬‬

‫)(‪>>> m[::2].tolist‬‬

‫]‪[-11111111, -33333333‬‬

‫‪:‬إذا كان الكائن األساسي قابالً للكتابة ‪ ،‬فإن عرض الذاكرة يدعم تخصيص شريحة أحادية البعد‪ .‬تغيير الحجم غير مسموح به‬

‫>>>‬

‫)'‪>>> data = bytearray(b'abcefg‬‬

‫)‪>>> v = memoryview(data‬‬

‫‪Pg. 226‬‬
>>> v.readonly

False

>>> v[0] = ord(b'z')

>>> data

bytearray(b'zbcefg')

>>> v[1:4] = b'123'

>>> data

bytearray(b'z123fg')

>>> v[2:3] = b'spam'

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: memoryview assignment: lvalue and rvalue have different structures

>>> v[2:6] = b'spam'

>>> data

bytearray(b'z1spam')

‫" عروض الذاكرة أحادية البعد لألنواع القابلة للقراءة (للقراءة فقط) ذات التنسيقات‬B" ‫" أو‬b" ‫" أو‬c" ‫يتم‬ .‫هي أيضً ا قابلة للتجزئة‬
‫تعريف التجزئة على أنها‬ :hash(m) == hash(m.tobytes())

>>>

>>> v = memoryview(b'abcefg')

>>> hash(v) == hash(b'abcefg')

True

>>> hash(v[2:4]) == hash(b'ce')

True

>>> hash(v[::-2]) == hash(b'abcefg'[::-2])

True

‫عروض الذاكرة أحادية البعد ذات التنسيقات‬ .‫يمكن اآلن تقطيع مشاهدات الذاكرة أحادية البعد‬ :3.3 ‫" تم التغيير في اإلصدار‬B" ‫أو‬
"b" ‫" أو‬c" ‫قابلة للتجزئة اآلن‬.

‫يتم اآلن تسجيل‬ :3.4 ‫ تم التغيير في اإلصدار‬Memoryview ‫تلقائيًا مع‬ collections.abc.Sequence

‫يمكن اآلن فهرسة عروض الذاكرة بمجموعة من األعداد الصحيحة‬ :3.5 ‫تم التغيير في اإلصدار‬.

memoryview ‫له عدة طرق‬:

__eq__(  ‫مصدر‬ ) 

Pg. 227
A Memoryview ‫ و‬a ‫مصدر‬ PEP 3118  ‫يكون متساويًا إذا كانت أشكاله متساوية وإذا كانت جميع القيم المقابلة متساوية عند‬
‫تفسير رموز تنسيق المعامل باستخدام‬struct‫الصيغة‬.

‫بالنسبة للمجموعة الفرعية‬ struct‫سالسل تنسيق معتمد حاليا من قبل‬ tolist()، v‫و‬ w‫متساوون إذا‬ :v.tolist() == w.tolist()

>>>

>>> import array

>>> a = array.array('I', [1, 2, 3, 4, 5])

>>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0])

>>> c = array.array('b', [5, 3, 1])

>>> x = memoryview(a)

>>> y = memoryview(b)

>>> x == a == y == b

True

>>> x.tolist() == a.tolist() == y.tolist() == b.tolist()

True

>>> z = y[::-2]

>>> z == c

True

>>> z.tolist() == c.tolist()

True

‫إذا لم يتم دعم أي من سلسلة التنسيق بواسطة‬ struct ‫ فستتم مقارنة الكائنات دائمًا على أنها غير متكافئة (حتى إذا‬، ‫الوحدة النمطية‬
)‫كانت سالسل التنسيق ومحتويات المخزن المؤقت متطابقة‬:

>>>

>>> from ctypes import BigEndianStructure, c_long

>>> class BEPoint(BigEndianStructure):

... _fields_ = [("x", c_long), ("y", c_long)]

...

>>> point = BEPoint(100, 200)

>>> a = memoryview(point)

>>> b = memoryview(point)

>>> a == point

False

>>> a == b

Pg. 228
‫‪False‬‬

‫‪ memoryview.v is wv == w‬الحظ أنه‪ ،‬كما هو الحال مع أرقام النقطة العائمة‪ ،‬لم‪ ‬يكن‪ ‬يعني‪ ‬لكائنات‬

‫‪.‬تم التغيير في اإلصدار ‪  :3.3‬قارنت اإلصدارات السابقة الذاكرة األولية بغض النظر عن تنسيق العنصر وهيكل الصفيف المنطقي‬

‫‪ ) ‬األمر‪  =  ‬ال شيء ‪tobytes( ‬‬

‫‪ memoryview.‬المُنشئ في‪ bytes‬قم بإرجاع البيانات الموجودة في المخزن المؤقت على هيئة اختبار بايت‪ .‬هذا يعادل استدعاء‬

‫>>>‬

‫)"‪>>> m = memoryview(b"abc‬‬

‫)(‪>>> m.tobytes‬‬

‫'‪b'abc‬‬

‫)‪>>> bytes(m‬‬

‫'‪b'abc‬‬

‫بالنسبة للمصفوفات غير المتجاورة ‪ ،‬تكون النتيجة مساوية لتمثيل القائمة المسطح مع تحويل جميع العناصر إلى‬
‫‪.‬بناء جملة الوحدة النمطية‪ struct‬يدعم جميع سالسل التنسيق ‪ ،‬بما في ذلك تلك التي ليست في‪. tobytes() ‬بايت‬

‫يتم تحويل بيانات المصفوفة ‪ "F" ،‬أو "‪ "C‬عندما‪ ‬يكون‪ ‬الطلب ‪ {'C'، 'F'، 'A'}. ‬جديد في اإلصدار ‪  :3.8‬الطلب‪ ‬يمكن أن يكون‬
‫نسخة طبق األصل من الذاكرة "‪ "A‬بالنسبة إلى العروض المتجاورة ‪ُ ،‬ترجع الحرف‪ Fortran. ‬أو ‪ C‬األصلية إلى ترتيب‬
‫في الذاكرة‪ .‬بالنسبة للعروض غير المتجاورة ‪ ،‬يتم تحويل البيانات إلى ‪ Fortran‬الفعلية‪ .‬على وجه الخصوص ‪ ،‬يتم االحتفاظ بترتيب‬
‫‪ = 'C' .‬أوالً‪ .‬الطلب =ال شيء‪ ‬هو نفس‪ ‬األمر ‪C‬‬

‫‪hex( [ sep  [ ، bytes_per_sep  ] ] ) ‬‬

‫‪.‬قم بإرجاع كائن سلسلة يحتوي على رقمين سداسي عشري لكل بايت في المخزن المؤقت‬

‫>>>‬

‫)"‪>>> m = memoryview(b"abc‬‬

‫)(‪>>> m.hex‬‬

‫'‪'616263‬‬

‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫يدعم )(‪ bytes.hex()، memoryview.hex‬تم التغيير في اإلصدار ‪ :3.8‬على‪ ‬غرار‬


‫‪.‬االختيارية‪ ‬إلدراج فواصل بين البايت في اإلخراج السداسي‪ bytes_per_sep ‬و‪ sep ‬اآلن‪ ‬معلمات‪L‬‬

‫)(‪tolist‬‬

‫‪.‬قم بإعادة البيانات الموجودة في المخزن المؤقت كقائمة من العناصر‬

‫>>>‬

‫)(‪>>> memoryview(b'abc').tolist‬‬

‫]‪[97, 98, 99‬‬

‫‪>>> import array‬‬

‫)]‪>>> a = array.array('d', [1.1, 2.2, 3.3‬‬

‫‪Pg. 229‬‬
‫)‪>>> m = memoryview(a‬‬

‫)(‪>>> m.tolist‬‬

‫]‪[1.1, 2.2, 3.3‬‬

‫بناء جملة الوحدة ‪ struct‬يدعم اآلن جميع التنسيقات األصلية ذات األحرف الفردية في‪:tolist() ‬تم التغيير في اإلصدار ‪3.3‬‬
‫‪.‬باإلضافة إلى التمثيالت متعددة األبعاد‬

‫)(‪toreadonly‬‬

‫‪.‬كائن عرض الذاكرة األصلي لم يتغير‪ memoryview. ‬قم بإرجاع نسخة للقراءة فقط من كائن‬

‫>>>‬

‫))'‪>>> m = memoryview(bytearray(b'abc‬‬

‫)(‪>>> mm = m.toreadonly‬‬

‫)(‪>>> mm.tolist‬‬

‫]‪[89, 98, 99‬‬

‫‪>>> mm[0] = 42‬‬

‫‪Traceback (most recent call last):‬‬

‫>‪File "<stdin>", line 1, in <module‬‬

‫‪TypeError: cannot modify read-only memory‬‬

‫‪>>> m[0] = 43‬‬

‫)(‪>>> mm.tolist‬‬

‫]‪[43, 98, 99‬‬

‫الجديد في اإلصدار ‪3.8.1‬‬


‫)(‪release‬‬

‫تتخذ العديد من الكائنات إجراءات خاصة عندما يتم ‪ memoryview. ‬حرر المخزن المؤقت األساسي المكشوف بواسطة كائن‬
‫؛‪ ‬لذلك ‪ ،‬فإن استدعاء اإلصدار () سهل )مؤق ًتا تغيير الحجم‪ a ‬قد تمنع‪ ، bytearray‬على سبيل المثال( االحتفاظ بمشاهدة عليها‬
‫‪.‬إلزالة هذه القيود (وتحرير أي موارد متدلية) في أسرع وقت ممكن‬

‫نفسها والتي يمكن تسميتها عدة)(‪ release‬باستثناء(‪ ValueError‬بعد استدعاء هذه الطريقة ‪ ،‬فإن أي عملية أخرى في العرض ترفع‬
‫‪):‬مرات‬

‫>>>‬

‫)'‪>>> m = memoryview(b'abc‬‬

‫)(‪>>> m.release‬‬

‫]‪>>> m[0‬‬

‫‪Traceback (most recent call last):‬‬

‫>‪File "<stdin>", line 1, in <module‬‬

‫‪Pg. 230‬‬
‫‪ValueError: operation forbidden on released memoryview object‬‬

‫‪:‬العبارة‪ with‬يمكن استخدام بروتوكول إدارة السياق لتحقيق تأثير مماثل ‪ ،‬باستخدام‬

‫>>>‬

‫‪>>> with memoryview(b'abc') as m:‬‬

‫‪...‬‬ ‫]‪m[0‬‬

‫‪...‬‬

‫‪97‬‬

‫]‪>>> m[0‬‬

‫‪Traceback (most recent call last):‬‬

‫>‪File "<stdin>", line 1, in <module‬‬

‫‪ValueError: operation forbidden on released memoryview object‬‬

‫الجديد في اإلصدار ‪3.2.1‬‬

‫‪ ) ‬شكل‪ ، [  ‬شكل‪cast( ]  ‬‬

‫مما يعني أن عرض ‪ [byte_length//new_itemsize]،‬إرسال عرض الذاكرة إلى شكل أو شكل جديد‪ .‬الشكل‪ ‬االفتراضي هو‬
‫النتيجة سيكون أحادي البعد‪  .‬القيمة المعادة هي طريقة عرض ذاكرة جديدة ‪ ،‬ولكن ال يتم نسخ المخزن المؤقت نفسه‪ .‬القوالب‬
‫‪ C -> 1D.‬متجاورة ومتجاورة‪D -> C - ‬المدعومة هي ‪1‬‬

‫أو "‪ "b‬أو "‪ ("B‬بناء الجملة‪ .‬يجب أن يكون أحد التنسيقات بتنسيق بايت‪ struct‬تنسيق الوجهة مقيد بتنسيق أصلي لعنصر واحد في‬
‫‪.‬يجب أن يكون طول البايت الناتج هو نفس الطول األصلي‪"c"). ‬‬

‫‪:‬بايت غير موقعة ‪D /‬طويل إلى ‪D / 1‬إرسال ‪1‬‬

‫>>>‬

‫‪>>> import array‬‬

‫)]‪>>> a = array.array('l', [1,2,3‬‬

‫)‪>>> x = memoryview(a‬‬

‫‪>>> x.format‬‬

‫'‪'l‬‬

‫‪>>> x.itemsize‬‬

‫‪8‬‬

‫)‪>>> len(x‬‬

‫‪3‬‬

‫‪>>> x.nbytes‬‬

‫‪24‬‬

‫)'‪>>> y = x.cast('B‬‬

‫‪Pg. 231‬‬
>>> y.format

'B'

>>> y.itemsize

>>> len(y)

24

>>> y.nbytes

24

1 ‫إرسال‬D / 1 ‫بايت غير موقعة إلى‬D / ‫حرف‬:

>>>

>>> b = bytearray(b'zyz')

>>> x = memoryview(b)

>>> x[0] = b'a'

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: memoryview: invalid value for format "B"

>>> y = x.cast('c')

>>> y[0] = b'a'

>>> b

bytearray(b'ayz')

1 ‫إرسال‬D / 3 ‫بايت إلى‬D / ints 1 ‫إلى‬D / ‫حرف موقع‬:

>>>

>>> import struct

>>> buf = struct.pack("i"*12, *list(range(12)))

>>> x = memoryview(buf)

>>> y = x.cast('i', shape=[2,2,3])

>>> y.tolist()

[[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]

>>> y.format

'i'

>>> y.itemsize

Pg. 232
4

>>> len(y)

>>> y.nbytes

48

>>> z = y.cast('b')

>>> z.format

'b'

>>> z.itemsize

>>> len(z)

48

>>> z.nbytes

48

Cast 1D / 2 ‫بدون توقيع طويل إلى‬D / ‫بدون توقيع طويل‬:

>>>

>>> buf = struct.pack("L"*6, *list(range(6)))

>>> x = memoryview(buf)

>>> y = x.cast('L', shape=[2,3])

>>> len(y)

>>> y.nbytes

48

>>> y.tolist()

[[0, 1, 2], [3, 4, 5]]

3.3.1 ‫الجديد في اإلصدار‬

‫لم يعد تنسيق المصدر مقي ًدا عند اإلرسال إلى عرض بايت‬ :3.5 ‫تم التغيير في اإلصدار‬.

There are also several readonly attributes available:

obj

The underlying object of the memoryview:

>>>

Pg. 233
>>> b = bytearray(b'xyz')

>>> m = memoryview(b)

>>> m.obj is b

True

New in version 3.3.

nbytes

nbytes == product(shape) * itemsize == len(m.tobytes()). This is the amount of space in bytes that the


array would use in a contiguous representation. It is not necessarily equal to len(m):

>>>

>>> import array

>>> a = array.array('i', [1,2,3,4,5])

>>> m = memoryview(a)

>>> len(m)

>>> m.nbytes

20

>>> y = m[::2]

>>> len(y)

>>> y.nbytes

12

>>> len(y.tobytes())

12

Multi-dimensional arrays:

>>>

>>> import struct

>>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)])

>>> x = memoryview(buf)

>>> y = x.cast('d', shape=[3,4])

>>> y.tolist()

[[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]]

Pg. 234
>>> len(y)

>>> y.nbytes

96

New in version 3.3.

readonly

A bool indicating whether the memory is read only.

format

A string containing the format (in struct module style) for each element in the view. A memoryview
can be created from exporters with arbitrary format strings, but some methods (e.g. tolist()) are
restricted to native single element formats.

Changed in version 3.3:  format 'B' is now handled according to the struct module syntax. This means
that memoryview(b'abc')[0] == b'abc'[0] == 97.

itemsize

The size in bytes of each element of the memoryview:

>>>

>>> import array, struct

>>> m = memoryview(array.array('H', [32000, 32001, 32002]))

>>> m.itemsize

>>> m[0]

32000

>>> struct.calcsize('H') == m.itemsize

True

ndim

An integer indicating how many dimensions of a multi-dimensional array the memory represents.

shape

A tuple of integers the length of ndim giving the shape of the memory as an N-dimensional array.

Changed in version 3.3:  An empty tuple instead of None when ndim = 0.

strides

A tuple of integers the length of ndim giving the size in bytes to access each element for each
dimension of the array.

Pg. 235
Changed in version 3.3:  An empty tuple instead of None when ndim = 0.

suboffsets

Used internally for PIL-style arrays. The value is informational only.

c_contiguous

A bool indicating whether the memory is C-contiguous.

New in version 3.3.

f_contiguous

A bool indicating whether the memory is Fortran contiguous.

New in version 3.3.

contiguous

A bool indicating whether the memory is contiguous.

New in version 3.3.

Set Types — set, frozenset

A set object is an unordered collection of distinct hashable objects. Common uses include


membership testing, removing duplicates from a sequence, and computing mathematical operations
such as intersection, union, difference, and symmetric difference. (For other containers see the built-
in dict, list, and tuple classes, and the collections module.)

Like other collections, sets support x in set, len(set), and for x in set. Being an unordered collection,


sets do not record element position or order of insertion. Accordingly, sets do not support indexing,
slicing, or other sequence-like behavior.

There are currently two built-in set types, set and frozenset. The set type is mutable — the contents
can be changed using methods like add() and remove(). Since it is mutable, it has no hash value and
cannot be used as either a dictionary key or as an element of another set. The frozenset type is
immutable and hashable — its contents cannot be altered after it is created; it can therefore be used
as a dictionary key or as an element of another set.

Non-empty sets (not frozensets) can be created by placing a comma-separated list of elements
within braces, for example: {'jack', 'sjoerd'}, in addition to the set constructor.

The constructors for both classes work the same:

class  set([iterable])

class  frozenset([iterable])

Return a new set or frozenset object whose elements are taken from iterable. The elements of a set
must be hashable. To represent sets of sets, the inner sets must be frozenset objects. If iterable is not
specified, a new empty set is returned.

Sets can be created by several means:

 Use a comma-separated list of elements within braces: {'jack', 'sjoerd'}

Pg. 236
 Use a set comprehension: {c for c in 'abracadabra' if c not in 'abc'}

 Use the type constructor: set(), set('foobar'), set(['a', 'b', 'foo'])

Instances of set and frozenset provide the following operations:

len(s)

Return the number of elements in set s (cardinality of s).

x in s

Test x for membership in s.

x not in s

Test x for non-membership in s.

isdisjoint(other)

Return True if the set has no elements in common with other. Sets are disjoint if and only if their
intersection is the empty set.

issubset(other)

set <= other

Test whether every element in the set is in other.

set < other

Test whether the set is a proper subset of other, that is, set <= other and set != other.

issuperset(other)

set >= other

Test whether every element in other is in the set.

set > other

Test whether the set is a proper superset of other, that is, set >= other and set != other.

union(*others)

set | other | ...

Return a new set with elements from the set and all others.

intersection(*others)

set & other & ...

Return a new set with elements common to the set and all others.

difference(*others)

set - other - ...

Return a new set with elements in the set that are not in the others.

Pg. 237
symmetric_difference(other)

set ^ other

Return a new set with elements in either the set or other but not both.

copy()

Return a shallow copy of the set.

Note, the non-operator versions


of union(), intersection(), difference(), symmetric_difference(), issubset(), and issuperset() methods
will accept any iterable as an argument. In contrast, their operator based counterparts require their
arguments to be sets. This precludes error-prone constructions like set('abc') & 'cbs' in favor of the
more readable set('abc').intersection('cbs').

Both set and frozenset support set to set comparisons. Two sets are equal if and only if every
element of each set is contained in the other (each is a subset of the other). A set is less than another
set if and only if the first set is a proper subset of the second set (is a subset, but is not equal). A set is
greater than another set if and only if the first set is a proper superset of the second set (is a
superset, but is not equal).

Instances of set are compared to instances of frozenset based on their members. For


example, set('abc') == frozenset('abc') returns True and so does set('abc') in set([frozenset('abc')]).

The subset and equality comparisons do not generalize to a total ordering function. For example, any
two nonempty disjoint sets are not equal and are not subsets of each other, so all of the following
return False: a<b, a==b, or a>b.

Since sets only define partial ordering (subset relationships), the output of the list.sort() method is
undefined for lists of sets.

Set elements, like dictionary keys, must be hashable.

Binary operations that mix set instances with frozenset return the type of the first operand. For
example: frozenset('ab') | set('bc') returns an instance of frozenset.

The following table lists operations available for set that do not apply to immutable instances
of frozenset:

update(*others)

set |= other | ...

Update the set, adding elements from all others.

intersection_update(*others)

set &= other & ...

Update the set, keeping only elements found in it and all others.

difference_update(*others)

set -= other | ...

Update the set, removing elements found in others.

Pg. 238
symmetric_difference_update(other)

set ^= other

Update the set, keeping only elements found in either set, but not in both.

add(elem)

Add element elem to the set.

remove(elem)

Remove element elem from the set. Raises KeyError if elem is not contained in the set.

discard(elem)

Remove element elem from the set if it is present.

pop()

Remove and return an arbitrary element from the set. Raises KeyError if the set is empty.

clear()

Remove all elements from the set.

Note, the non-operator versions of the update(), intersection_update(), difference_update(),


and symmetric_difference_update() methods will accept any iterable as an argument.

Note, the elem argument to the __contains__(), remove(), and discard() methods may be a set. To


support searching for an equivalent frozenset, a temporary one is created from elem.

Mapping Types — dict

A mapping object maps hashable values to arbitrary objects. Mappings are mutable objects. There is


currently only one standard mapping type, the dictionary. (For other containers see the built-
in list, set, and tuple classes, and the collections module.)

A dictionary’s keys are almost arbitrary values. Values that are not hashable, that is, values
containing lists, dictionaries or other mutable types (that are compared by value rather than by
object identity) may not be used as keys. Numeric types used for keys obey the normal rules for
numeric comparison: if two numbers compare equal (such as 1 and 1.0) then they can be used
interchangeably to index the same dictionary entry. (Note however, that since computers store
floating-point numbers as approximations it is usually unwise to use them as dictionary keys.)

Dictionaries can be created by placing a comma-separated list of key: value pairs within braces, for
example: {'jack': 4098, 'sjoerd': 4127} or {4098: 'jack', 4127: 'sjoerd'}, or by the dict constructor.

class  dict(**kwarg)

class  dict(mapping, **kwarg)

class  dict(iterable, **kwarg)

Return a new dictionary initialized from an optional positional argument and a possibly empty set of
keyword arguments.

Dictionaries can be created by several means:

Pg. 239
 Use a comma-separated list of key: value pairs within
braces: {'jack': 4098, 'sjoerd': 4127} or {4098: 'jack', 4127: 'sjoerd'}

 Use a dict comprehension: {}, {x: x ** 2 for x in range(10)}

 Use the type constructor: dict(), dict([('foo', 100), ('bar', 200)]), dict(foo=100, bar=200)

If no positional argument is given, an empty dictionary is created. If a positional argument is given


and it is a mapping object, a dictionary is created with the same key-value pairs as the mapping
object. Otherwise, the positional argument must be an iterable object. Each item in the iterable must
itself be an iterable with exactly two objects. The first object of each item becomes a key in the new
dictionary, and the second object the corresponding value. If a key occurs more than once, the last
value for that key becomes the corresponding value in the new dictionary.

If keyword arguments are given, the keyword arguments and their values are added to the dictionary
created from the positional argument. If a key being added is already present, the value from the
keyword argument replaces the value from the positional argument.

To illustrate, the following examples all return a dictionary equal to {"one": 1, "two": 2, "three": 3}:

>>>

>>> a = dict(one=1, two=2, three=3)

>>> b = {'one': 1, 'two': 2, 'three': 3}

>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))

>>> d = dict([('two', 2), ('one', 1), ('three', 3)])

>>> e = dict({'three': 3, 'one': 1, 'two': 2})

>>> f = dict({'one': 1, 'three': 3}, two=2)

>>> a == b == c == d == e == f

True

Providing keyword arguments as in the first example only works for keys that are valid Python
identifiers. Otherwise, any valid keys can be used.

These are the operations that dictionaries support (and therefore, custom mapping types should
support too):

list(d)

Return a list of all the keys used in the dictionary d.

len(d)

Return the number of items in the dictionary d.

d[key]

Return the item of d with key key. Raises a KeyError if key is not in the map.

If a subclass of dict defines a method __missing__() and key is not present, the d[key] operation calls


that method with the key key as argument. The d[key] operation then returns or raises whatever is

Pg. 240
returned or raised by the __missing__(key) call. No other operations or methods
invoke __missing__(). If __missing__() is not defined, KeyError is raised. __missing__() must be a
method; it cannot be an instance variable:

>>>

>>> class Counter(dict):

... def __missing__(self, key):

... return 0

>>> c = Counter()

>>> c['red']

>>> c['red'] += 1

>>> c['red']

The example above shows part of the implementation of collections.Counter. A


different __missing__ method is used by collections.defaultdict.

d[key] = value

Set d[key] to value.

del d[key]

Remove d[key] from d. Raises a KeyError if key is not in the map.

key in d

Return True if d has a key key, else False.

key not in d

Equivalent to not key in d.

iter(d)

Return an iterator over the keys of the dictionary. This is a shortcut for iter(d.keys()).

clear()

Remove all items from the dictionary.

copy()

Return a shallow copy of the dictionary.

classmethod  fromkeys(iterable[, value])

Create a new dictionary with keys from iterable and values set to value.

Pg. 241
fromkeys() is a class method that returns a new dictionary. value defaults to None. All of the values
refer to just a single instance, so it generally doesn’t make sense for value to be a mutable object
such as an empty list. To get distinct values, use a dict comprehension instead.

get(key[, default])

Return the value for key if key is in the dictionary, else default. If default is not given, it defaults
to None, so that this method never raises a KeyError.

items()

Return a new view of the dictionary’s items ((key, value) pairs). See the documentation of view
objects.

keys()

Return a new view of the dictionary’s keys. See the documentation of view objects.

pop(key[, default])

If key is in the dictionary, remove it and return its value, else return default. If default is not given
and key is not in the dictionary, a KeyError is raised.

popitem()

Remove and return a (key, value) pair from the dictionary. Pairs are returned in LIFO order.

popitem() is useful to destructively iterate over a dictionary, as often used in set algorithms. If the
dictionary is empty, calling popitem() raises a KeyError.

Changed in version 3.7:  LIFO order is now guaranteed. In prior versions, popitem() would return an
arbitrary key/value pair.

reversed(d)

Return a reverse iterator over the keys of the dictionary. This is a shortcut for reversed(d.keys()).

New in version 3.8.

setdefault(key[, default])

If key is in the dictionary, return its value. If not, insert key with a value of default and
return default. default defaults to None.

update([other])

Update the dictionary with the key/value pairs from other, overwriting existing keys. Return None.

update() accepts either another dictionary object or an iterable of key/value pairs (as tuples or other
iterables of length two). If keyword arguments are specified, the dictionary is then updated with
those key/value pairs: d.update(red=1, blue=2).

values()

Return a new view of the dictionary’s values. See the documentation of view objects.

An equality comparison between one dict.values() view and another will always return False. This
also applies when comparing dict.values() to itself:

Pg. 242
‫>>>‬

‫}‪>>> d = {'a': 1‬‬

‫)(‪>>> d.values() == d.values‬‬

‫‪False‬‬

‫‪d | other‬‬

‫إنشاء قاموس جديد مع المفاتيح والقيم المدمجة من‪ ‬د‪ ‬و‪ ‬اآلخر‪ ، ‬الذي يجب أن يكون كل من القواميس‪ .‬قيم‪ ‬أخرى‪ ‬ذات أولوية اتخاذها‬
‫‪.‬عند‪ ‬د‪ ‬و‪ ‬غيرها من‪ ‬مفاتيح األسهم‬

‫الجديد في اإلصدار ‪3.9.1‬‬

‫‪d |= other‬‬

‫أزواج مفتاح ‪ /‬قيمة‪ .‬قيم‪ ‬أخرى‪ ‬ذات‪ iterable ‬تحديث القاموس‪ ‬د‪ ‬مع المفاتيح والقيم من‪ ‬اآلخر‪ ، ‬والذي قد يكون إما‪ ‬رسم الخرائط‪ ‬أو‬
‫‪.‬أولوية اتخاذها عند‪ ‬د‪ ‬و‪ ‬غيرها من‪ ‬مفاتيح األسهم‬

‫الجديد في اإلصدار ‪3.9.1‬‬

‫>' ‪ ('<'، '<='،‬تقارن القواميس بالتساوي إذا وفقط إذا كان لديهم نفس‪ ‬األزواج (بغض النظر عن الترتيب)‪ .‬زيادة مقارنات الطلبات‬
‫‪='، '>') .(key, value)TypeError‬‬

‫‪.‬تحافظ القواميس على ترتيب اإلدراج‪ .‬الحظ أن تحديث مفتاح ال يؤثر على األمر‪ .‬يتم إدخال المفاتيح المضافة بعد الحذف في النهاية‬

‫>>>‬

‫}‪>>> d = {"one": 1, "two": 2, "three": 3, "four": 4‬‬

‫‪>>> d‬‬

‫}‪{'one': 1, 'two': 2, 'three': 3, 'four': 4‬‬

‫)‪>>> list(d‬‬

‫]'‪['one', 'two', 'three', 'four‬‬

‫))(‪>>> list(d.values‬‬

‫]‪[1, 2, 3, 4‬‬

‫‪>>> d["one"] = 42‬‬

‫‪>>> d‬‬

‫}‪{'one': 42, 'two': 2, 'three': 3, 'four': 4‬‬

‫]"‪>>> del d["two‬‬

‫‪>>> d["two"] = None‬‬

‫‪>>> d‬‬

‫}‪{'one': 42, 'three': 3, 'four': 4, 'two': None‬‬

‫من ‪ CPython‬تم التغيير في اإلصدار ‪ :3.7‬ترتيب القاموس مضمون ليكون ترتيبًا لإلدراج‪ .‬كان هذا السلوك أحد تفاصيل تطبيق‬
‫‪3.6.‬‬

‫‪.‬القواميس وطرق عرض القاموس قابلة للعكس‬

‫‪Pg. 243‬‬
‫>>>‬

‫}‪>>> d = {"one": 1, "two": 2, "three": 3, "four": 4‬‬

‫‪>>> d‬‬

‫}‪{'one': 1, 'two': 2, 'three': 3, 'four': 4‬‬

‫))‪>>> list(reversed(d‬‬

‫]'‪['four', 'three', 'two', 'one‬‬

‫)))(‪>>> list(reversed(d.values‬‬

‫]‪[4, 3, 2, 1‬‬

‫)))(‪>>> list(reversed(d.items‬‬

‫])‪[('four', 4), ('three', 3), ('two', 2), ('one', 1‬‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.8‬أصبحت‪ ‬القواميس اآلن قابلة للعكس‬

‫أنظر أيضا‬

‫‪ ‬‬

‫‪ dict.‬يمكن استخدامها إلنشاء عرض للقراءة فقط لملف‪types.MappingProxyType‬‬

‫‪ ‬كائنات عرض القاموس‬

‫هي‪ ‬عرض األشياء‪ . ‬توفر طريقة عرض ديناميكية إلدخاالت )(‪ dict.items‬و)(‪ dict.keys()، dict.values‬الكائنات التي أرجعها‬


‫‪.‬القاموس ‪ ،‬مما يعني أنه عندما يتغير القاموس ‪ ،‬فإن طريقة العرض تعكس هذه التغييرات‬

‫‪:‬يمكن تكرار طرق عرض القاموس لتقديم البيانات الخاصة بها ‪ ،‬ودعم اختبارات العضوية‬

‫)‪len(dictview‬‬

‫‪.‬أعد عدد اإلدخاالت في القاموس‬

‫)‪iter(dictview‬‬

‫)‪.(key, value‬أعد مكررً ا فوق المفاتيح أو القيم أو العناصر (ممثلة في مجموعات من‪ ) ‬في القاموس‬

‫‪ .‬يتم تكرار المفاتيح والقيم بترتيب اإلدراج‪ .‬هذا يسمح لخلق‪ ‬األزواج باستخدام‪ . : ‬هناك طريقة أخرى إلنشاء نفس القائمة وهي‬
‫])(‪(value, key)zip()pairs = zip(d.values(), d.keys())pairs = [(v, k) for (k, v) in d.items‬‬

‫تكرار العروض‪ ‬أثناء إضافة أو حذف اإلدخاالت في القاموس إلى رفع‪ ‬أو فشل في تكرار جميع ‪ RuntimeError‬قد يؤدي‬
‫‪.‬اإلدخاالت‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.7‬ترتيب القاموس مضمون ليكون ترتيبًا لإلدراج‬

‫‪x in dictview‬‬

‫‪Return True if x is in the underlying dictionary’s keys, values or items (in the latter case, x should be‬‬
‫‪a (key, value) tuple).‬‬

‫)‪reversed(dictview‬‬

‫‪Return a reverse iterator over the keys, values or items of the dictionary. The view will be iterated in‬‬
‫‪reverse order of the insertion.‬‬

‫‪Pg. 244‬‬
Changed in version 3.8:  Dictionary views are now reversible.

dictview.mapping

Return a types.MappingProxyType that wraps the original dictionary to which the view refers.

New in version 3.10.

‫األزواج‬ ‫ بحيث تكون‬، ‫إذا كانت جميع القيم قابلة للتجزئة‬ .‫يتم تعيين طرق عرض المفاتيح نظرً ا ألن إدخاالتها فريدة وقابلة للتجزئة‬
‫ (ال يتم التعامل مع وجهات النظر القيم كمجموعة مثل منذ اإلدخاالت هي‬ .‫ فسيتم تعيين عرض العناصر أيضًا‬، ‫فريدة وقابلة للتجزئة‬
‫متوفرة (على سبيل‬ ‫ مجردة‬L‫ وجميع العمليات المحددة للفئة األساسية‬،‫) لمجموعة مثل جهات النظر‬.‫عموما ليست فريدة من نوعها‬
) ‫ أو‬، ، ،‫المثال‬.(key, value)collections.abc.Set==<^

‫مثال على استخدام عرض القاموس‬:

>>>

>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}

>>> keys = dishes.keys()

>>> values = dishes.values()

>>> # iteration

>>> n = 0

>>> for val in values:

... n += val

>>> print(n)

504

>>> # keys and values are iterated over in the same order (insertion order)

>>> list(keys)

['eggs', 'sausage', 'bacon', 'spam']

>>> list(values)

[2, 1, 1, 500]

>>> # view objects are dynamic and reflect dict changes

>>> del dishes['eggs']

>>> del dishes['sausage']

>>> list(keys)

['bacon', 'spam']

Pg. 245
‫‪>>> # set operations‬‬

‫}'‪>>> keys & {'eggs', 'bacon', 'salad‬‬

‫}'‪{'bacon‬‬

‫}'‪>>> keys ^ {'sausage', 'juice‬‬

‫}'‪{'juice', 'sausage', 'bacon', 'spam‬‬

‫‪>>> # get back a read-only proxy for the original dictionary‬‬

‫‪>>> values.mapping‬‬

‫)}‪mappingproxy({'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500‬‬

‫]'‪>>> values.mapping['spam‬‬

‫‪500‬‬

‫‪ ‬أنواع مدير السياق‬

‫يدعم بيان‪ ‬بايثون‪ ‬مفهوم سياق وقت التشغيل الذي يحدده مدير السياق‪  .‬يتم تنفيذ ذلك باستخدام زوج من الطرق التي تسمح للفئات‪with‬‬
‫‪:‬المعرفة من قبل المستخدم بتعريف سياق وقت التشغيل الذي يتم إدخاله قبل تنفيذ نص العبارة والخروج منه عند انتهاء العبارة‬

‫)(__‪contextmanager.__enter‬‬

‫أدخل سياق وقت التشغيل وقم بإرجاع هذا الكائن أو كائن آخر مرتبط بسياق وقت التشغيل‪ .‬ترتبط القيمة التي يتم إرجاعها بواسطة‬
‫‪.‬العبارات باستخدام مدير السياق هذا‪ with‬عبارة‪ as‬هذه الطريقة بالمعرف في‬

‫باستخدامها)(‪ open‬للسماح )( __ ‪ __enter‬مثال على مدير السياق الذي يقوم بإرجاع نفسه هو‪ ‬كائن ملف‪ . ‬تعود كائنات الملف من‬
‫‪.‬تعليمة‪ with‬كتعبير سياق في‬

‫يقوم هؤالء ‪ decimal.localcontext(). ‬مثال على مدير السياق الذي يقوم بإرجاع كائن مرتبط هو الذي تم إرجاعه بواسطة‬
‫المديرون بتعيين السياق العشري النشط إلى نسخة من السياق العشري األصلي ثم إرجاع النسخة‪ .‬يسمح هذا بإجراء تغييرات على‬
‫‪.‬العبارة‪ with‬العبارة دون التأثير على الكود خارج‪ with‬السياق العشري الحالي في نص‬

‫‪contextmanager.__exit__( exc_type ، exc_val ، exc_tb ) ‬‬

‫اخرج من سياق وقت التشغيل وأعد عالمة منطقية تشير إلى ما إذا كان يجب منع أي استثناء حدث‪ .‬إذا حدث استثناء أثناء تنفيذ‬
‫‪  None.‬العبارة ‪ ،‬فستحتوي الوسيطات على نوع االستثناء والقيمة ومعلومات التتبع‪ .‬خالف ذلك ‪ ،‬كل الحجج الثالث‪ with‬نص‬

‫العبارة بمنع االستثناء ومتابعة التنفيذ مع العبارة التي تلي العبارة ‪ with‬سيؤدي إرجاع قيمة حقيقية من هذه الطريقة إلى قيام‬
‫وإال فسيستمر االستثناء في االنتشار بعد انتهاء تنفيذ هذا األسلوب‪  .‬االستثناءات التي تحدث أثناء تنفيذ هذه الطريقة ‪ with. ‬مباشرة‬
‫‪.‬البيان‪ with‬ستحل محل أي استثناء حدث في نص‬

‫ال يجب إعادة االستثناء الذي تم تمريره بشكل صريح ‪ -‬بدالً من ذلك ‪ ،‬يجب أن ُترجع هذه الطريقة قيمة خاطئة لإلشارة إلى أن‬
‫الطريقة قد اكتملت بنجاح وال تريد منع االستثناء الذي تم طرحه‪ .‬يسمح هذا لكود إدارة السياق باكتشاف ما إذا‬
‫‪ .‬الطريقة قد فشلت بالفعل‪ ‬أم ال‪ __exit__() ‬كانت‬

‫العديد من مديري السياق لدعم المزامنة السهلة للخيط ‪ ،‬واإلغالق الفوري للملفات أو الكائنات األخرى ‪ ،‬ومعالجة ‪ Python‬تحدد‬
‫أبسط للسياق الحسابي العشري النشط‪  .‬ال يتم التعامل مع األنواع المحددة بشكل خاص بعد تنفيذها لبروتوكول إدارة‬
‫‪.‬الوحدة للحصول على بعض األمثلة‪ contextlib‬السياق‪ .‬انظر‬

‫‪Pg. 246‬‬
‫الديكور توفر وسيلة مريحة لتنفيذ هذه البروتوكوالت‪ .‬إذا زينت وظيفة ‪ contextlib.contextmanager‬بايثون‪ ‬مولد‪ ‬الصورة و‬
‫سائل‪ __exit__() ،‬و)(__‪ __enter‬الديكور‪ ،‬فإنه سيعود مدير سياق تنفيذ ما يلزم من‪ contextlib.contextmanager‬مولد مع‬
‫‪.‬وليس مكرر التي تنتجها وظيفة مولد غير مزخرفة‬

‫يجب أن توفر أنواع ‪ Python / C API. ‬في ‪ Python‬الحظ أنه ال توجد فتحة محددة ألي من هذه الطرق في بنية النوع لكائنات‬
‫بالمقارنة مع النفقات العامة‪ Python.  L‬االمتدادات التي ترغب في تعريف هذه الطرق كطريقة عادية يمكن الوصول إليها من خالل‬
‫‪.‬إلعداد سياق وقت التشغيل ‪ ،‬فإن الحمل الزائد للبحث في قاموس فئة واحدة ال يكاد يذكر‬

‫اكتب أنواع التعليقات التوضيحية ‪ -‬االسم المستعار العام‪ ، ‬االتحاد‬

‫‪ .‬جوهر المدمج في أنواع ل‪ ‬نوع الشروح‪ ‬و‪ ‬عام االسم المستعار‪ ‬و‪ ‬االتحاد‬

‫‪ ‬نوع االسم المستعار العام‬

‫وهي مخصصة في المقام ‪ list[int]. ‬يتم إنشاء الكائنات عن طريق إدراج فئة (عاد ًة ما تكون حاوية) ‪ ،‬مثل‪GenericAlias‬‬
‫‪ .‬األول‪ ‬لنوع التعليقات التوضيحية‬

‫الكائن‪ .‬ومع ذلك ‪ ،‬فإن االشتراك في بعض فئات الحاويات قد )(__‪ __getitem‬عاد ًة ما‪ ‬يستدعي‪ ‬اشتراك‪ ‬كائنات الحاوية طريقة‬
‫يجب أن‪ ‬يقوم)(__‪. __class_getitem‬الفصل الدراسي بدالً من ذلك)(__‪ __class_getitem‬يستدعي أسلوب‬
‫‪.‬كائن‪ GenericAlias‬بإرجاع‪classmethod ‬‬

‫ملحوظة‬

‫‪ ‬‬

‫( المحدد في الفصل)(__‪ __class_getitem‬للفئة موجودة ‪ ،‬فستكون لها األسبقية على ‪ __getitem__()metaclass‬إذا كانت‬


‫‪).‬لمزيد من التفاصيل‪ PEP 560 ‬انظر‬

‫يعمل الكائن كبديل ل‪ ‬أنواع العامة‪ ، ‬وتنفيذ‪ ‬األدوية معلمات‪ -  L‬على سبيل المثال تحديدا من عام والذي يوفر أنواع ‪ GenericAlias‬و‬
‫‪.‬لعناصر الحاوية‬

‫واستخدامه ‪ types.GenericAlias‬يمكن الوصول إلى‪ ‬النوع الذي يتعرض له المستخدم‪ ‬للكائن من‪GenericAlias‬‬


‫‪.‬كائنات مباشرة‪ GenericAlias‬عمليات التحقق‪ .‬يمكن استخدامه أي ً‬
‫ضا إلنشاء)(‪ isinstance‬في‬

‫]‪T[X, Y, ...‬‬
‫ً‬
‫اعتمادا على‪ Y ‬و‪ X ‬يحتوي على عناصر من األنواع‪ T‬يمثل نوعًا‪ GenericAlias‬يُنشئ نوعًا‬ ‫المستخدم‪ .‬على سبيل المثال ‪ T،‬والمزيد‬
‫‪ float:‬محتوية‪ list‬دالة تتوقع وجود‪ ‬عناصر‬

‫‪def average(values: list[float]) -> float:‬‬

‫)‪return sum(values) / len(values‬‬

‫وهو نوع عام يتوقع معلمتين من النوع يمثالن نوع المفتاح ونوع القيمة‪ .‬في هذا المثال ‪ a dict،‬مثال آخر‪ ‬لتعيين‪ ‬الكائنات ‪ ،‬باستخدام‬
‫‪ int:‬وقيم النوع‪ str‬مفاتيح من النوع‪ ، dict‬تتوقع الوظيفة وجود‬

‫‪def send_post_request(url: str, body: dict[str, int]) -> None:‬‬

‫‪...‬‬

‫‪:‬أنواع لحجتهم الثانية‪ GenericAlias‬ال تقبل)(‪ issubclass‬و)(‪ isinstance‬وظائف المضمن‬

‫>>>‬

‫)]‪>>> isinstance([1, 2], list[str‬‬

‫‪Traceback (most recent call last):‬‬

‫‪Pg. 247‬‬
‫>‪File "<stdin>", line 1, in <module‬‬

‫‪TypeError: isinstance() argument 2 cannot be a parameterized generic‬‬

‫كتابة التعليقات التوضيحية‪  . ‬يمتد هذا إلى األنواع العامة ومعلمات النوع الخاصة بها‪ .‬عند إنشاء ‪ Python ‬ال يفرض وقت تشغيل‬
‫ال يتم التحقق من عناصر الحاوية مقابل نوعها‪ .‬على سبيل المثال ‪ ،‬ال يُنصح باستخدام الكود التالي ‪ a GenericAlias، ،‬كائن من‬
‫‪:‬ولكنه سيعمل بدون أخطاء‬

‫>>>‬

‫]‪>>> t = list[str‬‬

‫)]‪>>> t([1, 2, 3‬‬

‫]‪[1, 2, 3‬‬

‫‪:‬عالوة على ذلك ‪ ،‬تمسح األدوية ذات المعلمات معلمات النوع أثناء إنشاء الكائن‬

‫>>>‬

‫]‪>>> t = list[str‬‬

‫)‪>>> type(t‬‬

‫>'‪<class 'types.GenericAlias‬‬

‫)(‪>>> l = t‬‬

‫)‪>>> type(l‬‬

‫>'‪<class 'list‬‬

‫‪:‬على عام نوع المعلمات)(‪ str‬أو)(‪ repr‬يظهر‪ ‬االتصال‬

‫>>>‬

‫)]‪>>> repr(list[int‬‬

‫']‪'list[int‬‬

‫)]‪>>> str(list[int‬‬

‫']‪'list[int‬‬

‫‪ dict[str][str]:‬سوف طريقة الوراثة رفع استثناء من األخطاء عدم السماح مثل)(__‪ __getitem‬و‬

‫>>>‬

‫]‪>>> dict[str][str‬‬

‫‪Traceback (most recent call last):‬‬

‫>‪File "<stdin>", line 1, in <module‬‬

‫]‪TypeError: There are no type variables left in dict[str‬‬

‫‪Pg. 248‬‬
‫يجب أن يحتوي الفهرس على العديد من العناصر حيث توجد‬ . ‫متغيرات النوع‬ ‫استخدام‬ ‫ تكون هذه التعبيرات صالحة عند‬، ‫ومع ذلك‬
‫عناصر متغيرة من النوع في‬ GenericAlias‫الكائن‬ __args__.

>>>

>>> from typing import TypeVar

>>> Y = TypeVar('Y')

>>> dict[str, Y][int]

dict[str, int]

‫المجموعات العامة القياسية‬ 

L‫تدعم مجموعات المكتبة القياسية هذه األدوية ذات المعلمات‬.

 tuple

 list

 dict

 set

 frozenset

 type

 collections.deque

 collections.defaultdict

 collections.OrderedDict

 collections.Counter

 collections.ChainMap

 collections.abc.Awaitable

 collections.abc.Coroutine

 collections.abc.AsyncIterable

 collections.abc.AsyncIterator

 collections.abc.AsyncGenerator

 collections.abc.Iterable

 collections.abc.Iterator

 collections.abc.Generator

 collections.abc.Reversible

 collections.abc.Container

 collections.abc.Collection

Pg. 249
 collections.abc.Callable

 collections.abc.Set

 collections.abc.MutableSet

 collections.abc.Mapping

 collections.abc.MutableMapping

 collections.abc.Sequence

 collections.abc.MutableSequence

 collections.abc.ByteString

 collections.abc.MappingView

 collections.abc.KeysView

 collections.abc.ItemsView

 collections.abc.ValuesView

 contextlib.AbstractContextManager

 contextlib.AbstractAsyncContextManager

 ‫إعادة النمط‬
 ‫مباراة العودة‬
‫ الخاصة لالسم المستعار العام‬L‫السمات‬ 

‫تطبق جميع األدوية ذات المعلمات سمات خاصة للقراءة فقط‬.

genericalias.__origin__

‫تشير هذه السمة إلى فئة عامة غير معلمة‬:

>>>

>>> list[int].__origin__

<class 'list'>

genericalias.__args__

‫هذه السمة هي‬ tuple(1 ‫من األنواع العامة التي تم تمريرها إلى )من المحتمل بطول‬ __class_getitem__()  ‫الحاوية‬
‫األصلية‬ ‫العامة‬ :

>>>

>>> dict[str, list[int]].__args__

(<class 'str'>, list[int])

genericalias.__parameters__

‫هذه السمة عبارة عن مجموعة تم حسابها بشكل كسول (ربما فارغة) لمتغيرات النوع الفريدة الموجودة في‬ __args__:

Pg. 250
‫>>>‬

‫‪>>> from typing import TypeVar‬‬

‫)'‪>>> T = TypeVar('T‬‬

‫__‪>>> list[T].__parameters‬‬

‫)‪(~T,‬‬

‫ملحوظة‬

‫‪ ‬‬

‫بعد استبدال __‪ __parameters‬المعلمات‪ L‬قد ال يكون الصحيح‪ typing.ParamSpec‬الكائن مع‪A GenericAlias‬‬


‫‪.‬المقصود في المقام األول لنوع ثابت التحقق‪ typing.ParamSpec‬ألن‬

‫أنظر أيضا‬

‫‪‬‬ ‫"في المجموعات القياسية ‪ Generics‬كتابة التلميحات" ‪PEP 585 -‬‬

‫‪‬‬ ‫‪.‬تستخدم لتنفيذ األدوية ذات المعلمات ‪__class_getitem__() -‬‬

‫‪‬‬ ‫‪.‬الوحدة‪typing‬علم الوراثة‪ - ‬علم الوراثة في‬

‫الجديد في اإلصدار ‪3.9.1‬‬


‫‪ ‬نوع االتحاد‬
‫يحتفظ كائن االتحاد بقيمة العملية‪ (| ‬باتجاه‪ ‬أحادي أو) على‪ ‬كائنات كتابة‪ ‬متعددة‪ . ‬هذه األنواع مخصصة بشكل أساسي‪ ‬للتعليقات‬
‫ً‬
‫مقارنة بـ‬ ‫‪ typing.Union.‬التوضيحية من النوع‪  . ‬يتيح تعبير نوع االتحاد بناء جملة تلميح من النوع األنظف‬

‫‪X | Y | ...‬‬

‫وهو ما يعادل‪ . ‬على سبيل المثال ‪ ،‬تتوقع الدالة التالية وسيطة ‪ Y.‬أو ‪ X‬وما إلى ذلك‪ .‬يعني إما‪ Y ‬و‪ X ‬يحدد كائن توحيد يحمل األنواع‬
‫‪ :X | Ytyping.Union[X, Y]intfloat‬من النوع‪ ‬أو‬

‫‪def square(number: int | float) -> int | float:‬‬

‫‪return number ** 2‬‬

‫‪union_object == other‬‬

‫‪ :‬يمكن اختبار كائنات االتحاد من أجل المساواة مع كائنات االتحاد األخرى‪ .‬تفاصيل‬

‫‪‬‬ ‫‪:‬نقابات النقابات باالرض‬

‫‪‬‬ ‫‪(int | str) | float == int | str | float‬‬

‫‪‬‬ ‫‪:‬تتم إزالة األنواع الزائدة عن الحاجة‬

‫‪‬‬ ‫‪int | str | int == int | str‬‬

‫‪‬‬ ‫‪:‬عند مقارنة النقابات ‪ ،‬يتم تجاهل الترتيب‬

‫‪‬‬ ‫‪int | str == str | int‬‬

‫‪‬‬ ‫‪ typing.Union:‬متوافق مع‬

‫‪Pg. 251‬‬
 int | str == typing.Union[int, str]

 ‫يمكن تهجئة األنواع االختيارية كاتحاد مع‬ None:

 str | None == typing.Optional[str]

isinstance(obj, union_object)

issubclass(obj, union_object)

‫ويدعو إلى‬ isinstance()‫و‬ issubclass()‫معتمدة أيضا مع كائن االتحاد‬:

>>>

>>> isinstance("", int | str)

True

L‫عوامل ذات معلمات‬ ‫التي تحتوي على‬ ‫الموحدة‬ ‫الكائنات‬ ‫ال يمكن استخدام‬ ، ‫ومع ذلك‬ :

>>>

>>> isinstance(1, int | list[int])

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: isinstance() argument 2 cannot contain a parameterized generic

‫يمكن الوصول إلى النوع الذي يتعرض له المستخدم لكائن االتحاد من‬ types.UnionType‫واستخدامه في‬ isinstance() ‫عمليات‬
‫ال يمكن إنشاء مثيل لكائن من النوع‬ .‫التحقق‬:

>>>

>>> import types

>>> isinstance(int | str, types.UnionType)

True

>>> types.UnionType()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: cannot create 'types.UnionType' instances

‫ملحوظة‬

‫تمت إضافة‬ __or__()‫إذا نفذت‬ . ‫ طريقة كائنات الكتابة لدعم بناء الجملة‬metaclass ، ‫يجوز لالتحاد تجاوزها‬:X | Y__or__()

>>>

>>> class M(type):

... def __or__(self, other):

Pg. 252
‫‪...‬‬ ‫"‪return "Hello‬‬

‫‪...‬‬

‫‪>>> class C(metaclass=M):‬‬

‫‪...‬‬ ‫‪pass‬‬

‫‪...‬‬

‫‪>>> C | int‬‬

‫'‪'Hello‬‬

‫‪>>> int | C‬‬

‫‪int | __main__.C‬‬

‫أنظر أيضا‬

‫‪ ‬‬

‫‪.X | Y‬يقترحبناء الجملة ونوع االتحاد ‪PEP 604 - PEP‬‬

‫الجديد في اإلصدار ‪3.10.1‬‬


‫‪ ‬آخر المدمج في أنواع‬

‫‪.‬يدعم المترجم عدة أنواع أخرى من الكائنات‪ .‬معظم هؤالء يدعمون عملية واحدة أو عمليتين فقط‬

‫‪Modules‬‬

‫هي وحدة نمطية‪ ‬ويصل‪ ‬االسم‪ ‬إلى اسم ‪ m ‬حيث ‪: m.name،‬العملية الخاصة الوحيدة على الوحدة النمطية هي الوصول إلى السمات‪L‬‬
‫العبارة ليست ‪ ،‬بالمعنى الدقيق للكلمة ‪ ،‬عملية على ‪ import ‬الحظ أن(‪. ‬يمكن تعيين سمات الوحدة إلى‪ m . ‬محدد في‪ ‬جدول الرموز‬
‫في‪ ‬مكان ‪ foo‬بل تتطلب‪ ‬تعري ًفا‪( ‬خارجيًا)‪ ‬لوحدة تسمى ‪ foo ،‬كائن وحدة نمطية ؛‪ ‬ال تتطلب وجود كائن وحدة باسم‬
‫‪.)import foo‬ما‬

‫هذا هو القاموس الذي يحتوي على جدول رموز الوحدة‪ .‬سيؤدي تعديل هذا القاموس في ‪ __dict__. ‬السمة الخاصة لكل وحدة هي‬
‫للسمة غير ممكن (يمكنك الكتابة‪ ، ‬وهو ما يعرف __‪ __dict‬الواقع إلى تغيير جدول رموز الوحدة النمطية ‪ ،‬لكن التعيين المباشر‬
‫__‪.m.__dict__['a'] = 1m.a1m.__dict__ = {}__dict‬بأنه‪ ‬يكون‪ ، ‬لكن ال يمكنك الكتابة‪ .) ‬ال ينصح‪ ‬بالتعديل‪ ‬المباشر‬

‫‪ .<module 'sys' (built-‬تتم كتابة وحدات في صلب مترجم من هذا القبيل‪ . :‬إذا تم تحميلها من ملف ‪ ،‬فستتم كتابتها بتنسيق‬
‫>'‪in)><module 'os' from '/usr/local/lib/pythonX.Y/os.pyc‬‬

‫‪ ‬الفئات والمثيالت الطبقية‬

‫‪.‬رؤية‪ ‬األجسام والقيم وأنواع‪ ‬و‪ ‬تعاريف الدرجة‪ ‬لهذه‬

‫‪Functions‬‬

‫‪: func(argument-list).‬يتم إنشاء كائنات الوظيفة من خالل تعريفات الوظائف‪ .‬العملية فقط على كائن الوظيفة هي أن نسميها‬

‫يوجد بالفعل نوعان من كائنات الوظائف‪ :‬وظائف مضمنة ووظائف يحددها المستخدم‪ .‬كالهما يدعم نفس العملية (الستدعاء‬
‫‪.‬الوظيفة) ‪ ،‬لكن التنفيذ مختلف ‪ ،‬وبالتالي أنواع الكائنات المختلفة‬

‫‪.‬انظر‪ ‬تعريفات الوظائف‪ ‬لمزيد من المعلومات‬

‫‪Methods‬‬

‫‪Pg. 253‬‬
‫وطرق )القوائم)(‪ append‬مثل( الطرق هي وظائف يتم استدعاؤها باستخدام تدوين السمة‪ .‬هناك نوعان من النكهات‪ :‬طرق مضمنة‬
‫‪.‬مثيل الفئة‪ .‬يتم وصف الطرق المضمنة باألنواع التي تدعمها‬

‫إذا قمت‪ L‬بالوصول إلى طريقة (وظيفة محددة في مساحة اسم فئة) من خالل مثيل ‪ ،‬فستحصل على كائن خاص‪ :‬كائن‪ ‬طريقة‬
‫الوسيطة إلى قائمة الوسائط‪ .‬األساليب المقيدة لها سمتان ‪ self‬منضمة‪( ‬تسمى أيضًا‪ ‬طريقة المثيل‪ .) ‬عند استدعائها ‪ ،‬ستضيف‬
‫وهي الوظيفة التي تنفذ __‪ ، m.__func‬هي الكائن الذي تعمل عليه الطريقة__‪: m.__self‬خاصتان للقراءة فقط‬
‫‪ .m(arg-1, arg-2, ..., arg-n)m.__func__(m.__self__, arg-1, arg-2, ..., arg-‬الطريقة‪ .‬االتصال‪ ‬يعادل تماما االتصال‬
‫)‪n‬‬

‫مثل كائنات الوظيفة ‪ ،‬تدعم كائنات الطريقة المقيدة الحصول على سمات عشوائية‪ .‬ومع ذلك ‪ ،‬نظرً ا ألنه يتم تخزين سمات‪ L‬األسلوب‬
‫فإن تعيين سمات األسلوب على الطرق المرتبطة غير مسموح به‪ .‬محاولة ‪ ( meth.__func__) ،‬فعليًا على كائن الوظيفة األساسي‬
‫ً‬
‫صراحة على كائن الوظيفة ‪ AttributeError‬تعيين سمة على طريقة ينتج‬ ‫عنها رفع‪ .‬لتعيين سمة طريقة ‪ ،‬تحتاج إلى تعيينها‬
‫‪:‬األساسي‬

‫>>>‬

‫‪>>> class C:‬‬

‫‪...‬‬ ‫‪def method(self):‬‬

‫‪...‬‬ ‫‪pass‬‬

‫‪...‬‬

‫)(‪>>> c = C‬‬

‫‪>>> c.method.whoami = 'my name is method' # can't set on the method‬‬

‫‪Traceback (most recent call last):‬‬

‫>‪File "<stdin>", line 1, in <module‬‬

‫'‪AttributeError: 'method' object has no attribute 'whoami‬‬

‫'‪>>> c.method.__func__.whoami = 'my name is method‬‬

‫‪>>> c.method.whoami‬‬

‫'‪'my name is method‬‬

‫‪.‬راجع‪ ‬التدرج الهرمي للنوع القياسي‪ ‬لمزيد من المعلومات‬

‫‪ ‬كائنات التعليمات البرمجية‬

‫القابل للتنفيذ "شبه المترجمة" مثل جسم الوظيفة‪ .‬وهي ‪ Python‬يتم استخدام كائنات التعليمات البرمجية بواسطة التنفيذ لتمثيل كود‬
‫تختلف عن كائنات الوظائف ألنها ال تحتوي على مرجع لبيئة التنفيذ العالمية الخاصة بها‪ .‬يتم إرجاع كائنات التعليمات البرمجية‬
‫‪ code‬سماتها‪ .‬انظر أيضا‪ __code__ ‬الوظيفة المضمنة ويمكن استخالصها من كائنات الوظيفة من خالل)(‪ compile‬بواسطة‬
‫‪.‬الوحدة‬

‫‪ "__code__".‬و‪ obj‬بحجج‪ object.__getattr__ ‬يثير‪ ‬الحدث التدقيق__‪ __code‬الوصول إلى‬

‫الوظائف )(‪ eval‬أو)(‪  exec‬يمكن تنفيذ كائن التعليمات البرمجية أو تقييمه عن طريق تمريره (بدالً من سلسلة المصدر) إلى‪ ‬الوظائف‬
‫‪.‬المضمنة‬

‫‪.‬راجع‪ ‬التدرج الهرمي للنوع القياسي‪ ‬لمزيد من المعلومات‬

‫‪ ‬اكتب كائنات‬

‫‪Pg. 254‬‬
‫ال توجد عمليات خاصة‪ type(). ‬تمثل كائنات الكتابة أنواع الكائنات المختلفة‪  .‬يتم الوصول إلى نوع الكائن بواسطة الوظيفة المضمنة‬
‫‪.‬تحدد‪ ‬الوحدة القياسية‪ ‬أسماء جميع األنواع المضمنة القياسية ‪. types‬على األنواع‬

‫>'‪: .<class 'int‬مكتوبة أنواع مثل هذا‬

‫‪ ‬الكائن‬
‫يتم إرجاع هذا الكائن بواسطة داالت ال ُترجع قيمة بشكل صريح‪ .‬ال يدعم أي عمليات خاصة‪ .‬يوجد كائن فارغ واحد‬
‫‪.‬تنتج نفس المفرد)()‪). type(None‬اسم‪ ‬مضمن‪ None( ‬يسمى‬

‫‪ None.‬هو مكتوب كـ‬

‫‪ ‬كائن القطع الناقص‬


‫يشيع استخدام هذا الكائن عن طريق التقطيع (انظر‪ ‬التقطيع‪ .) ‬ال يدعم أي عمليات خاصة‪ .‬يوجد كائن عالمة حذف واحد ‪،‬‬
‫‪.‬المفرد‪ Ellipsis‬ينتج)()‪). type(Ellipsis‬اسم‪ ‬مضمن‪ Ellipsis( ‬يُسمى‬

‫‪ ....‬أو‪ Ellipsis‬هو مكتوب على شكل‬

‫‪ ‬الكائن غير المنفذ‬


‫يتم إرجاع هذا الكائن من المقارنات والعمليات الثنائية عندما يُطلب منهم العمل على أنواع ال تدعمها‪ .‬انظر‪ ‬مقارنات‪ ‬لمزيد من‬
‫‪.‬ينتج مثيل مفرد)()‪ NotImplemented. type(NotImplemented‬المعلومات‪ .‬هناك شيء واحد بالضبط‬

‫‪ NotImplemented.‬هو مكتوب كـ‬

‫‪ ‬القيم المنطقية‬

‫يتم استخدامها لتمثيل قيم الحقيقة (على الرغم من أنه يمكن أيضً ا اعتبار القيم ‪ True. ‬و‪ False‬القيم المنطقية هما العنصران الثابتان‬
‫األخرى خاطئة أو صحيحة)‪  .‬في السياقات الرقمية (على سبيل المثال عند استخدامها كوسيطة لعامل حسابي) ‪ ،‬تتصرف مثل األعداد‬
‫يمكن استخدام‪ ‬الوظيفة المضمنة‪  ‬لتحويل أي قيمة إلى قيمة منطقية ‪ ،‬إذا كان من الممكن تفسير)(‪. bool‬الصحيحة ‪ 0‬و ‪ 1‬على التوالي‬
‫‪.‬القيمة على أنها قيمة حقيقية (انظر قسم‪ ‬اختبار قيمة الحقيقة‪ ‬أعاله)‬

‫‪.‬على التوالي ‪ True،‬و‪ False‬يتم كتابتها كـ‬

‫‪ ‬كائنات داخلية‬
‫راجع‪ ‬التسلسل الهرمي للنوع القياسي‪ ‬للحصول على هذه المعلومات‪ .‬يصف كائنات إطار المكدس‪ ، L‬وكائنات التتبع ‪ ،‬وكائنات‬
‫‪.‬الشرائح‬

‫‪ ‬السمات‪ L‬الخاصة‬
‫يضيف التنفيذ بعض السمات‪ L‬الخاصة للقراءة فقط إلى العديد من أنواع الكائنات ‪ ،‬حيث تكون ذات صلة‪ .‬لم يتم اإلبالغ عن بعض هذه‬
‫‪.‬الوظيفة المضمنة)(‪ dir‬بواسطة‬

‫__‪object.__dict‬‬

‫‪.‬قاموس أو كائن تخطيط آخر يستخدم لتخزين سمات‪ L‬كائن (قابلة للكتابة)‬

‫__‪instance.__class‬‬

‫‪.‬الفئة التي ينتمي إليها مثيل الفئة‬

‫__‪class.__bases‬‬

‫‪.‬مجموعة الفئات األساسية لكائن فئة‬

‫__‪definition.__name‬‬

‫‪.‬اسم الفئة أو الوظيفة أو الطريقة أو الواصف أو مثيل المولد‬

‫‪Pg. 255‬‬
‫__‪definition.__qualname‬‬

‫‪.‬و‪ ‬اسم مؤهل‪ ‬للطبقة‪ ،‬وظيفة أو أسلوب اصف‪ ،‬أو مثيل المولد‬

‫الجديد في اإلصدار ‪3.3.1‬‬

‫__‪class.__mro‬‬

‫‪.‬هذه السمة هي مجموعة من الفئات التي يتم أخذها في االعتبار عند البحث عن الفئات األساسية أثناء تحليل الطريقة‬

‫)(‪class.mro‬‬

‫لتخصيص ترتيب دقة الطريقة لمثيالتها‪ .‬يتم استدعاؤه في إنشاء مثيل للفئة ‪ ،‬ويتم ‪ metaclass‬يمكن تجاوز هذه الطريقة بواسطة فئة‬
‫‪ __mro__.‬تخزين نتائجه في‬

‫)(__‪class.__subclasses‬‬

‫تحتفظ كل فئة بقائمة من المراجع الضعيفة لفئاتها الفرعية المباشرة‪ .‬تقوم هذه الطريقة بإرجاع قائمة بجميع تلك المراجع التي ال تزال‬
‫‪:‬على قيد الحياة‪ .‬القائمة في ترتيب التعريف‪ .‬مثال‬

‫>>>‬

‫)(__‪>>> int.__subclasses‬‬

‫]>'‪[<class 'bool‬‬

‫الحواشي‬

‫‪1‬‬

‫‪.‬المرجعي (‪ ‬التخصيص األساسي‪ Python ) ‬يمكن العثور على معلومات إضافية حول هذه األساليب الخاصة في دليل‬

‫‪2‬‬

‫نتيجة لذلك ‪ُ ،‬تعتبر القائمة‪ ‬مساوية لـ‪ ، ‬وبالمثل بالنسبة لها‪]2.0 ,1.0[]2 ,1[.‬‬

‫‪3‬‬

‫‪.‬يجب أن يكون لديهم ألن المحلل اللغوي ال يستطيع معرفة نوع المعامالت‪L‬‬

‫)‪4(1,2,3,4‬‬

‫حرف ‪ ،‬أحرف ( "‪ "Ll‬أو ‪) ،‬حرف ‪ ،‬أحرف كبيرة( "‪ "Lu‬األحرف المغطاة هي تلك التي تحتوي على خاصية فئة عامة تتمثل في‬
‫‪).‬حرف ‪ ،‬أحرف كبيرة( "‪ "Lt‬أو ‪) ،‬صغيرة‬

‫)‪5(1,2‬‬

‫‪.‬فقط ‪ ،‬يجب عليك توفير مجموعة واحدة يكون عنصرها الوحيد هو المجموعة المراد تنسيقها ‪ tuple‬لتنسيق‬

‫‪ ‬استثناءات مضمنة‬

‫شرط أن يذكر ‪ except ‬بيان مع‪ try‬في‪ BaseException. ‬يجب أن تكون جميع االستثناءات حاالت لفئة مشتقة من ‪ Python ،‬في‬
‫فئة معينة‪ ،‬ويعالج هذا الشرط أيضا أي الطبقات استثناء المستمدة من ذلك (الطبقات ولكن ليس استثناء من أي فئة‪ ‬كان‪ ‬مشتق)‪ .‬ال‬
‫‪.‬تتكافئ فئتان من االستثناءات غير المرتبطين عبر التصنيف الفرعي أب ًدا ‪ ،‬حتى لو كان لهما نفس االسم‬

‫يمكن إنشاء االستثناءات المضمنة المدرجة أدناه بواسطة المترجم الفوري أو الوظائف المضمنة‪ .‬باستثناء ما تم ذكره ‪ ،‬فإن لها "قيمة‬
‫مرتبطة" تشير إلى السبب التفصيلي للخطأ‪  .‬قد يكون هذا عبارة عن سلسلة أو مجموعة من عدة عناصر من المعلومات (على سبيل‬
‫‪.‬المثال ‪ ،‬رمز خطأ وسلسلة تشرح الرمز)‪ .‬عاد ًة ما يتم تمرير القيمة المرتبطة كوسائط إلى مُنشئ فئة االستثناء‬

‫‪Pg. 256‬‬
‫يمكن أن يؤدي رمز المستخدم إلى زيادة االستثناءات المضمنة‪  .‬يمكن استخدام هذا الختبار معالج استثناء أو لإلبالغ عن حالة خطأ‬
‫"تما ًم ا مثل" الحالة التي يثير فيها المترجم نفس االستثناء ؛‪ ‬لكن احذر من عدم وجود ما يمنع رمز المستخدم من إثارة خطأ غير‬
‫‪.‬مناسب‪L‬‬

‫يمكن تصنيف فئات االستثناءات المضمنة إلى فئات فرعية لتحديد استثناءات جديدة ؛‪  ‬يتم تشجيع المبرمجين على استنباط استثناءات‬
‫يتوفر مزيد من المعلومات‪ L‬حول تحديد ‪ BaseException. ‬الفئة أو أحد فئاتها الفرعية ‪ ،‬وليس من‪ Exception ‬جديدة من‬
‫‪ .‬التعليمي ضمن‪ ‬االستثناءات التي يحددها المستخدم ‪ Python‬االستثناءات في برنامج‬

‫أو‪ ‬يتم تعيينه تلقائيًا على آخر استثناء تم اكتشافه ؛‪ ‬إذا لم تتم معالجة‪ L‬االستثناء الجديد‪ except‬عند رفع (أو إعادة طرح) استثناء في‪ ‬بند‬
‫__‪ ،.finally__context‬فإن التتبع الذي يتم عرضه في النهاية سيشمل االستثناء (االستثناءات) األصلية واالستثناء النهائي‬

‫سياق االستثناء الضمني ‪)،‬إلعادة رفع االستثناء يجري التعامل معها حاليا‪ raise‬بدال من استخدام العارية( عندما رفع استثناء جديد‬
‫‪ raise:‬مع‪ from‬يمكن أن تستكمل مع سبب واضح باستخدام‬

‫‪raise new_exc from original_exc‬‬

‫__‪ __cause‬على االستثناء المُثار‪ .‬يقوم اإلعداد__‪ __cause‬سيتم تعيينه‪ None. ‬يجب أن يكون‪ ‬التعبير التالي‪ ‬استثنا ًء أو‪from‬‬


‫بحيث يؤدي‪ ‬االستخدام الفعال إلى استبدال االستثناء القديم ‪ True،‬السمة‪ ‬ضمنيًا‪ ‬إلى‪ __suppress_context__ ‬أيضً ا بتعيين‬
‫باالستثناء الجديد ألغراض العرض (مثل التحويل‪ ‬إلى‪ ، ) ‬مع ترك االستثناء القديم متاحً ا‪ ‬لالستبطان عند تصحيح‬
‫__‪.raise new_exc from NoneKeyErrorAttributeError__context‬األخطاء‬

‫__‪. __cause‬لالستثناء نفسه ‪ traceback‬االفتراضي هذه االستثناءات المتسلسلة باإلضافة إلى ‪ traceback‬يُظهر كود عرض‬
‫تظهر فقط __‪ __context‬يظهر دائمًا‪ ‬استثناء مقيد بشكل صريح في‪ ‬عند وجوده‪ .‬استثناء بالسالسل ضمنا في‬
‫‪.‬باطل__‪ __suppress_context‬و‪ None‬هو‪ __cause__ ‬إذا‬

‫دائمًا االستثناء ‪ traceback‬في كلتا الحالتين ‪ ،‬يظهر االستثناء نفسه دائ ًم ا بعد أي استثناءات متسلسلة بحيث يُظهر السطر األخير من‬
‫‪.‬األخير الذي تم إطالقه‬

‫‪ ‬الفئات األساسية‪L‬‬

‫‪ُ .‬ت ستخدم االستثناءات التالية في الغالب كفئة أساسية لالستثناءات األخرى‬

‫‪ BaseException‬استثناء‬

‫لذلك ‪ ( ،‬الفئة األساسية‪ L‬لجميع االستثناءات المضمنة‪ .‬ال يُقصد أن يتم توريثها مباشرة بواسطة فئات محددة بواسطة المستخدم‬
‫تم استدعاؤها في مثيل من هذه الفئة ‪ ،‬فسيتم إرجاع تمثيل الوسيطة (الوسائط) إلى المثيل ‪ ،‬أو )(‪ str‬إذا‪ Exception). ‬االستخدام‬
‫‪.‬السلسلة الفارغة عند عدم وجود وسيطات‬

‫‪args‬‬

‫تتوقع بعض‪ ‬االستثناءات المضمنة (مثل‪ ) ‬عد ًدا معي ًنا من الوسيطات وتحدد ‪. OSError‬مجموعة الوسائط المعطاة لمنشئ االستثناء‬
‫ص ا لعناصر هذه المجموعة ‪ ،‬بينما يتم استدعاء البعض اآلخر عاد ًة بسلسلة واحدة تعطي رسالة خطأ‬‫‪.‬معنى خا ً‬

‫)‪with_traceback(tb‬‬

‫باعتباره التتبع الجديد لالستثناء وإرجاع كائن االستثناء‪ .‬تم استخدامه بشكل أكثر شيو ًعا قبل ميزات ‪ tb ‬تقوم هذه الطريقة بتعيين‬
‫إلى ‪SomeException‬متاحً ا‪ .‬يوضح المثال التالي كيف يمكننا تحويل مثيل لـ‪ PEP 3134 ‬تسلسل االستثناءاتأصبح‬
‫كما كان ‪ OtherException،‬مع االحتفاظ بالتتبع‪ .‬بمجرد رفعه ‪ ،‬يتم دفع اإلطار الحالي إلى تتبع لـ‪OtherException‬مثيل‬
‫‪.‬لو سمحنا له باالنتشار إلى المتصل‪SomeException‬سيحدث لتتبع األثر األصلي‬

‫‪try:‬‬

‫‪...‬‬

‫‪except SomeException:‬‬

‫]‪tb = sys.exc_info()[2‬‬

‫‪Pg. 257‬‬
‫)‪raise OtherException(...).with_traceback(tb‬‬

‫‪ Exception‬استثناء‬

‫يتم اشتقاق جميع االستثناءات المضمنة وغير الخارجة من النظام من هذه الفئة‪ .‬يجب أيضً ا اشتقاق جميع االستثناءات المعرفة من قبل‬
‫‪.‬المستخدم من هذه الفئة‬

‫‪ ArithmeticError‬استثناء‬

‫الفئة األساسية لالستثناءات المضمنة التي يتم رفعها للعديد من األخطاء‬


‫‪: OverflowError، ZeroDivisionError، FloatingPointError.‬الحسابية‬

‫‪ BufferError‬استثناء‬

‫‪ .‬يُطلق عندما‪ ‬يتعذر إجراء عملية متعلقة‪ ‬بالمخزن المؤقت‬

‫‪ LookupError‬استثناء‬

‫الفئة األساسية‪ L‬لالستثناءات التي تظهر عندما يكون المفتاح أو الفهرس المستخدم في التعيين أو التسلسل غير‬
‫‪ codecs.lookup().‬يمكن رفع هذا مباشرة بواسطة‪: IndexError، KeyError. ‬صالح‬

‫‪ ‬استثناءات ملموسة‬

‫‪.‬االستثناءات التالية هي االستثناءات التي يتم رفعها عاد ًة‬

‫‪ AssertionError‬استثناء‬

‫‪.‬فشل البيان‪ assert‬يُثار عند‬

‫‪ AttributeError‬استثناء‬

‫عندما ال يدعم الكائن مراجع السمات‪ L‬أو تعيينات السمات على (‪. ‬يُطلق عند‪ ‬فشل‪ ‬مرجع السمة (راجع‪ ‬مراجع السمات‪ ) L‬أو التعيين‬
‫)‪.‬يتم رفعه‪ ، TypeError‬اإلطالق‬

‫سمات يمكن تعيين باستخدام الحجج الكلمة الوحيدة لمنشئ‪  .‬عند تعيينها ‪ ،‬فإنها تمثل اسم السمة التي تمت محاولة ‪ obj‬و‪ name‬و‬
‫‪.‬الوصول إليها والكائن الذي تم الوصول إليه للسمة المذكورة ‪ ،‬على التوالي‬

‫‪ obj.‬و‪ name‬تم التغيير في اإلصدار ‪ :3.10‬تمت إضافة‪ ‬السمات‪L‬‬

‫‪ EOFError‬استثناء‬

‫مالحظة‪ُ  :‬تعيد‪ ‬التاب(‪. ‬دون قراءة أي بيانات )‪ (EOF‬تصل الوظيفة إلى حالة نهاية الملف)(‪ input‬يُطلق عندما‬
‫)‪ EOF.‬سلسلة نصية فارغة عندما تضغط على)(‪ io.IOBase.read()and io.IOBase.readline‬ع‬

‫‪ FloatingPointError‬استثناء‬

‫‪.‬غير مستخدم حاليا‬

‫‪ GeneratorExit‬استثناء‬

‫إنه يرث مباشرة ‪ coroutine.close(). ‬و)(‪ generator.close‬يُثار عند‪ ‬إغالق‪ ‬المولد‪ ‬أو‪ ‬الكوروتين‪ ‬؛‪ ‬انظر‬


‫‪.‬ألنه ليس خطأ تقنيًا‪ Exception‬بدالً من‪ BaseException‬من‬

‫‪ ImportError‬استثناء‬

‫يواجه البيان مشاكل أثناء محاولة تحميل وحدة‪ .‬يتم رفعه أيضً ا عندما يكون للحرف "من القائمة"‪ ‬اسم ال يمكن ‪ import‬يُطلق عندما‬
‫‪.from ... import‬العثور عليه‬

‫‪Pg. 258‬‬
‫سمات‪ L‬يمكن تعيين باستخدام الحجج الكلمة الوحيدة لمنشئ‪ .‬عند تعيينها ‪ ،‬فإنها تمثل اسم الوحدة النمطية التي تمت ‪ path‬و‪ name‬و‬
‫‪.‬محاولة استيرادها والمسار إلى أي ملف أدى إلى حدوث االستثناء ‪ ،‬على التوالي‬

‫‪ path.‬و‪ name‬تم التغيير في اإلصدار ‪ :3.3‬تمت إضافة‪ ‬السمات‪L‬‬

‫‪ ModuleNotFoundError‬استثناء‬

‫العثور عليه ‪ None ‬عند تعذر تحديد موقع الوحدة النمطية‪ .‬يتم رفعه أي ً‬


‫ضا عند‪ import ‬يتم رفع‪ ‬فئة فرعية‪ ‬منها ‪ImportError‬‬
‫‪ sys.modules.‬في‬

‫الجديد في اإلصدار ‪3.6.1‬‬

‫‪ IndexError‬استثناء‬

‫يتم اقتطاع مؤشرات الشرائح بصمت لتقع في النطاق المسموح به ؛ إذا لم يكن (‪. ‬يُطلق عندما يكون التسلسل المنخفض خارج النطاق‬
‫)‪.‬فيتم رفعه‪ ، TypeError‬الفهرس عد ًدا صحيحً ا‬

‫‪ KeyError‬استثناء‬

‫‪ .‬يُطلق عند عدم العثور على مفتاح تعيين (قاموس) في مجموعة المفاتيح الموجودة‬

‫‪ KeyboardInterrupt‬استثناء‬

‫يُطلق عندما يضغط المستخدم على مفتاح المقاطعة (عاد ًة‪ ‬أو‪  .) ‬أثناء التنفيذ ‪ ،‬يتم إجراء فحص للمقاطعات بانتظام‪ .‬يرث االستثناء‬
‫‪.Control-‬من‪  ‬ذلك حتى ال يتم اكتشافه عن طريق الخطأ بواسطة الكود الذي يمسك‪ ‬وبالتالي يمنع المترجم الفوري من الخروج‬
‫‪CDeleteBaseExceptionException‬‬

‫‪ MemoryError‬استثناء‬

‫يُطلق عند نفاد الذاكرة من إحدى العمليات ولكن قد يستمر إنقاذ الموقف (عن طريق حذف بعض الكائنات)‪ .‬القيمة المرتبطة هي‬
‫قد ال ‪ C ) ،‬وظيفة)(‪ ( malloc‬سلسلة تشير إلى نوع العملية (الداخلية) التي نفدت الذاكرة‪ .‬الحظ أنه بسبب بنية إدارة الذاكرة األساسية‬
‫يتمكن المترجم الفوري دائمًا من التعافي تمامًا من هذا الموقف ؛‪  ‬ومع ذلك ‪ ،‬فإنه يثير استثناء بحيث يمكن طباعة تتبع مكدس ‪ ،‬في‬
‫‪.‬حالة وجود برنامج تشغيل ً‬
‫بعيدا هو السبب‬

‫‪ NameError‬استثناء‬

‫يُطلق عندما ال يتم العثور على اسم محلي أو عالمي‪ .‬هذا ينطبق فقط على األسماء‪ L‬غير المؤهلة‪ .‬القيمة المرتبطة هي رسالة خطأ‬
‫‪.‬تتضمن االسم الذي تعذر العثور عليه‬

‫يمكن تعيين السمة باستخدام حجة الكلمة الوحيدة لمنشئ‪  .‬عند تعيينه ‪ ،‬فإنه يمثل اسم المتغير الذي تمت محاولة الوصول ‪ name‬و‬
‫‪.‬إليه‬

‫‪.‬السمة‪ name‬تم التغيير في اإلصدار ‪ :3.10‬تمت إضافة‬

‫‪ NotImplementedError‬استثناء‬

‫في الفئات األساسية التي يحددها المستخدم ‪ ،‬يجب أن تثير الطرق المجردة هذا االستثناء ‪ RuntimeError. ‬هذا االستثناء مشتق من‬
‫‪.‬عندما تتطلب فئات مشتقة لتجاوز الطريقة ‪ ،‬أو أثناء تطوير الفئة لإلشارة إلى أن التنفيذ الحقيقي ال يزال بحاجة إلى اإلضافة‬

‫ملحوظة‬

‫‪ ‬‬

‫ال ينبغي استخدامها لإلشارة إلى أن عامل التشغيل أو الطريقة ال يُقصد منها دعمها على اإلطالق ‪ -‬في هذه الحالة إما ترك عامل‬
‫‪ None.‬التشغيل ‪ /‬الطريقة غير محدد أو ‪ ،‬إذا كانت فئة فرعية ‪ ،‬فقم بتعيينها على‬

‫ملحوظة‬

‫‪ ‬‬

‫‪Pg. 259‬‬
‫قابلة للتبديل ‪ ،‬على الرغم من أن لها أسماء‪ L‬وأغراض متشابهة‪ NotImplemented .‬وغير‪NotImplementedError‬‬
‫‪.‬للحصول على تفاصيل حول وقت استخدامها‪  NotImplemented‬انظر‬

‫‪ ] ) ‬حج ‪ OSError( [ ‬استثناء‬

‫)‪ OSError( errno ، strerror  [ ، filename  [ ، winerror  [ ، filename2  ] ] ] ‬استثناء‬

‫يظهر هذا االستثناء عندما تقوم إحدى وظائف النظام بإرجاع خطأ متعلق بالنظام ‪ ،‬بما في ذلك حاالت فشل اإلدخال ‪ /‬اإلخراج مثل‬
‫‪".‬لم يتم العثور على الملف" أو "القرص ممتلئ" (ليس ألنواع الوسائط غير القانونية أو األخطاء العرضية األخرى)‬

‫إذا لم يتم تحديدها‪ .‬للتوافق مع اإلصدارات ‪ None‬يعيّن الشكل الثاني للمنشئ السمات المقابلة ‪ ،‬الموضحة أدناه‪ .‬السمات‪ L‬االفتراضية‬
‫‪.‬السمة تحتوي فقط على مجموعتين من وسيطتي المُنشئ األولين‪ args‬السابقة ‪ ،‬إذا تم تمرير ثالث وسيطات ‪ ،‬فإن‬

‫كما هو موضح في‪ ‬استثناءات نظام التشغيل‪ ‬أدناه‪ .‬تعتمد الفئة الفرعية المعينة ‪ OSError،‬غالبًا ما ُترجع المُنشئ فئة فرعية لـ‬
‫مباشرة أو عبر اسم مستعار ‪ ،‬وال يتم توريثه عند ‪ OSError‬القيمة‪ ‬النهائية‪ . ‬يحدث هذا السلوك فقط عند اإلنشاء‪ errno‬على‬
‫‪.‬التصنيف الفرعي‬

‫‪errno‬‬

‫‪ C errno.‬رمز الخطأ الرقمية من المتغير ‪A‬‬

‫‪winerror‬‬

‫من أن رمز ‪ POSIX،‬السمة ثم ترجمة تقريبية‪ ،‬من حيث‪ errno‬األصلي‪ .‬و ‪ Windows‬يمنحك هذا رمز خطأ ‪ Windows ،‬تحت‬
‫‪.‬الخطأ األصلي‬

‫‪ Windows‬يتم تحديد السمة من رمز خطأ‪ ، errno‬عبارة عن عدد صحيح‪ winerror ‬إذا كانت‪ ‬وسيطة مُنشئ ‪ Windows ،‬تحت‬
‫‪.‬وال توجد السمة‪ winerror ، winerror‬في األنظمة األساسية األخرى ‪ ،‬يتم تجاهل وسيطة‪ errno . ‬ويتم تجاهل وسيطة‪، ‬‬

‫‪strerror‬‬

‫ضمن)(‪ C perror‬رسالة الخطأ المطابقة ‪ ،‬على النحو المنصوص عليه من قبل نظام التشغيل‪ .‬يتم تنسيقه بواسطة وظائف‬
‫‪ Windows.‬وتحت‪POSIX FormatMessage() ‬‬

‫‪filename‬‬

‫‪filename2‬‬

‫يتم تمرير اسم الملف إلى الوظيفة‪ os.unlink()) ، filename.‬أو)(‪ open‬مثل( بالنسبة لالستثناءات التي تتضمن مسار نظام ملفات‬
‫يتوافق مع اسم الملف الثاني الذي تم ‪ os.rename()) ، filename2‬مثل( ‪ ‬بالنسبة للوظائف التي تتضمن مسارين لنظام الملفات‬
‫‪.‬تمريره إلى الوظيفة‬

‫‪:EnvironmentError ، IOError، WindowsError، socket.error، select.error‬تغير في اإلصدار ‪3.3‬‬


‫‪.‬والمنشئ قد ترجع فئة فرعية ‪ OSError،‬كانت دمجها‪ mmap.error‬و‬

‫السمة اآلن اسم الملف األصلي الذي تم تمريره إلى الوظيفة ‪ ،‬بدالً من االسم ‪ filename‬تم التغيير في اإلصدار ‪ :3.4‬أصبحت‬
‫‪ filename2 .‬المشفر إلى أو فك‪ ‬تشفير نظام الملفات ومعالج األخطاء‪ . ‬كما‪ ‬تمت إضافة سمة‪ ‬وسم‪ ‬وسيطة منشئ‬

‫‪ OverflowError‬استثناء‬

‫التي تفضل رفعها ( يُطلق عندما تكون نتيجة عملية حسابية أكبر من أن يتم تمثيلها‪ .‬ال يمكن أن يحدث هذا لألعداد الصحيحة‬
‫لألعداد الصحيحة خارج النطاق ‪ OverflowError‬ومع ذلك ‪ ،‬ألسباب تاريخية ‪ ،‬يتم أحيا ًنا رفع‪). ‬االستسالم‪ MemoryError‬على‬
‫‪.‬ال يتم فحص معظم عمليات الفاصلة العائمة ‪ C ،‬المطلوب‪ .‬بسبب عدم وجود توحيد قياسي لمعالجة استثناء النقطة العائمة في‬

‫‪ RecursionError‬استثناء‬

‫‪Pg. 260‬‬
‫( يتم رفعه عندما يكتشف المترجم أن الحد األقصى لعمق التكرار‪ RuntimeError. ‬هذا االستثناء مشتق من‬
‫‪.‬قد تم تجاوزه ))(‪ sys.getrecursionlimit‬انظر‬

‫‪ .‬تم رفع‪ ‬مستوى عادي‪ ، RuntimeError‬الجديد في اإلصدار ‪ :3.5‬ساب ًقا‬

‫‪ ReferenceError‬استثناء‬

‫الوظيفة ‪ ،‬للوصول إلى سمة )(‪ weakref.proxy‬يظهر هذا االستثناء عندما يتم استخدام وكيل مرجعي ضعيف ‪ ،‬تم إنشاؤه بواسطة‬
‫‪.‬الوحدة‪ weakref‬المرجع بعد أن يتم جمعها غير المرغوب فيه‪ .‬لمزيد من المعلومات حول المراجع الضعيفة ‪ ،‬راجع‬

‫‪ RuntimeError‬استثناء‬

‫‪.‬يُطلق عند اكتشاف خطأ ال يقع في أي فئة من الفئات األخرى‪ .‬القيمة المرتبطة هي سلسلة تشير إلى الخطأ الذي حدث بالضبط‬

‫‪ StopIteration‬استثناء‬

‫‪.‬طريقة إلشارة أنه ال توجد أصناف أخرى تنتجها مكرر)(__‪ __next‬و‪ ‬مكرر‪ ‬الصورة)(‪ next‬التي أثارها المدمج في وظيفة‬

‫‪ None.‬والتي يتم تقديمها كوسيطة عند إنشاء االستثناء ‪ ،‬ويتم تعيينها افتراضيًا على ‪ value،‬كائن االستثناء له سمة واحدة‬

‫يتم رفع مثيل‪ ‬جديد‪ ، ‬ويتم استخدام القيمة التي تم إرجاعها بواسطة ‪ coroutine ، StopIteration‬عندما‪ ‬يعود‪ ‬منشئ‪ ‬أو‪ ‬دالة‬
‫‪.‬االستثناء‪value ‬الدالة‪ ‬كمعامل لمنشئ‬

‫بـ‪ StopIteration‬االحتفاظ(‪ RuntimeError‬يتم تحويله إلى ‪ StopIteration،‬إذا تم رفع رمز المولد بشكل مباشر أو غير مباشر‬
‫‪).‬كسبب لالستثناء الجديد‬

‫‪.‬سمة وقدرة وظائف المُنشئ على استخدامها إلرجاع قيمة‪ value‬تم التغيير في اإلصدار ‪ :3.3‬تمت إضافة‬

‫‪from __future__ import generator_stop479 .‬عبر‪ ، ‬انظر ‪ RuntimeError‬تم التغيير في اإلصدار ‪ :3.5‬قدم تحويل‬

‫يتم تحويل الخطأ الذي يظهر ‪:StopIteration ‬لجميع التعليمات البرمجية افتراضيًا‪PEP 479 ‬تم التغيير في اإلصدار ‪ :3.7‬تمكين‬
‫‪RuntimeError.‬في المولد إلى ملف‬

‫‪ StopAsyncIteration‬استثناء‬

‫‪.‬بطريقة‪ ‬كائن‪ ‬مكرر غير متزامن‪ ‬إليقاف التكرار)(__‪ __anext‬يجب رفعه‬

‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫‪ ) ‬رسالة‪ ، ‬تفاصيل ‪ SyntaxError( ‬استثناء‬

‫بيان‪ ،‬في استدعاء المدمج في ‪ import‬يُطلق عند مواجهة المحلل اللغوي لخطأ في بناء الجملة‪ .‬قد يحدث هذا في‬
‫‪.‬أو عند قراءة السيناريو األولي أو اإلدخال القياسي (كما تفاعلي) ‪ eval()،‬أو)(‪ compile()، exec‬وظائف‬

‫‪.‬مثيل االستثناء بإرجاع رسالة الخطأ فقط‪ .‬التفاصيل عبارة عن مجموعة يتوفر أعضاؤها أي ً‬
‫ضا كسمات منفصلة)(‪ str‬يقوم‬

‫‪filename‬‬

‫‪.‬اسم الملف الذي حدث فيه خطأ في بناء الجملة‬

‫‪lineno‬‬

‫‪ lineno1.‬رقم السطر الذي حدث فيه الخطأ في الملف‪ .‬هذا مفهرس ‪ :1‬السطر األول في الملف يحتوي على‬

‫‪offset‬‬

‫‪ offset1.‬العمود الموجود في السطر الذي حدث فيه الخطأ‪ .‬هذا مفهرس ‪ :1‬الحرف األول في السطر يحتوي على‬

‫‪text‬‬

‫‪Pg. 261‬‬
‫‪.‬نص كود المصدر المتضمن في الخطأ‬

‫‪end_lineno‬‬

‫‪ lineno1.‬رقم السطر الذي حدث الخطأ في الملف ينتهي به‪ .‬هذا مفهرس ‪ :1‬السطر األول في الملف يحتوي على‬

‫‪end_offset‬‬

‫‪ offset1.‬ينتهي العمود الموجود في سطر النهاية حيث حدث الخطأ‪ .‬هذا مفهرس ‪ :1‬الحرف األول في السطر يحتوي على‬

‫وتكون اإلزاحات عبارة عن إزاحات في نص تم إنشاؤه "‪ "f-string:‬تكون الرسالة مسبوقة بـ ‪ f-string ،‬بالنسبة لألخطاء في حقول‬
‫)‪ args: (' f-string:… '، (' '، 1، 2،' (ab‬إلى هذه السمة' }‪ f'Bad {ab‬من تعبير االستبدال‪ .‬على سبيل المثال ‪ ،‬يؤدي تجميع حقل‬
‫‪n '، 1، 5)).‬‬

‫‪ end_offset.‬و‪ end_lineno‬تم التغيير في اإلصدار ‪ :3.10‬تمت إضافة‪ ‬السمات‪L‬‬

‫‪ IndentationError‬استثناء‬

‫‪ SyntaxError.‬الصنف األساسي ألخطاء بناء الجملة المتعلقة بمسافة بادئة غير صحيحة‪ .‬هذه فئة فرعية من‬

‫‪ TabError‬استثناء‬

‫يتم رفعه عندما تحتوي المسافة البادئة على استخدام غير متسق لعالمات التبويب والمسافات‪ .‬هذه فئة فرعية‬
‫‪ IndentationError.‬من‬

‫‪ SystemError‬استثناء‬

‫يُثار عندما يجد المترجم خطأ داخليًا ‪ ،‬لكن ال يبدو الوضع خطيرً ا لدرجة تجعله يتخلى عن كل أمل‪ .‬القيمة المرتبطة هي سلسلة تشير‬
‫‪.‬إلى الخطأ الذي حدث (بعبارات منخفضة المستوى)‬

‫؛ تتم ‪ Python ( sys.version‬يجب عليك إبالغ مؤلف أو مشرف مترجم بايثون الخاص بك‪ .‬تأكد من اإلبالغ عن إصدار مترجم‬
‫ورسالة الخطأ الدقيقة (القيمة المرتبطة باالستثناء) ومصدر البرنامج الذي تسبب ‪) ،‬التفاعلية ‪ Python‬طباعته أيضً ا في بداية جلسة‬
‫‪.‬في حدوث الخطأ إن أمكن‬

‫‪ SystemExit‬استثناء‬

‫بحيث ال يتم اكتشافه عن ‪ Exception‬بدالً من‪ BaseException‬الوظيفة‪ .‬إنه يرث من)(‪ sys.exit‬يتم رفع هذا االستثناء بواسطة‬
‫هذا يسمح لالستثناء باالنتشار بشكل صحيح ويؤدي إلى خروج المترجم‪ .‬عندما‪ Exception. ‬طريق الخطأ بواسطة الكود الذي يمسك‬
‫ال يتم التعامل معها ‪ ،‬يخرج مترجم بايثون ؛‪ ‬ال تتم طباعة التتبع المكدس‪  .‬يقبل المُنشئ نفس الوسيطة االختيارية التي تم تمريرها‬
‫؛‪ ‬إذا كان األمر )‪ C ‬وظيفة)(‪ exit‬تم تمريرها إلى( إذا كانت القيمة ً‬
‫عددا صحيحً ا ‪ ،‬فإنها تحدد حالة خروج النظام‪ sys.exit(). ‬إلى‬
‫‪.‬فإن حالة الخروج هي صفر ؛‪  ‬إذا كان له نوع آخر (مثل سلسلة) ‪ ،‬فستتم طباعة قيمة الكائن وحالة الخروج واحدة ‪ None،‬كذلك‬

‫وبالتالي يمكن ‪) ،‬العبارات‪ try‬جمل‪ ( finally‬تتم ترجمة‪ ‬االستدعاء إلى‪ ‬استثناء بحيث‪ ‬يمكن تنفيذ‪ ‬معالجات‪ L‬التنظيف)(‪sys.exit‬‬


‫يمكن استخدام الدالة إذا ومما ال ريب لزم األمر )(‪ os._exit‬لمصحح األخطاء تنفيذ برنامج نصي دون المخاطرة بفقدان التحكم‪ .‬و‬
‫‪ os.fork()).‬على سبيل المثال‪ ،‬في عملية طفل بعد استدعاء( بإيجابية للخروج فورا‬

‫‪code‬‬

‫)‪ None.‬االفتراضيات إلى(‪. ‬حالة الخروج أو رسالة الخطأ التي تم تمريرها إلى المُنشئ‬

‫‪ TypeError‬استثناء‬

‫‪ .‬يُطلق عند تطبيق عملية أو وظيفة على كائن من نوع غير مناسب‪ .‬القيمة المرتبطة هي سلسلة تعطي تفاصيل حول عدم تطابق النوع‬

‫قد يُثار هذا االستثناء من خالل رمز المستخدم لإلشارة إلى أن محاولة إجراء عملية على كائن غير مدعومة ‪ ،‬وليس من المفترض أن‬
‫ً‬
‫تنفيذا بعد‬ ‫فإن االستثناء ‪ ، NotImplementedError‬تكون كذلك‪  .‬إذا كان الغرض من الكائن هو دعم عملية معينة ولكن لم يقدم‬
‫‪.‬المناسب‪ L‬هو رفعه‬

‫‪Pg. 262‬‬
‫ولكن ‪) TypeError،‬يكون متوقعًا‪ int‬عندما‪ a list‬على سبيل المثال تمرير( يجب أن ينتج عن‪ ‬تمرير الوسيطات من النوع الخاطئ‬
‫‪ ValueError.‬تمرير الوسيطات ذات القيمة الخاطئة (على سبيل المثال ‪ ،‬رقم خارج الحدود المتوقعة) يجب أن ينتج عنه‬

‫‪ UnboundLocalError‬استثناء‬

‫‪  NameError.‬يُطلق عند اإلشارة إلى متغير محلي في دالة أو طريقة ‪ ،‬ولكن لم يتم ربط أي قيمة بهذا المتغير‪ .‬هذه فئة فرعية من‬

‫‪ UnicodeError‬استثناء‬

‫‪ ValueError.‬إنها فئة فرعية من‪ Unicode. ‬يُطلق عند حدوث خطأ ترميز أو فك تشفير متعلق بـ‬

‫يعطي ]‪ ، err.object[err.start:err.end‬له سمات تصف خطأ الترميز أو فك التشفير‪ .‬على سبيل المثال‪UnicodeError‬‬


‫‪.‬اإلدخال غير الصحيح الذي فشل برنامج الترميز عليه‬

‫‪encoding‬‬

‫‪.‬اسم الترميز الذي أثار الخطأ‬

‫‪reason‬‬

‫‪.‬سلسلة تصف خطأ الترميز المحدد‬

‫‪object‬‬

‫‪.‬الكائن الذي يحاول برنامج الترميز ترميزه أو فك ترميزه‬

‫‪start‬‬

‫‪ object.‬الفهرس األول للبيانات غير الصالحة بتنسيق‬

‫‪end‬‬

‫‪ object.‬الفهرس بعد آخر بيانات غير صالحة بتنسيق‬

‫‪ UnicodeEncodeError‬استثناء‬

‫‪ UnicodeError.‬أثناء التشفير‪ .‬إنها فئة فرعية من ‪ Unicode‬يُطلق عند حدوث خطأ متعلق بـ‬

‫‪ UnicodeDecodeError‬استثناء‬

‫‪ UnicodeError.‬أثناء فك التشفير‪ .‬إنها فئة فرعية من ‪ Unicode‬يُطلق عند حدوث خطأ متعلق بـ‬

‫‪ UnicodeTranslateError‬استثناء‬

‫‪ UnicodeError.‬أثناء الترجمة‪ .‬إنها فئة فرعية من ‪ Unicode‬يُطلق عند حدوث خطأ متعلق بـ‬

‫‪ ValueError‬استثناء‬

‫يُطلق عندما تتلقى عملية أو دالة وسيطة من النوع الصحيح ولكن بقيمة غير مناسبة ‪ ،‬وال يتم وصف الموقف باستثناء أكثر دقة‬
‫‪ IndexError.‬مثل‬

‫‪ ZeroDivisionError‬استثناء‬

‫‪ُ .‬ت رفع عندما تكون الوسيطة الثانية لقسمة أو عملية نمطية صفراً‪ .‬القيمة المرتبطة هي سلسلة تشير إلى نوع المعامالت‪ L‬والعملية‬

‫‪ OSError.‬فهي أسماء‪ L‬مستعارة لـ ‪ Python 3.3 ،‬يتم االحتفاظ باالستثناءات التالية للتوافق مع اإلصدارات السابقة ؛‪ ‬بدءًا من‬

‫‪ EnvironmentError‬استثناء‬

‫‪ IOError‬استثناء‬

‫‪Pg. 263‬‬
‫‪ WindowsError‬استثناء‬

‫‪ Windows.‬متوفر فقط على‬

‫‪ ‬استثناءات نظام التشغيل‬


‫ً‬
‫اعتمادا على رمز خطأ النظام ‪ OSError،‬االستثناءات التالية هي فئات فرعية من‬ ‫‪.‬يتم رفعها‬

‫‪ BlockingIOError‬استثناء‬

‫يُطلق عندما يتم حظر عملية ما على كائن (على سبيل المثال ‪ ،‬مقبس) تم تعيينه لعملية غير معطلة‪ .‬يتوافق‬
‫‪ EINPROGRESS.‬و‪ errno EAGAIN، EALREADY، EWOULDBLOCK‬مع‬

‫‪:‬يمكن أن يكون لديك سمة أخرى‪ OSError، BlockingIOError‬باإلضافة إلى تلك الخاصة‬

‫‪characters_written‬‬

‫عدد صحيح يحتوي على عدد األحرف المكتوبة في الدفق قبل حظره‪  .‬تتوفر هذه السمة عند استخدام فئات اإلدخال ‪ /‬اإلخراج المخزنة‬
‫‪.‬الوحدة النمطية‪ io‬مؤق ًتا من‬

‫‪ ChildProcessError‬استثناء‬

‫‪ errno ECHILD.‬يُطلق عند فشل عملية على عملية فرعية‪ .‬يتوافق مع‬

‫‪ ConnectionError‬استثناء‬

‫‪.‬فئة أساسية للقضايا المتعلقة باالتصال‬

‫‪ BrokenPipeError، ConnectionAbortedError، ConnectionRefusedError‬فرعية هي‬
‫‪ ConnectionResetError.‬و‬

‫‪ BrokenPipeError‬استثناء‬

‫يتم رفعها عند محاولة الكتابة على أنبوب بينما يكون الطرف اآلخر مغل ًقا ‪ ،‬أو عند محاولة ‪ ConnectionError،‬فئة فرعية لـ‬
‫‪ ESHUTDOWN.‬و‪ errno EPIPE‬الكتابة على مقبس تم إغالقه بسبب الكتابة‪ .‬يتوافق مع‬

‫‪ ConnectionAbortedError‬استثناء‬

‫يتم رفعها عندما يتم إحباط محاولة اتصال بواسطة النظير‪ .‬يتوافق ‪ ConnectionError،‬فئة فرعية لـ‬
‫‪ errno ECONNABORTED.‬مع‬

‫‪ ConnectionRefusedError‬استثناء‬

‫‪ errno ECONNREFUSED.‬يتم رفعها عند رفض النظير محاولة االتصال‪ .‬يتوافق مع ‪ ConnectionError،‬فئة فرعية لـ‬

‫‪ ConnectionResetError‬استثناء‬

‫‪ errno ECONNRESET.‬يتم رفعها عند إعادة تعيين االتصال بواسطة النظير‪ .‬يتوافق مع ‪ ConnectionError،‬فئة فرعية من‬

‫‪ FileExistsError‬استثناء‬

‫‪ errno EEXIST.‬يُثار عند محاولة إنشاء ملف أو دليل موجود بالفعل‪ .‬يتوافق مع‬

‫‪ FileNotFoundError‬استثناء‬

‫‪ errno ENOENT.‬يُطلق عند طلب ملف أو دليل ولكنه غير موجود‪ .‬يتوافق مع‬

‫‪ InterruptedError‬استثناء‬

‫‪ errno EINTR.‬يُطلق عند مقاطعة مكالمة‪ L‬نظام بواسطة إشارة واردة‪ .‬يتوافق مع‬

‫‪Pg. 264‬‬
‫بواسطة إشارة ‪ ،‬إال إذا قام معالج ‪ syscall‬اآلن محاولة مكالمات النظام عند مقاطعة ‪ Python‬تم التغيير في اإلصدار ‪ :3.5‬تعيد‬
‫‪InterruptedError.‬بدالً من الرفع ‪) ،‬لألساس المنطقي‪PEP 475 ‬راجع( اإلشارة بإثارة استثناء‬

‫‪ IsADirectoryError‬استثناء‬

‫‪ errno EISDIR.‬في دليل‪ .‬يتوافق مع ))(‪ os.remove‬مثل( يُطلق عند طلب عملية ملف‬

‫‪ NotADirectoryError‬استثناء‬

‫ضا إذا حاولت عملية ‪ POSIX ،‬على شيء ليس دليالً‪ .‬في معظم أنظمة ))(‪ os.listdir‬مثل( يُطلق عند طلب عملية دليل‬
‫قد يتم رفعه أي ً‬
‫اًل‬
‫‪ errno ENOTDIR.‬ما فتح ملف غير دليل أو اجتيازه كما لو كان دلي ‪ .‬يتوافق مع‬

‫‪ PermissionError‬استثناء‬

‫يُطلق عند محاولة تشغيل عملية بدون حقوق الوصول المناسبة ‪ -‬على سبيل المثال أذونات نظام الملفات‪ .‬يتوافق‬
‫‪ EPERM.‬و‪ errno EACCES‬مع‬

‫‪ ProcessLookupError‬استثناء‬

‫‪ errno ESRCH.‬يُطلق عندما ال توجد عملية معينة‪ .‬يتوافق مع‬

‫‪ TimeoutError‬استثناء‬

‫‪ errno ETIMEDOUT.‬يُطلق عند انتهاء مهلة إحدى وظائف النظام على مستوى النظام‪ .‬يتوافق مع‬

‫‪ .‬تمت إضافة‪ ‬جميع‪ ‬الفئات الفرعية‪ ‬المذكورة أعاله‪:OSError ‬الجديد في اإلصدار ‪3.3‬‬

‫أنظر أيضا‬

‫‪ ‬‬

‫‪ IO‬إعادة صياغة التسلسل الهرمي الستثناءات نظام التشغيل و ‪PEP 3151 -‬‬

‫‪Warnings‬‬

‫‪ُ .‬تستخدم االستثناءات التالية كفئة تحذير ؛‪ ‬راجع‪ ‬وثائق "‪ ‬فئات التحذير"‪ ‬للحصول على مزيد من التفاصيل‬

‫‪ Warning‬استثناء‬

‫‪.‬فئة أساسية لفئات التحذير‬

‫‪ UserWarning‬استثناء‬

‫‪.‬الصنف األساسي للتحذيرات التي تم إنشاؤها بواسطة كود المستخدم‬

‫‪ DeprecationWarning‬استثناء‬

‫‪.‬اآلخرين ‪ Python‬الفئة األساسية‪ L‬للتحذيرات المتعلقة بالميزات المهملة عندما تكون هذه التحذيرات مخصصة لمطوري‬

‫يؤدي تمكين‪ ‬وضع ‪ (PEP 565 ). ‬الوحدة النمطية__‪ __main‬تم تجاهله بواسطة عوامل تصفية التحذير االفتراضية ‪ ،‬باستثناء‬
‫‪.‬إلى‪ ‬إظهار‪ ‬هذا التحذير‪ Python ‬تطوير‬

‫‪ .‬تم وصف سياسة اإليقاف في‪ ‬بيب ‪387‬‬

‫‪ PendingDeprecationWarning‬استثناء‬

‫‪.‬الفئة األساسية‪ L‬للتحذيرات المتعلقة بالميزات القديمة والمتوقع إهمالها في المستقبل ‪ ،‬ولكن لم يتم إهمالها في الوقت الحالي‬

‫ويفضل في ‪ ، DeprecationWarning ‬نادرً ا ما يتم استخدام هذه الفئة ألن إرسال تحذير بشأن إهمال قادم محتمل أمر غير معتاد‬
‫‪.‬حاالت اإلهمال النشطة بالفعل‬

‫‪Pg. 265‬‬
‫‪.‬إلى‪ ‬إظهار‪ ‬هذا التحذير‪ Python ‬تم تجاهله بواسطة عوامل تصفية التحذير االفتراضية‪ .‬يؤدي تمكين‪ ‬وضع تطوير‬

‫‪ .‬تم وصف سياسة اإليقاف في‪ ‬بيب ‪387‬‬

‫‪ SyntaxWarning‬استثناء‬

‫‪.‬الصنف األساسي للتحذيرات المتعلقة بالصياغة المشكوك فيها‬

‫‪ RuntimeWarning‬استثناء‬

‫‪.‬الصنف األساسي للتحذيرات المتعلقة بسلوك وقت التشغيل المشكوك فيه‬

‫‪ FutureWarning‬استثناء‬

‫الفئة األساسية‪ L‬للتحذيرات المتعلقة بالميزات المهملة عندما تكون هذه التحذيرات مخصصة للمستخدمين النهائيين للتطبيقات المكتوبة‬
‫‪ Python.‬بلغة‬

‫‪ ImportWarning‬استثناء‬

‫‪.‬الصنف األساسي للتحذيرات حول األخطاء المحتملة في عمليات استيراد الوحدة‬

‫‪.‬إلى‪ ‬إظهار‪ ‬هذا التحذير‪ Python ‬تم تجاهله بواسطة عوامل تصفية التحذير االفتراضية‪ .‬يؤدي تمكين‪ ‬وضع تطوير‬

‫‪ UnicodeWarning‬استثناء‬

‫‪ Unicode.‬الفئة األساسية للتحذيرات المتعلقة بـ‬

‫‪ EncodingWarning‬استثناء‬

‫‪.‬الصنف األساسي للتحذيرات المتعلقة بالترميزات‬

‫‪.‬للحصول على التفاصيل‪ Opt-in EncodingWarning ‬راجع‬

‫الجديد في اإلصدار ‪3.10.1‬‬

‫‪ BytesWarning‬استثناء‬

‫‪ bytearray.‬و‪ bytes‬الفئة األساسية للتحذيرات المتعلقة بـ‬

‫‪ ResourceWarning‬استثناء‬

‫‪.‬الصنف األساسي للتحذيرات المتعلقة باستخدام الموارد‬

‫‪.‬إلى‪ ‬إظهار‪ ‬هذا التحذير‪ Python ‬تم تجاهله بواسطة عوامل تصفية التحذير االفتراضية‪ .‬يؤدي تمكين‪ ‬وضع تطوير‬

‫الجديد في اإلصدار ‪3.2.1‬‬


‫‪ ‬التسلسل الهرمي لالستثناء‬

‫‪:‬التسلسل الهرمي للفئة لالستثناءات المضمنة هو‬

‫‪BaseException‬‬

‫‪+-- SystemExit‬‬

‫‪+-- KeyboardInterrupt‬‬

‫‪+-- GeneratorExit‬‬

‫‪+-- Exception‬‬

‫‪+-- StopIteration‬‬

‫‪Pg. 266‬‬
+-- StopAsyncIteration

+-- ArithmeticError

| +-- FloatingPointError

| +-- OverflowError

| +-- ZeroDivisionError

+-- AssertionError

+-- AttributeError

+-- BufferError

+-- EOFError

+-- ImportError

| +-- ModuleNotFoundError

+-- LookupError

| +-- IndexError

| +-- KeyError

+-- MemoryError

+-- NameError

| +-- UnboundLocalError

+-- OSError

| +-- BlockingIOError

| +-- ChildProcessError

| +-- ConnectionError

| | +-- BrokenPipeError

| | +-- ConnectionAbortedError

| | +-- ConnectionRefusedError

| | +-- ConnectionResetError

| +-- FileExistsError

| +-- FileNotFoundError

| +-- InterruptedError

| +-- IsADirectoryError

| +-- NotADirectoryError

| +-- PermissionError

Pg. 267
| +-- ProcessLookupError

| +-- TimeoutError

+-- ReferenceError

+-- RuntimeError

| +-- NotImplementedError

| +-- RecursionError

+-- SyntaxError

| +-- IndentationError

| +-- TabError

+-- SystemError

+-- TypeError

+-- ValueError

| +-- UnicodeError

| +-- UnicodeDecodeError

| +-- UnicodeEncodeError

| +-- UnicodeTranslateError

+-- Warning

+-- DeprecationWarning

+-- PendingDeprecationWarning

+-- RuntimeWarning

+-- SyntaxWarning

+-- UserWarning

+-- FutureWarning

+-- ImportWarning

+-- UnicodeWarning

+-- BytesWarning

+-- EncodingWarning

+-- ResourceWarning

‫ معالجة النصوص‬L‫خدمات‬ 

‫توفر الوحدات الموضحة في هذا الفصل نطا ًقا واس ًعا من عمليات معالجة السالسل وخدمات معالجة النصوص األخرى‬.

Pg. 268
‫الوحدة الموصوفة ضمن‪ ‬خدمات‪ L‬البيانات الثنائية وثيقة‪ ‬الصلة أيضً ا بمعالجة النصوص‪ .‬باإلضافة إلى ذلك ‪ ،‬راجع ‪ codecs‬تعتبر‬
‫‪ Text Sequence Type - str .‬المضمنة في ‪ Python‬الوثائق الخاصة بنوع سلسلة‬

‫‪ ‬عمليات السلسلة الشائعة ‪string-‬‬

‫‪: Lib / string.py‬كود المصدر‬

‫أنظر أيضا‬

‫‪ ‬‬

‫‪ - str‬نوع تسلسل النص‬

‫طرق السلسلة‬
‫‪ ‬ثوابت السلسلة‬

‫‪:‬الثوابت المحددة في هذه الوحدة هي‬

‫‪string.ascii_letters‬‬

‫‪.‬صفت الثوابت أدناه‪ .‬هذه القيمة ال تعتمد على اإلعدادات المحلية‪ ascii_uppercase ‬و‪ ascii_lowercase‬في سلسلة من‬

‫‪string.ascii_lowercase‬‬

‫‪.‬هذه القيمة ال تعتمد على اإلعدادات المحلية ولن تتغير‪ 'abcdefghijklmnopqrstuvwxyz'. ‬األحرف الصغيرة‬

‫‪string.ascii_uppercase‬‬

‫‪.‬هذه القيمة ال تعتمد على اإلعدادات المحلية ولن تتغير‪ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. ‬األحرف الكبيرة‬

‫‪string.digits‬‬

‫‪'.‬السلسلة‪0123456789' ‬‬

‫‪string.hexdigits‬‬

‫‪abcdefABCDEF'.‬السلسلة‪0123456789' ‬‬

‫‪string.octdigits‬‬

‫‪'.‬السلسلة‪01234567' ‬‬

‫‪string.punctuation‬‬

‫‪: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.‬اللغة‪ C‬التي تعتبر عالمات الترقيم في ‪ ASCII‬سلسلة من األحرف‬

‫‪string.printable‬‬

‫‪ whitespace.‬و ‪ digits، ascii_letters، punctuation،‬التي تعتبر قابلة للطباعة‪ .‬هذا هو مزيج من ‪ ASCII‬سلسلة أحرف‬

‫‪string.whitespace‬‬

‫التي تعتبر مسافة‪ L‬بيضاء‪ .‬يتضمن ذلك مسافة األحرف ‪ ،‬وعالمة التبويب ‪ ،‬وتغذية األسطر ‪ ASCII ،‬سلسلة تحتوي على جميع أحرف‬
‫‪.‬والعودة ‪ ،‬وتغذية النموذج ‪ ،‬وعالمة التبويب العمودية‬

‫‪ ‬تنسيق سلسلة مخصص‬

‫‪Pg. 269‬‬
‫الطريقة الموضحة في‪ ‬بيب)(‪ format‬توفر فئة السلسلة المضمنة القدرة على إجراء استبداالت متغيرة معقدة وتنسيق القيمة عبر‬
‫الوحدة تسمح لك إلنشاء وتخصيص سلسلة تنسيق السلوكيات الخاصة بك باستخدام نفس تنفيذ ‪string‬فئة في‪ . 3101Formatter‬و‬
‫‪.‬األسلوب)(‪format‬مثل المدمج في‬

‫‪ string.Formatter‬فئة‬

‫‪:‬الفصل الطرق العامة التالية‪ Formatter‬يستخدم‬

‫‪format( format_string ، / ، * args ، ** kwargs  ) ‬‬

‫األساسية‪  .‬يأخذ سلسلة تنسيق ومجموعة عشوائية من الوسائط الموضعية والكلمات الرئيسية‪ .‬إنه مجرد غالف ‪ API‬طريقة‬
‫‪ vformat().‬يستدعي‬

‫‪ .‬تم التغيير في اإلصدار ‪ :3.7‬أصبحت اآلن وسيطة سلسلة التنسيق موضعية‪ ‬فقط‬

‫‪vformat( format_string ، args ، kwargs ) ‬‬

‫تقوم هذه الوظيفة بالعمل الفعلي للتنسيق‪ .‬يتم عرضه كدالة منفصلة للحاالت التي تريد فيها المرور في قاموس محدد مسب ًقا للوسيطات‬
‫يقوم بعمل تقسيم )(‪. vformat‬الجملة‪ **kwargs ‬وبناء‪ ، *args‬بدالً من تفريغ وإعادة حزم القاموس كوسيطات فردية باستخدام‬
‫‪.‬سلسلة التنسيق إلى بيانات شخصية وحقول االستبدال‪ .‬يستدعي الطرق المختلفة الموضحة أدناه‬

‫‪:‬يحدد عدد من الطرق التي من المفترض أن يتم استبدالها بالفئات الفرعية‪ ، Formatter‬باإلضافة إلى ذلك‬

‫‪parse( format_string ) ‬‬

‫من المجموعات ‪ iterable‬والعودة ‪ format_string‬حلقة على‬


‫لتقسيم السلسلة إلى نص )(‪ vformat‬يتم استخدام هذا من قبل‪ ). ‬تحويل ‪( literal_text ، FIELD_NAME ، format_spec ، ‬‬
‫‪.‬حرفي أو حقول بديلة‬

‫تمثل القيم الموجودة في المجموعة من الناحية المفاهيمية نطا ًقا من النص الحرفي متبو ًعا بحقل بديل واحد‪ .‬إذا لم يكن هناك نص‬
‫سلسلة ذات طول صفري‪ .‬إذا لم ‪ literal_text ‬حرفي (والذي يمكن أن يحدث في حالة حدوث حقلين بديلين على التوالي) ‪ ،‬فستكون‬
‫‪ None.‬و‪ ‬تحويل‪ ‬سيكون‪ FIELD_NAME ، format_spec ‬يكن هناك مجال االستبدال‪ ،‬ثم قيم‬

‫‪ ، kwargs ) ‬وسائط ‪get_field( FIELD_NAME ، ‬‬

‫‪ tuple (obj،‬قم بتحويله إلى كائن ليتم تنسيقه‪ .‬إرجاع ‪) ،‬انظر أعاله()(‪ parse‬بالنظر إلى اسم‪ ‬الحقل‪ ‬كما تم إرجاعه بواسطة‬
‫يتم ‪ "label.title". ‬مثل "‪[ 0‬االسم]" أو ‪PEP 3101 ،‬يأخذ اإلصدار االفتراضي سالسل من النموذج المحدد في‪used_key). ‬‬
‫‪get_value().‬لها نفس معنى‪ ‬المعلمة‪  ‬الرئيسية‪ ‬لـ‪ used_key ‬قيمة اإلرجاع‪ vformat(). ‬إلى‪ kwargs ‬و‪ args ‬تمرير‬

‫‪get_value( key ، args ، kwargs ) ‬‬

‫استرجع قيمة حقل معينة‪ .‬و‪ ‬مفتاح‪ ‬والحجة أن تكون إما عدد صحيح أو سلسلة‪ .‬إذا كان عد ًدا صحيحً ا ‪ ،‬فإنه يمثل فهرس الوسيطة‬
‫‪ kwargs .‬؛‪ ‬إذا كانت سلسلة ‪ ،‬فإنها تمثل وسيطة مسماة‪ L‬في‪ args ‬الموضعية في‬

‫معلمة تم تعيينها إلى القاموس الحجج الكلمات‪ kwargs  L‬و ‪ vformat()،‬و‪ ‬سائط‪ ‬معلمة تم تعيينها إلى قائمة الوسائط الموضعية ل‬
‫‪.‬الرئيسية‬

‫بالنسبة ألسماء الحقول المركبة ‪ ،‬يتم استدعاء هذه الوظائف فقط للمكون األول من اسم الحقل ؛‪ ‬يتم التعامل مع المكونات الالحقة من‬
‫‪.‬خالل السمة العادية وعمليات الفهرسة‬

‫سيتم ‪. name ‬في استدعائه باستخدام‪ ‬وسيطة‪ ‬رئيسية‪ ‬تساوي‪.name" get_value()0 ‬على سبيل المثال ‪ ،‬قد يتسبب تعبير الحقل "‪0‬‬
‫‪.‬الوظيفة المضمنة)(‪ getattr‬اإلرجاع عن طريق استدعاء)(‪ get_value‬البحث عن السمة بعد عمليات‬

‫‪.‬رفع‪ KeyError‬أو‪ IndexError‬إذا كان الفهرس أو الكلمة األساسية تشير إلى عنصر غير موجود ‪ ،‬فيجب رفع‬

‫‪ ، kwargs ) ‬وسائط ‪check_unused_args( used_args ، ‬‬

‫‪Pg. 270‬‬
‫تنفيذ التحقق من الحجج غير المستخدمة إذا رغبت في ذلك‪  .‬وسيطات هذه الوظيفة هي مجموعة جميع مفاتيح الوسيطات التي تمت‬
‫اإلشارة إليها بالفعل في سلسلة التنسيق (األعداد الصحيحة للوسيطات الموضعية ‪ ،‬وسالسل الوسيطات المسماة) ‪ ،‬وإشارة‬
‫غير المستخدمة من هذه ‪ Args‬يمكن حساب مجموعة‪ vformat. ‬التي تم تمريرها إلى‪ kwargs ‬و‪ args ‬إلى‬
‫‪.‬يُفترض أن يُثير استثنا ًء إذا فشل الشيك)(‪. check_unused_args‬المعلمات‪L‬‬

‫‪ ، format_spec ) ‬القيمة ‪format_field( ‬‬

‫‪.‬المدمجة‪  .‬يتم توفير الطريقة بحيث يمكن للفئات الفرعية تجاوزها)(‪ format‬ببساطة يدعو العالمية)(‪format_field‬‬

‫‪ ) ‬قيمة‪ ، ‬تحويل ‪convert_field( ‬‬

‫)(‪ parse‬كما في المجموعة التي ُترجعها‪ (L‬في حالة تحديد نوع التحويل ))(‪ get_field‬المُرجعة بواسطة( لتحويل القيمة‬
‫‪ 'a' (ascii).‬و )‪ 'r' (repr‬و )‪ 's' (str‬يتفهم اإلصدار االفتراضي أنواع تحويل‪). ‬الطريقة‬

‫‪ ‬تنسيق صيغة السلسلة‬

‫على الرغم من ( الطبقة تشترك في نفس الجملة من أجل سالسل التنسيق‪ Formatter‬طريقة و)(‪ str.format‬على‬
‫يرتبط بناء الجملة‪ ‬بصيغة األحرف الحرفية ‪). ‬يمكن تحديد الفئات الفرعية تركيب سلسلة التنسيق الخاصة بهم ‪ Formatter،‬حالة‬
‫ً‬
‫تعقيد ا ‪ ،‬وعلى وجه الخصوص ‪ ،‬ال يدعم التعبيرات العشوائية‬ ‫‪.‬للسلسلة المنسقة‪ ، ‬ولكنه أقل‬

‫تحتوي سالسل التنسيق على "حقول استبدال" محاطة بأقواس معقوفة‪ .}{ ‬أي شيء غير موجود في األقواس يعتبر نصً ا حرفيًا ‪ ،‬يتم‬
‫‪.‬نسخه دون تغيير إلى اإلخراج‪  .‬إذا كنت بحاجة إلى تضمين حرف قوس في النص الحرفي ‪ ،‬فيمكن تجاوزه بمضاعفة‪{{ :‬و‪}} ‬‬

‫‪:‬القواعد النحوية لحقل االستبدال هي كما يلي‬

‫"}" ]‪replace_field :: = "{" [ field_name] ["!" conversion] [":" format_spec‬‬

‫‪FIELD_NAME‬‬ ‫* )"]"‪:: = arg_name ( "." attribute_name| "[" element_index‬‬

‫‪arg_name‬‬ ‫]‪:: = [ identifier| digit+‬‬

‫اسم السمة‬ ‫‪:: = identifier‬‬

‫‪element_index‬‬ ‫‪:: = digit+ |index_string‬‬

‫‪index_string‬‬ ‫‪ "]"> +‬أي حرف مصدر باستثناء< = ‪::‬‬

‫التحويل‬ ‫"ق" | "أ" | "‪:: = "r‬‬

‫‪format_spec‬‬ ‫>الموصوفة في القسم التالي< = ‪::‬‬

‫الذي يحدد الكائن الذي سيتم تنسيق قيمته وإدراجها في ‪ field_name ‬بعبارات أقل رسمية ‪ ،‬يمكن أن يبدأ حقل االستبدال باسم‬
‫يتبع اختياريا من قبل‪ ‬تحويل‪ ‬الميدان‪ ،‬التي يسبقها عالمة تعجب‪ FIELD_NAME  ،'!' ‬اإلخراج بدالً من حقل االستبدال‪ .‬و‬
‫‪.‬الذي يسبقه القولون‪ .':' ‬هذه تحدد تنسي ًقا غير افتراضي لقيمة االستبدال‪ format_spec ‬و‬

‫‪ .‬راجع أيضًا‪ ‬قسم‪ ‬اللغة المصغرة لمواصفات التنسيق‬

‫إما أن يكون رقما أو الكلمة‪ .‬إذا كان رقمًا ‪ ،‬فإنه يشير إلى وسيطة موضعية ‪ ،‬وإذا ‪ arg_name ‬نفسه يبدأ مع‪ FIELD_NAME ‬و‬
‫الرقمية في سلسلة تنسيق هي ‪ arg_names ، 0‬كانت كلمة أساسية ‪ ،‬فإنها تشير إلى وسيطة كلمة أساسية مسماة‪ .‬إذا كانت أسماء‪L‬‬
‫‪ ... ، 2 ، 1‬في تسلسل ‪ ،‬فيمكن حذفها جميعً ا (وليس بعضها فقط) وسيتم إدراج األرقام ‪ ... ، 2 ، 1 ، 0‬تلقائيًا بهذا الترتيب‪ .‬نظرً ا‬
‫ليس‪ ‬محد ًدا‪ ‬بعالمات‪ L‬اقتباس ‪ ،‬فال يمكن تحديد مفاتيح قاموس عشوائية (على سبيل المثال ‪ ،‬السالسل‪'10' ‬أو‪ arg_name  )']-:' ‬ألن‬
‫يحدد‪ ‬تعبير '‪. '.name‬يمكن اتباعها من قبل أي عدد من مؤشر أو السمة التعبيرات‪ arg_name ‬داخل سلسلة تنسيق‪ .‬و‬
‫‪ __getitem__().‬بالبحث في الفهرس باستخدام‪ '[index]' ‬بينما يقوم تعبير النموذج ‪getattr()،‬النموذج‪ ‬السمة المسماة‪ L‬باستخدام‬

‫لذا‪ ‬فهي مكافئة ‪ str.format()،‬تم التغيير في اإلصدار ‪ :3.1‬يمكن حذف محددات المعطيات الموضعية من أجل‬
‫)‪ .'{} {}'.format(a, b)'{0} {1}'.format(a, b‬لـ‬

‫‪ Formatter.‬تم التغيير في اإلصدار ‪ :3.4‬يمكن حذف محددات المعطيات الموضعية‬

‫‪Pg. 271‬‬
‫‪:‬بعض أمثلة سالسل التنسيق البسيطة‬

‫‪"First, thou shalt count to {0}" # References first positional argument‬‬

‫"}{ ‪"Bring me a‬‬ ‫‪# Implicitly references the first positional argument‬‬

‫"}{ ‪"From {} to‬‬ ‫"}‪# Same as "From {0} to {1‬‬

‫"}‪"My quest is {name‬‬ ‫'‪# References keyword argument 'name‬‬

‫"}‪"Weight in tons {0.weight‬‬ ‫‪# 'weight' attribute of first positional arg‬‬

‫‪"Units destroyed: {players[0]}" # First element of keyword argument 'players'.‬‬

‫بطريقة القيمة نفسها‪ .‬ومع ذلك ‪ ،‬في )(__‪ __format‬و‪ ‬تحويل‪ ‬يتسبب الحقل نوع اإلكراه قبل تهيئة‪ .‬عاد ًة ما تتم مهمة تنسيق القيمة‬
‫بعض الحاالت ‪ ،‬من المستحسن فرض تنسيق نوع ما كسلسلة ‪ ،‬لتجاوز تعريف التنسيق الخاص به‪ .‬بتحويل القيمة إلى سلسلة قبل‬
‫‪.‬يتم تجاوز منطق التنسيق العادي ‪ __format__()،‬االتصال‬

‫‪ ascii().‬التي المكالمات'‪ '!a‬و)(‪ repr‬والتي المكالمات'‪، '!r‬على القيمة‪ str() ‬التي المكالمات‪: '!s'L‬يتم دعم ثالثة أعالم تحويل حاليا‬

‫‪:‬بعض األمثلة‬

‫"}‪"Harold's a clever {0!s‬‬ ‫‪# Calls str() on the argument first‬‬

‫‪"Bring out the holy {name!r}" # Calls repr() on the argument first‬‬

‫"}‪"More {!a‬‬ ‫‪# Calls ascii() on the argument first‬‬

‫يحتوي الحقل على تحديد كيف ينبغي أن تقدم قيمة‪ ،‬بما في ذلك تفاصيل مثل عرض الحقل‪ ،‬والمحاذاة‪ ،‬الحشو‪ format_spec  ،‬و‬
‫‪ format_spec .‬عشري الدقة وهلم جرا‪ .‬يمكن لكل نوع قيمة أن يحدد "لغة التنسيق المصغرة" الخاصة به أو تفسير‪ ‬التنسيق‬

‫‪.‬تدعم معظم األنواع المضمنة لغة تنسيق مصغرة شائعة ‪ ،‬والتي سيتم وصفها في القسم التالي‬

‫الحقل يمكن أن تشمل أيضا مجاالت استبدال متداخلة داخلها‪ .‬قد تحتوي حقول االستبدال المتداخلة هذه على اسم ‪A format_spec ‬‬
‫قبل‪ ‬تف ‪ format_spec‬حقل وعالمة تحويل ومواصفات تنسيق ‪ ،‬ولكن ال يُسمح بالتداخل األعمق‪ .‬يتم استبدال حقول االستبدال ضمن‬
‫‪.‬يسمح ذلك بتحديد تنسيق القيمة ديناميكيًا‪ format_spec . ‬سير‪ ‬سلسلة‬

‫‪.‬راجع‪ ‬قسم‪ ‬أمثلة التنسيق‪ ‬للحصول على بعض األمثلة‬

‫‪ ‬مواصفات التنسيق لغة مصغرة‬


‫وتستخدم "مواصفات تنسيق" ضمن الحقول استبدال الواردة ضمن سلسلة التنسيق لتحديد كيفية القيم الفردية يتم عرض (انظر‪ ‬شكل‬
‫الوظيفة المضمنة‪ .‬قد يحدد كل نوع قابل )(‪ format‬سلسلة التركيب‪ ‬و‪ ‬سلسلة منسق الحرفية‪ .) ‬يمكن أيضً ا تمريرها مباشرة إلى‬
‫‪.‬للتنسيق كيفية تفسير مواصفات التنسيق‬

‫تنفذ معظم األنواع المضمنة الخيارات التالية لمواصفات التنسيق ‪ ،‬على الرغم من أن بعض خيارات التنسيق مدعومة فقط من خالل‬
‫‪.‬األنواع الرقمية‬

‫القيمة‪ .‬عاد ًة ما تقوم مواصفات )(‪ str‬االصطالح العام هو أن مواصفات التنسيق الفارغة تنتج نفس النتيجة كما لو كنت قد استدعت‬
‫‪.‬التنسيق غير الفارغة بتعديل النتيجة‬

‫‪:‬الشكل العام لمُحدد‪ ‬التنسيق القياسي‪ ‬هو‬

‫‪format_spec‬‬ ‫]‪:: = [[ fill] align] [ sign] [#] [0] [ width] [ grouping_option] [. precision] [ type‬‬

‫‪< = ::‬أي حرف‬ ‫>ملء‬

‫محاذاة‬ ‫"^" | "=" | ">" | "<" = ‪::‬‬

‫‪Pg. 272‬‬
‫عالمة‬ ‫"" | "‪:: = "+" | "-‬‬

‫العرض‬ ‫‪:: = digit+‬‬

‫"‪grouping_option :: = "_" | "،‬‬

‫الدقة‬ ‫‪:: = digit+‬‬

‫‪" = ::‬ب" | "ج" | "د" | "ه" | "ه" | "و‬ ‫"‪" | "x" | "X" | "٪‬ن" | "س" | "ق" | "‪" | "G‬ز" | "‪" | "F‬النوع‬

‫إذا‪ ‬تم تحديد قيمة‪ ‬محاذاة‪ ‬صالحة‪ ، ‬فيمكن أن يسبقها‪ ‬حرف‪ ‬تعبئة‪ ‬يمكن أن يكون أي حرف‪ ‬ويتم تعيينه‪ ‬افتراضيًا على مسافة‪ L‬إذا تم‬
‫حذفه‪ .‬ال يمكن استخدام قوس متعرج حرفي ("‪ "{ ‬أو "‪ )"} ‬كحرف‪ ‬تعبئة‪ ‬في‪ ‬سلسلة حرفية منسقة‪ ‬أو عند‬
‫الطريقة‪ .‬ومع ذلك ‪ ،‬من الممكن إدراج قوس متعرج مع حقل بديل متداخل‪ .‬هذا القيد ال يؤثر ‪ str.format() ‬استخدام‬
‫‪.‬الوظيفة)(‪ format‬على‬

‫‪:‬معنى خيارات المحاذاة المختلفة كما يلي‬

‫خيا‬
‫المعنى‬
‫ر‬

‫يفرض محاذاة الحقل إلى اليسار داخل المساحة المتاحة‬


‫'<'‬
‫‪(.‬هذا هو اإلعداد االفتراضي لمعظم الكائنات)‬

‫يفرض محاذاة الحقل إلى اليمين داخل المساحة المتاحة‬


‫'>'‬
‫‪(.‬هذا هو اإلعداد االفتراضي لألرقام)‬

‫يفرض وضع الحشوة بعد العالمة (إن وجدت) ولكن‬


‫قبل األرقام‪ .‬يستخدم هذا لطباعة الحقول بالشكل "‪+‬‬
‫'='‬ ‫‪ ."000000120‬خيار المحاذاة هذا صالح فقط‬
‫لألنواع الرقمية‪ .‬يصبح اإلعداد االفتراضي لألرقام‬
‫‪.‬عندما يسبق "‪ "0‬عرض الحقل مباشر ًة‬

‫'^'‬ ‫‪.‬يفرض أن يتم توسيط المجال داخل المساحة المتاحة‬

‫الحظ أنه ما لم يتم تحديد الحد األدنى لعرض الحقل ‪ ،‬فسيكون عرض الحقل دائ ًم ا بنفس حجم البيانات لتعبئته ‪ ،‬بحيث ال يكون لخيار‬
‫‪.‬المحاذاة أي معنى في هذه الحالة‬

‫‪:‬في‪ ‬عالمة‪  ‬الخيار صالحا فقط ألنواع العدد‪ ،‬ويمكن أن يكون أحد الخيارات التالية‬

‫خيار‬ ‫المعنى‬

‫يشير إلى أنه يجب استخدام اإلشارة لكل من األرقام‬


‫'‪'+‬‬
‫‪.‬الموجبة والسالبة‬

‫يشير إلى أنه يجب استخدام اإلشارة لألرقام السالبة‬


‫'‪'-‬‬
‫‪.‬فقط (هذا هو السلوك االفتراضي)‬

‫فضا‬ ‫يشير إلى أنه يجب استخدام مسافة‪ L‬بادئة على األرقام‬
‫ء‬ ‫‪.‬الموجبة وعالمة ناقص على األرقام السالبة‬

‫و‪'#' ‬يتسبب خيار "نموذج بديل" الستخدامها في عملية التحويل‪ .‬يتم تعريف النموذج البديل بشكل مختلف ألنواع مختلفة‪ .‬هذا الخيار‬
‫صالح فقط ألنواع األعداد الصحيحة والعائمة والمعقدة‪  .‬من اجل االعداد الصحيحه‪ ،‬عندما ثنائي‪ ،‬يتم استخدام االنتاج ثماني‪ ،‬أو‬
‫إلى قيمة االنتاج‪ .‬بالنسبة للعوامات والمعقدة ‪ ،‬يتسبب النموذج '‪X‬أو‪b'، '0o'، '0x'، 0' ‬عشري‪ ،‬هذا الخيار يضيف البادئة منها‪0' ‬‬

‫‪Pg. 273‬‬
‫البديل في احتواء نتيجة التحويل دائمًا على حرف فاصلة عشرية ‪ ،‬حتى لو لم تتبعه أرقام‪ .‬عادة ‪ ،‬يظهر حرف الفاصلة العشرية في‬
‫‪.‬التحويالت ‪ ،‬ال تتم إزالة األصفار الالحقة من النتيجة‪ 'G' ‬إلى'‪ 'g‬نتيجة هذه التحويالت فقط إذا تبعه رقم‪ .‬باإلضافة إلى ذلك ‪ ،‬بالنسبة‬

‫‪.‬نوع العرض التقديمي الصحيح بدالً من ذلك'‪ 'n‬يشير‪',' ‬الخيار إلى استخدام فاصلة لفاصل اآلالف‪ .‬لفاصل علم اللغة ‪ ،‬استخدم‬

‫‪PEP 378 ).‬انظر أيضًا( تم التغيير في اإلصدار ‪ :3.1‬تمت إضافة‪',' ‬الخيار‬

‫ألنواع ‪ 'd'. ‬يشير‪'_'  ‬الخيار إلى استخدام شرطة سفلية لفاصل اآلالف ألنواع عرض النقطة العائمة ولنوع العرض التقديمي الصحيح‬
‫سيتم إدراج أحرف (_) كل ‪ 4‬أرقام‪  .‬بالنسبة ألنواع العروض التقديمية األخرى ‪ ،‬يعد تحديد ‪ 'X'،‬و ‪ 'b'، 'o'، 'x'،‬عرضا صحيحا‬
‫‪.‬هذا الخيار خطأ ً‬

‫‪PEP 515 ).‬انظر أيضًا( تم التغيير في اإلصدار ‪ :3.6‬تمت إضافة‪'_' ‬الخيار‬

‫العرض‪  ‬هو عدد صحيح عشري يحدد الحد األدنى إلجمالي عرض الحقل ‪ ،‬بما في ذلك أي بادئات وفواصل وأحرف تنسيق‬
‫‪.‬أخرى‪  .‬إذا لم يتم تحديده ‪ ،‬فسيتم تحديد عرض الحقل من خالل المحتوى‬

‫عندما ال يتم إعطاء محاذاة صريحة ‪ ،‬فإن تسبق‪ ‬حقل‪ ‬العرض'‪ '0‬بحرف‪ ‬صفري (‪ ) ‬يتيح تدرك العالمة عدم ترك‪ ‬مساحة‪ ‬فارغة‬
‫‪ '='.‬لألنواع الرقمية‪ .‬هذا ما يعادل‪ ‬ملء‪ ‬شخصية‪'0' ‬مع‪ ‬محاذاة‪ ‬نوع‬

‫‪.‬تغير في اإلصدار ‪ :3.10‬يسبق‪ ‬العرض‪ ‬الميدان الذي‪'0' ‬لم يعد يؤثر على المحاذاة االفتراضية لسالسل‬

‫أو قبل ‪ 'F'،‬و'‪ 'f‬و‪ ‬الدقة‪  ‬هو رقم عشري وتمثل عدد األرقام يجب أن يتم عرض بعد العالمة العشرية لقيمة النقطة العائمة تنسيق مع‬
‫بالنسبة لألنواع غير الرقمية ‪ ،‬يشير الحقل إلى الحد األقصى لحجم ‪ 'G'. ‬أو'‪ 'g‬وبعد الفاصلة العشرية لقيمة النقطة العائمة تنسيق مع‬
‫‪ .‬الحقل ‪ -‬بمعنى آخر ‪ ،‬عدد األحرف التي سيتم استخدامها من محتوى الحقل‪ .‬و‪ ‬الدقة‪ ‬ال يسمح للقيم صحيح‬

‫‪.‬أخيرً ا ‪ ،‬يحدد‪ ‬النوع‪ ‬كيفية تقديم البيانات‬

‫‪:‬أنواع عروض السالسل المتوفرة هي‬

‫نوع‬ ‫المعنى‬

‫تنسيق السلسلة‪ .‬هذا هو النوع االفتراضي للسالسل‬


‫'‪'s‬‬
‫‪.‬ويمكن حذفه‬

‫ال‬
‫‪ 's'.‬نفس‬
‫أحد‬

‫‪:‬أنواع العروض التقديمية المتوفرة هي‬

‫نوع‬ ‫المعنى‬

‫'‪'b‬‬ ‫‪.‬تنسيق ثنائي‪ .‬يُخرج الرقم في األساس ‪2‬‬

‫اختالف الشخصيات‪ .‬يحول العدد الصحيح إلى رمز‬


‫'‪'c‬‬
‫‪.‬المقابل قبل الطباعة ‪unicode‬‬

‫'‪'d‬‬ ‫‪.‬عدد صحيح عشري‪ .‬يخرج الرقم في األساس ‪10‬‬

‫'‪'o‬‬ ‫‪.‬شكل ثماني‪ .‬يُخرج الرقم في األساس ‪8‬‬

‫تنسيق سداسي عشري‪ .‬إلخراج الرقم في األساس‬


‫'‪'x‬‬
‫‪ ، 16.‬باستخدام أحرف صغيرة لألرقام فوق ‪9‬‬

‫‪Pg. 274‬‬
‫نوع‬ ‫المعنى‬

‫تنسيق سداسي عشري‪ .‬إلخراج الرقم في األساس‬


‫‪ ، 16‬باستخدام األحرف الكبيرة لألرقام أعاله ‪ .9‬في‬
‫'‪'X‬‬
‫سيتم '‪x‬حالة‪'#' ‬تحديد ذلك ‪0' ،‬‬
‫‪.‬أيضًا'‪X‬كتابة‪ ‬البادئة‪ ‬بأحرف‪ ‬علوية‪0' ‬‬

‫باستثناء أنه يستخدم اإلعداد ‪ 'd'،‬عدد‪ .‬هذا هو نفسه‬


‫'‪'n‬‬
‫‪.‬المحلي الحالي إلدراج أحرف فاصل األرقام المناسبة‬

‫ال‬
‫‪ 'd'.‬نفس‬
‫أحد‬

‫( باإلضافة إلى أنواع العروض التقديمية المذكورة أعاله ‪ ،‬يمكن تنسيق األعداد الصحيحة بأنواع عرض النقطة العائمة المدرجة أدناه‬
‫‪.‬يتم استخدامه لتحويل العدد الصحيح إلى رقم فاصلة عائمة قبل التنسيق)(‪ ، float‬عند القيام بذلك‪ None). ‬و'‪ 'n‬باستثناء‬

‫‪:‬القيم هي‪ Decimal‬و‪ float‬أنواع العرض المتاحة ل‬

‫نوع‬ ‫المعنى‬

‫يتم تنسيق ‪ p،‬الترميز العلمي‪ .‬للحصول على دقة معينة‬


‫الذي يفصل المعامل "‪ "e‬الرقم بترميز علمي بالحرف‬
‫‪ p‬عن األس‪ .‬يحتوي المعامل على رقم واحد قبل‬
‫الفاصلة العشرية وأرقام بعد الفاصلة العشرية ‪،‬‬
‫'‪'e‬‬ ‫إلجمالي عدد من‪ ‬األرقام المعنوية‪ .‬بدون تحديد الدقة ‪،‬‬
‫يستخدم دقة‪ ‬األرقام بعد الفاصلة العشرية لـ‪ ، ‬ويظهر‬
‫جميع أرقام المعامل لـ‪ . ‬إذا لم تكن هناك أرقام تتبع‬
‫الفاصلة العشرية ‪ ،‬فسيتم أي ً‬
‫ضا إزالة العالمة العشرية ما‬
‫‪.p + 16floatDecimal#‬لم‪ ‬يتم استخدام الخيار‬

‫ما عدا أنه يستخدم حر ًفا كبيرً ا'‪ 'e‬الترميز العلمي‪ .‬مثل‬


‫'‪'E‬‬
‫‪.‬كحرف فاصل "‪"E‬‬

‫يتم ‪ p،‬تدوين النقطة الثابتة‪ .‬للحصول على دقة معينة‬


‫بأرقام تتبع العالمة العشرية‪ p‬تنسيق الرقم كرقم عشري‬
‫‪ ‬بالضبط‪ . ‬بدون تحديد الدقة ‪ ،‬يستخدم دقة‪6 ‬األرقام بعد‬
‫'‪'f‬‬ ‫ويستخدم دقة كبيرة بما ‪ float،‬الفاصلة العشرية لـ‬
‫إذا لم ‪ Decimal. ‬يكفي إلظهار جميع أرقام المعامل لـ‬
‫تكن هناك أرقام تتبع الفاصلة العشرية ‪ ،‬فسيتم أيضًا‬
‫‪.‬إزالة العالمة العشرية ما لم‪# ‬يتم استخدام الخيار‬

‫‪ nan‬ولكن تحولوا ‪ 'f'،‬تدوين النقطة الثابتة‪ .‬نفس‬


‫'‪'F‬‬
‫‪ INF.‬ل‪ inf‬و‪ NAN‬إلى‬

‫'‪'g‬‬ ‫التنسيق العام‪ .‬للحصول على دقة معينة‪ ، ‬يؤدي هذا إلى‬


‫تقريب الرقم إلى‪ ‬أرقام ذات داللة ثم تنسيق النتيجة إما‬
‫ً‬
‫اعتمادا على‬ ‫بتنسيق النقطة الثابتة أو بالتدوين العلمي ‪،‬‬
‫دقة‪ ‬وتعامل على أنها تعادل ‪. A‬حجمها‬
‫‪ .p >= 1p01‬بدقة‬

‫‪Pg. 275‬‬
‫نوع‬ ‫المعنى‬

‫القواعد الدقيقة هي كما يلي‪ :‬افترض أن النتيجة المنسقة‬


‫سيكون لها ‪ p-1‬والدقة'‪ 'e‬بنوع العرض التقديمي‬
‫بعد ذلك ‪ ،‬إذا كان‪ ‬المكان‪ 4- ‬للعوامات‪ L‬و ‪ exp. 6-‬أس‬
‫لـ‪ ، ‬فسيتم تنسيق الرقم بنوع العرض‬
‫التقديمي‪ ‬والدقة‪ . ‬خالف ذلك ‪ ،‬يتم تنسيق الرقم بنوع‬
‫العرض التقديمي‪ ‬والدقة‪ . ‬في كلتا الحالتين ‪ ،‬تتم إزالة‬
‫األصفار الالحقة غير المهمة من المعنى ‪ ،‬ويتم أيضًا‬
‫إزالة العالمة العشرية إذا لم تكن هناك أرقام متبقية‬
‫تتبعها ‪ ،‬ما لم‪ ‬يتم استخدام‬
‫‪.m <= exp < pmDecimals'f'p-1-‬الخيار‬
‫'‪exp'e'p-1'#‬‬

‫مع عدم تحديد الدقة ‪ ،‬يستخدم دقة من‪ 6 ‬األرقام‬


‫يتم تكوين ‪ Decimal،‬من أجل‪ float. ‬المعنوية لـ‬
‫معامل النتيجة من أرقام معامل القيمة ؛‪ ‬يتم استخدام‬
‫القيمة المطلقة ‪e-6‬الترميز العلمي للقيم األصغر من‪1 ‬‬
‫والقيم حيث تكون القيمة المكانية للرقم األقل داللة أكبر‬
‫‪.‬من ‪ ، 1‬ويتم استخدام تدوين النقطة الثابتة بخالف ذلك‬

‫يتم تنسيق الالنهاية الموجبة والسالبة ‪ ،‬والصفر الموجب‬


‫و‪ inf، -inf- ،0 ‬والسالب ‪ ،‬والنان ‪ ،‬على النحو التالي‬
‫‪.‬التوالي ‪ ،‬بغض النظر عن الدقة‪0 nan‬وعلى‬

‫إذا أصبح '‪ 'E‬ما عدا التبديل إلى'‪ 'g‬التنسيق العام‪ .‬مثل‬


‫'‪'G‬‬ ‫مكتوبة ‪ NaN‬الرقم كبيرً ا ً‬
‫جدا‪ .‬تمثيالت الالنهاية و‬
‫‪.‬بأحرف كبيرة أيضًا‬

‫باستثناء أنه يستخدم اإلعداد ‪ 'g'،‬عدد‪ .‬هذا هو نفسه‬


‫'‪'n‬‬
‫‪.‬المحلي الحالي إلدراج أحرف فاصل األرقام المناسبة‬

‫'‪ 'f‬النسبة المئوية‪ .‬يضرب الرقم في ‪ 100‬ويتم عرضه‬


‫'‪'%‬‬
‫‪.‬بتنسيق‪ ‬ثابت (‪ ، ) ‬متبوعً ا بعالمة النسبة المئوية‬

‫إال أنه عندما يستخدم نقطة ‪ 'g'،‬هذا هو نفس‪ float‬ل‬


‫ثابتة تدوين لتنسيق نتيجة لذلك‪ ،‬فإنه يشمل دائما رقم‬
‫واحد على األقل الماضي الفاصلة العشرية‪ .‬الدقة‬
‫المستخدمة‪ L‬كبيرة بقدر الحاجة لتمثيل القيمة المعطاة‬
‫ال‬ ‫‪.‬بأمانة‬
‫أحد‬
‫بنا ًء على '‪ 'G‬أو'‪ 'g‬هذا هو نفسه ‪ Decimal،‬لهذا‬
‫‪.‬السياق العشري الحالي‪ context.capitals‬قيمة‬

‫كما تم تغييره ‪ str() ‬التأثير الكلي هو مطابقة إخراج‬


‫‪.‬بواسطة معدّالت التنسيق األخرى‬

‫‪ ‬أمثلة على التنسيق‬

‫‪ .‬بناء الجملة والمقارنة مع‪% ‬التنسيق‪ ‬القديم)(‪ str.format‬يحتوي هذا القسم على أمثلة على‬

‫‪Pg. 276‬‬
%' ، ‫على سبيل المثال‬ .% ‫المستخدم بدالً من‬: ‫{}و مع‬ ‫ مع إضافة‬، ‫القديم‬ ‫للتنسيق‬% L‫ يكون بناء الجملة مشاب ًها‬، ‫في معظم الحاالت‬
03.2f'‫يمكن ترجمتها إلى‬ '{:03.2f}'.

ً ‫يدعم بناء جملة التنسيق الجديد أي‬.


‫ كما هو موضح في األمثلة التالية‬، ‫ضا خيارات جديدة ومختلفة‬

‫ الموقف‬L‫الوصول إلى الحجج حسب‬:

>>>

>>> '{0}, {1}, {2}'.format('a', 'b', 'c')

'a, b, c'

>>> '{}, {}, {}'.format('a', 'b', 'c') # 3.1+ only

'a, b, c'

>>> '{2}, {1}, {0}'.format('a', 'b', 'c')

'c, b, a'

>>> '{2}, {1}, {0}'.format(*'abc') # unpacking argument sequence

'c, b, a'

>>> '{0}{1}{0}'.format('abra', 'cad') # arguments' indices can be repeated

'abracadabra'

‫الوصول إلى الحجج باالسم‬:

>>>

>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')

'Coordinates: 37.24N, -115.81W'

>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}

>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)

'Coordinates: 37.24N, -115.81W'

‫ الوسيطات‬L‫الوصول إلى سمات‬:

>>>

>>> c = 3-5j

>>> ('The complex number {0} is formed from the real part {0.real} '

... 'and the imaginary part {0.imag}.').format(c)

'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'

>>> class Point:

... def __init__(self, x, y):

... self.x, self.y = x, y

Pg. 277
... def __str__(self):

... return 'Point({self.x}, {self.y})'.format(self=self)

...

>>> str(Point(4, 2))

'Point(4, 2)'

‫الوصول إلى عناصر الوسيطات‬:

>>>

>>> coord = (3, 5)

>>> 'X: {0[0]}; Y: {0[1]}'.format(coord)

'X: 3; Y: 5'

‫استبدال‬ %s‫و‬ %r:

>>>

>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')

"repr() shows quotes: 'test1'; str() doesn't: test2"

‫محاذاة النص وتحديد العرض‬:

>>>

>>> '{:<30}'.format('left aligned')

'left aligned '

>>> '{:>30}'.format('right aligned')

' right aligned'

>>> '{:^30}'.format('centered')

' centered '

>>> '{:*^30}'.format('centered') # use '*' as a fill char

'***********centered***********'

‫استبدال‬ %+f، %-f‫وتحديد عالمة‬ ‫و‬:% f

>>>

>>> '{:+f}; {:+f}'.format(3.14, -3.14) # show it always

'+3.140000; -3.140000'

>>> '{: f}; {: f}'.format(3.14, -3.14) # show a space for positive numbers

' 3.140000; -3.140000'

>>> '{:-f}; {:-f}'.format(3.14, -3.14) # show only the minus -- same as '{:f}; {:f}'

Pg. 278
'3.140000; -3.140000'

‫استبدال‬ %x‫و‬ %o‫وتحويل القيمة إلى قواعد مختلفة‬:

>>>

>>> # format also supports binary numbers

>>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)

'int: 42; hex: 2a; oct: 52; bin: 101010'

>>> # with 0x, 0o, or 0b as prefix:

>>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)

'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010'

‫باستخدام الفاصلة كفاصل آالف‬:

>>>

>>> '{:,}'.format(1234567890)

'1,234,567,890'

‫التعبير عن النسبة المئوية‬:

>>>

>>> points = 19

>>> total = 22

>>> 'Correct answers: {:.2%}'.format(points/total)

'Correct answers: 86.36%'

‫باستخدام التنسيق الخاص بالنوع‬:

>>>

>>> import datetime

>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)

>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)

'2010-07-04 12:15:58'
ً
‫تعقيدا‬ ‫الحجج المتداخلة واألمثلة األكثر‬:

>>>

>>> for align, text in zip('<^>', ['left', 'center', 'right']):

... '{0:{fill}{align}16}'.format(text, fill=align, align=align)

...

'left<<<<<<<<<<<<'

Pg. 279
‫'^^^^^‪'^^^^^center‬‬

‫'‪'>>>>>>>>>>>right‬‬

‫>>>‬

‫]‪>>> octets = [192, 168, 0, 1‬‬

‫)‪>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets‬‬

‫'‪'C0A80001‬‬

‫)‪>>> int(_, 16‬‬

‫‪3232235521‬‬

‫>>>‬

‫‪>>> width = 5‬‬

‫‪>>> for num in range(5,12):‬‬

‫‪...‬‬ ‫‪for base in 'dXob':‬‬

‫‪...‬‬ ‫)' '=‪print('{0:{width}{base}}'.format(num, base=base, width=width), end‬‬

‫‪...‬‬ ‫)(‪print‬‬

‫‪...‬‬

‫‪5‬‬ ‫‪5‬‬ ‫‪5 101‬‬

‫‪6‬‬ ‫‪6‬‬ ‫‪6 110‬‬

‫‪7‬‬ ‫‪7‬‬ ‫‪7 111‬‬

‫‪8‬‬ ‫‪8 10 1000‬‬

‫‪9‬‬ ‫‪9 11 1001‬‬

‫‪10‬‬ ‫‪A 12 1010‬‬

‫‪11‬‬ ‫‪B 13 1011‬‬

‫‪ ‬سالسل القالب‬
‫توفر سالسل القوالب استبداالت أبسط للسلسلة كما هو موضح في‪ . 292 ‬حالة االستخدام األساسية لسالسل القوالب هي التدويل‬
‫ألنه في هذا السياق ‪ ،‬تجعل البنية والوظائف األبسط عملية الترجمة أسهل من غيرها من مرافق تنسيق السلسلة المضمنة في )‪(i18n‬‬
‫‪ flufl.i18n .‬راجع‪ ‬حزمة ‪ i18n ،‬كمثال على مكتبة مبنية على سالسل قوالب لـ‪Python. ‬‬

‫‪:‬تدعم سالسل القوالب‪$  ‬االستبداالت المستندة إلى القواعد ‪ ،‬باستخدام القواعد التالية‬

‫‪‬‬ ‫‪ $.‬هو الهروب‪ ‬يتم استبداله بمفرده‪$$‬‬

‫‪‬‬ ‫يقتصر على "‪ ، "identifier‬بشكل افتراضي‪ "identifier". ‬يسمي عنصرً ا نائبًا بدياًل يطابق مفتاح تعيين‪$identifier‬‬
‫غير حساسة لحالة األحرف (بما في ذلك الشرطات السفلية) التي تبدأ بشرطة سفلية أو ‪ ASCII‬أي سلسلة أبجدية رقمية‬
‫‪.‬الحرف األول بدون معرف بعد‪$ ‬إنهاء الحرف لمواصفات العنصر النائب هذا‪ ASCII. ‬حرف‬

‫‪‬‬ ‫يكون مطلوبًا عندما تتبع أحرف المعرف الصالحة العنصر النائب ولكنها ليست جزءًا‪ $identifier. ‬يعادل}‪${identifier‬‬
‫‪ "${noun}ification".‬من العنصر النائب ‪ ،‬مثل‬

‫‪Pg. 280‬‬
‫‪.‬رفع‪ ValueError ‬أي مظهر آخر لـ‪$ ‬في السلسلة سينتج عنه‬

‫‪:‬هي‪ Template‬الفئة التي تطبق هذه القواعد‪ .‬طرق‪ Template‬توفر وحدة من‪ string‬و‬

‫‪ ) ‬قالب ‪ string.Template( ‬فئة‬

‫‪.‬يأخذ المُنشئ وسيطة واحدة وهي سلسلة القالب‬

‫‪ ) ‬تعيين = {}‪ ** ، / ، ‬كيلووات ‪substitute( ‬‬

‫ينفذ استبدال القالب ‪ ،‬ويعيد سلسلة جديدة‪ .‬التعيين‪  ‬هو أي كائن يشبه القاموس بمفاتيح تطابق العناصر النائبة في القالب‪ .‬بدالً من ذلك ‪،‬‬
‫مع‪  kwds ‬يمكنك توفير وسيطات الكلمات األساسية ‪ ،‬حيث تكون الكلمات الرئيسية هي العناصر النائبة‪ .‬عند‪ ‬إعطاء‪ ‬كل من‪ ‬التعيين‪ ‬و‬
‫‪ kwds .‬وجود تكرارات ‪ ،‬تكون‪ ‬األولوية‪ ‬للعناصر‪ ‬النائبة من‬

‫‪ ) ‬تعيين = {}‪ ** ، / ، ‬كيلووات ‪safe_substitute( ‬‬

‫استثناء ‪ ،‬سيظهر ‪ KeyError‬فبدالً من رفع ‪ kwds ،‬باستثناء أنه إذا كانت العناصر النائبة مفقودة من‪ ‬التعيين‪ ‬و ‪ substitute()،‬مثل‬
‫ضا ‪ ،‬على عكس مع‬ ‫ستعود‪ ‬أي مظاهر أخرى من ‪ substitute()، $‬العنصر النائب األصلي في السلسلة الناتجة سليمة‪ .‬أي ً‬
‫ً‬
‫‪ ValueError.‬المظهر‪$ ‬بدال من الرفع‬

‫بينما قد تحدث استثناءات أخرى ‪ ،‬تسمى هذه الطريقة "آمنة" ألنها تحاول دائمًا إرجاع سلسلة قابلة لالستخدام بدالً من إثارة‬
‫قد يكون أي شيء بخالف األمان ‪ ،‬ألنه سيتجاهل بصمت القوالب المشوهة التي تحتوي )(‪ ، safe_substitute‬استثناء‪ .‬بمعنى آخر‬
‫‪.‬صالحة ‪ Python‬على محددات متدلية أو أقواس غير متطابقة أو عناصر نائبة ليست معرّفات‪L‬‬

‫‪:‬توفر األمثلة أي ً‬
‫ضا سمة بيانات عامة واحدة‪Template ‬‬

‫‪template‬‬

‫‪.‬هذا هو الكائن الذي تم تمريره إلى‪ ‬وسيطة‪ ‬قالب‪ ‬المنشئ‪  . ‬بشكل عام ‪ ،‬ال يجب تغييره ‪ ،‬ولكن ال يتم فرض الوصول للقراءة فقط‬

‫‪:‬فيما يلي مثال على كيفية استخدام النموذج‬

‫>>>‬

‫‪>>> from string import Template‬‬

‫)'‪>>> s = Template('$who likes $what‬‬

‫)'‪>>> s.substitute(who='tim', what='kung pao‬‬

‫'‪'tim likes kung pao‬‬

‫)'‪>>> d = dict(who='tim‬‬

‫)‪>>> Template('Give $who $100').substitute(d‬‬

‫‪Traceback (most recent call last):‬‬

‫‪...‬‬

‫‪ValueError: Invalid placeholder in string: line 1, col 11‬‬

‫)‪>>> Template('$who likes $what').substitute(d‬‬

‫‪Traceback (most recent call last):‬‬

‫‪...‬‬

‫'‪KeyError: 'what‬‬

‫‪Pg. 281‬‬
‫)‪>>> Template('$who likes $what').safe_substitute(d‬‬

‫'‪'tim likes $what‬‬

‫لتخصيص بناء جملة العنصر النائب أو حرف المحدد أو التعبير العادي ‪ Template‬االستخدام المتقدم‪ :‬يمكنك اشتقاق الفئات الفرعية‬
‫‪:‬بأكمله المستخدم لتحليل سالسل القالب‪ .‬للقيام بذلك ‪ ،‬يمكنك تجاوز سمات الفئة هذه‬

‫‪‬‬ ‫محدد‪ - ‬هذا هو السلسلة الحرفية التي تصف عنصرً ا نائبًا يقدم المحدد‪ .‬القيمة االفتراضية هي‪ .$ ‬الحظ أن هذا‪ ‬ال‪ ‬ينبغي‬
‫هذه السلسلة حسب الحاجة‪ .‬الحظ أيضً ا أنه ال يمكنك تغيير )(‪ re.escape‬أن‪ ‬يكون تعبيرً ا عاديًا ‪ ،‬ألن التنفيذ سيستدعي‬
‫‪.‬المحدد بعد إنشاء الفئة (أي يجب تعيين محدد مختلف في مساحة اسم فئة الفئة الفرعية)‬

‫‪‬‬ ‫هذا هو التعبير العادي الذي يصف نمط العناصر النائبة غير الداعمة‪ .‬القيمة االفتراضية هي التعبير ‪idpattern -‬‬
‫أن هذا النمط ينطبق أيضا على النائبة‪ None‬هو‪ braceidpattern ‬إذا أعطيت هذه و‪ (?a:[_a-z][_a-z0-9]*). ‬العادي‬
‫‪.‬استعدت‬

‫ملحوظة‬

‫‪ ‬‬

‫لهذا ‪ ASCII. ‬يمكن أن يتطابق‪ ‬النمط‪ ‬مع بعض األحرف بخالف]‪ re.IGNORECASE، [a-z‬نظرً ا ألن‪ ‬العالمات‪ L‬االفتراضية‪ ‬هي‬


‫‪.‬العلم‪ ‬المحلي‪ ‬هنا‪ a‬السبب نستخدم‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.7‬يمكن استخدام‪ ‬نمط الدعامة‪ ‬لتحديد أنماط منفصلة مستخدمة داخل األقواس وخارجها‬

‫‪‬‬ ‫التي ‪ None‬يشبه‪ ‬نمط الهوية‪ ‬ولكنه يصف النمط الخاص‪ ‬بالعناصر النائبة المجهزة‪ . ‬االفتراضيات ‪braceidpattern -‬‬
‫تعني الرجوع إلى‪ ‬نمط الهوية‪(  ‬أي يتم استخدام نفس النمط في كل من األقواس الداخلية والخارجية)‪ .‬إذا تم تقديمه ‪ ،‬فسيتيح‬
‫‪.‬لك ذلك تحديد أنماط مختلفة للعناصر النائبة المستقيمة وغير المستقرة‬

‫الجديد في اإلصدار ‪3.7.1‬‬


‫‪‬‬ ‫إشارات‪ - ‬إشارات‪  ‬التعبير العادي التي سيتم تطبيقها عند تجميع التعبير العادي المستخدم للتعرف على االستبداالت‪ .‬القيمة‬
‫ستتم إضافتها‪ L‬دائمًا إلى العالمات‪ ، L‬لذلك‪ ‬يجب أن ‪ re.VERBOSE‬الحظ أنه‪ re.IGNORECASE. ‬االفتراضية هي‬
‫‪.‬تتبع‪ ‬أنماط التعريف‪ ‬المخصصة‪ ‬اصطالحات التعبيرات العادية المطولة‬

‫الجديد في اإلصدار ‪3.2.1‬‬


‫بدالً من ذلك ‪ ،‬يمكنك توفير نمط التعبير العادي بالكامل عن طريق تجاوز‪ ‬نمط‪ ‬سمة الفئة‪ . ‬إذا قمت بذلك ‪ ،‬يجب أن تكون القيمة كائن‬
‫تعبير عادي بأربع مجموعات التقاط مسماة‪ .‬تتوافق مجموعات االلتقاط مع القواعد المذكورة أعاله ‪ ،‬جنبًا إلى جنب مع قاعدة العنصر‬
‫‪:‬النائب غير الصالحة‬

‫‪‬‬ ‫‪.‬تطابق هذه المجموعة تسلسل الهروب ‪ ،‬على سبيل المثال‪ ،$$ ‬في النمط االفتراضي ‪escaped -‬‬

‫‪‬‬ ‫‪.‬مسمى‪ - ‬تتطابق هذه المجموعة مع اسم العنصر النائب غير المفصول ؛‪ ‬ال ينبغي أن يتضمن المحدد في مجموعة االلتقاط‬

‫‪‬‬ ‫دعامة‪ - ‬تتطابق هذه المجموعة مع اسم العنصر النائب المضمن في قوس ؛‪ ‬ال ينبغي أن يتضمن إما المحدد أو األقواس في‬
‫‪.‬مجموعة االلتقاط‬

‫‪‬‬ ‫غير صالح‪ - ‬تتطابق هذه المجموعة مع أي نمط محدد آخر (عاد ًة ما يكون محد ًدا واح ًدا) ‪ ،‬ويجب أن تظهر أخيرً ا في‬
‫‪.‬التعبير العادي‬

‫‪ ‬وظائف المساعد‬

‫‪ ) ‬سبتمبر‪  =  ‬ال يوجد ‪string.capwords( S ، ‬‬

‫وانضم إلى ‪ str.capitalize()،‬واستعمل األحرف الكبيرة في كل كلمة باستخدام ‪ str.split()،‬قسّم الحجة إلى كلمات باستخدام‬
‫تم استبدال ‪ None،‬غير موجودة أو‪ sep ‬إذا كانت الوسيطة الثانية االختيارية‪ str.join(). ‬الكلمات ذات األحرف الكبيرة باستخدام‬

‫‪Pg. 282‬‬
‫لتقسيم الكلمات ‪ sep ‬مجموعات أحرف المسافات البيضاء بمسافة‪ L‬واحدة وإزالة المسافة البيضاء البادئة والخلفية ‪ ،‬وإال‪ ‬فسيتم‪ ‬استخدام‬
‫‪.‬وضمها‬

‫‪ ‬عمليات التعبير المنتظم ‪re-‬‬

‫‪: Lib / re.py‬كود المصدر‬

‫‪ Perl.‬توفر هذه الوحدة عمليات مطابقة للتعبيرات العادية مماثلة لتلك الموجودة في‬

‫باإلضافة إلى سالسل ‪ 8‬بت )‪ Unicode ( str‬يمكن أن تكون كل من األنماط والسالسل المراد البحث عنها عبارة عن سالسل‬
‫بنمط بايت أو ‪ Unicode‬وسالسل ‪ 8‬بت‪ :‬أي أنه ال يمكنك مطابقة سلسلة ‪ Unicode‬ومع ذلك ‪ ،‬ال يمكن خلط سالسل‪( bytes). ‬‬
‫‪.‬العكس ؛‪  ‬وبالمثل ‪ ،‬عند طلب االستبدال ‪ ،‬يجب أن تكون سلسلة االستبدال من نفس نوع كل من النمط وسلسلة البحث‬

‫تستخدم التعبيرات العادية حرف الخط المائل للخلف (‪ )'\' ‬لإلشارة إلى النماذج الخاصة أو للسماح باستخدام األحرف الخاصة دون‬
‫لنفس الحرف لنفس الغرض في سلسلة حرفية ؛‪ ‬على سبيل المثال ‪ Python ،‬استدعاء معناها الخاص‪ .‬يتعارض هذا مع استخدام‬
‫لمطابقة شرطة مائلة عكسية حرفية ‪ ،‬قد يتعين على المرء أن يكتب‪'\\\\'  ‬كسلسلة نمط ‪ ،‬ألن التعبير العادي يجب أن يكون‬
‫أيضً ا ‪ ،‬يرجى مالحظة أن أي تسلسالت هروب‪ Python. ‬كذلك‪ ،\\ ‬ويجب التعبير عن‪ ‬كل خط مائل عكسي‪\\ ‬داخل سلسلة حرفية في‬
‫وفي ‪ a DeprecationWarning ‬للشرطة المائلة العكسية في السالسل الحرفية تولد اآلن ‪ Python‬غير صالحة في استخدام‬
‫‪.‬سيحدث هذا السلوك حتى لو كان تسلسل هروب صالحً ا للتعبير العادي‪ SyntaxError. ‬المستقبل سيصبح هذا‬

‫األولية ألنماط التعبير العادي ؛‪  ‬ال يتم التعامل مع الخطوط المائلة العكسية بأي طريقة ‪ Python‬الحل هو استخدام تدوين سلسلة‬
‫هي سلسلة مكونة "‪ "\n‬بينما ‪ 'n'،‬هي سلسلة مكونة من حرفين تحتوي على‪'\' ‬و"‪ r"\n‬إذن‪ 'r'. ‬خاصة في سلسلة حرفية مسبوقة بـ‬
‫‪.‬باستخدام تدوين السلسلة األولية ‪ Python‬من حرف واحد تحتوي على سطر جديد‪ .‬عاد ًة ما يتم التعبير عن األنماط في كود‬

‫من المهم مالحظة أن معظم عمليات التعبير العادي متاحة كوظائف على مستوى الوحدة وطرق على‪ ‬التعبيرات العادية‬
‫‪.‬أوالً ‪ ،‬ولكنها تفتقد إلى بعض معلمات‪ L‬الضبط الدقيق ‪ regex‬المترجمة‪ . ‬الوظائف عبارة عن اختصارات ال تتطلب منك تجميع كائن‬

‫أنظر أيضا‬

‫‪ ‬‬

‫وحدة‪ ‬المكتبة القياسية‪ ، ‬ولكنها توفر ‪ re‬التابعة لجهة خارجية‪ ، ‬والتي تحتوي على واجهة برمجة تطبيقات متوافقة مع‪ regex ‬وحدة‬
‫‪ Unicode.‬وظائف إضافية ودعمًا أكثر شموالً لـ‬

‫‪ ‬صيغة التعبير العادي‬

‫مجموعة من السالسل التي تطابقه ؛‪  ‬تتيح لك الوظائف في هذه الوحدة التحقق مما إذا كانت سلسلة معينة )‪ RE‬أو( يحدد التعبير العادي‬
‫‪.‬تطابق تعبيرً ا عاديًا معي ًن ا (أو إذا كان تعبير عادي معين يتطابق مع سلسلة معينة ‪ ،‬والتي تنخفض إلى نفس الشيء)‬

‫أيضًا ‪ AB ‬تعبيرين عاديين ‪ ،‬فإن‪ B ‬و‪  A ‬يمكن أن تكون التعبيرات العادية متسلسلة لتكوين تعبيرات نمطية جديدة ؛‪ ‬إذا كان كل من‬
‫يتم االحتفاظ بهذا إال ‪ AB. ‬ستطابق‪ pq ‬فإن السلسلة ‪ B ،‬تطابق‪ q ‬وسلسلة أخرى‪ A ‬مع‪ p ‬تعبير عادي‪ .‬بشكل عام ‪ ،‬إذا‪ ‬تطابق‪ ‬سلسلة‬
‫تحتوي على عمليات ذات أسبقية منخفضة ؛‪ ‬شروط الحدود بين‪ ‬أ‪ ‬و‪ ‬ب؛‪ ‬أو لديك مراجع مجموعة مرقمة‪ .‬وبالتالي ‪ B  ،‬أو‪ A ‬إذا كانت‬
‫يمكن بسهولة بناء التعبيرات المعقدة من تعبيرات بدائية أبسط مثل تلك الموصوفة هنا‪ .‬للحصول على تفاصيل حول نظرية وتنفيذ‬
‫‪.‬أو تقريبًا أي كتاب مدرسي حول إنشاء المترجم ‪ Friedl [Frie09] ،‬التعبيرات‪ ‬النمطية‪ ، ‬راجع كتاب‬

‫‪ .‬فيما يلي شرح موجز لتنسيق التعبيرات النمطية‪  .‬لمزيد من المعلومات والعرض التقديمي اللطيف ‪ ،‬استشر طريقة‪ ‬التعبير العادي‬

‫أو‪ ،'0' ‬هي أبسط التعبيرات '‪ 'A'، 'a‬يمكن أن تحتوي التعبيرات العادية على أحرف خاصة وعادية‪ .‬معظم األحرف العادية ‪ ،‬مثل‬
‫في بقية هذا (‪ 'last'. ‬تتطابق مع السلسلة‪ last‬النمطية ؛‪ ‬هم ببساطة يتطابقون مع أنفسهم‪ .‬يمكنك تجميع األحرف العادية ‪ ،‬بحيث‬
‫'‪ .)this special style'in single quotes‬بالداخل‪ ، ‬عاد ًة بدون عالمات اقتباس ‪ ،‬والسالسل المراد مطابقتها ‪ RE‬القسم ‪ ،‬سنكتب‬

‫بعض الشخصيات ‪ ،‬مثل‪'|' ‬أو‪ ،'(' ‬خاصة‪  .‬تشير األحرف الخاصة إما إلى فئات من األحرف العادية ‪ ،‬أو تؤثر على كيفية تفسير‬
‫‪.‬التعبيرات العادية المحيطة بها‬

‫‪Pg. 283‬‬
‫بشكل مباشر‪ .‬هذا يتجنب الغموض مع الحقة المعدل غير الجشع‪ ،? ‬ومع )إلخ ‪ ( *، +، ?، {m,n}،‬ال يمكن دمج مؤهالت التكرار‬
‫المعدالت األخرى في التطبيقات األخرى‪  .‬لتطبيق التكرار الثاني على التكرار الداخلي ‪ ،‬يمكن استخدام األقواس‪ .‬على سبيل‬
‫‪.‬أحرف'‪ 'a‬يطابق‪ ‬التعبير‪ ‬أي مضاعف لستة*)}‪ ، (?:a{6‬المثال‬

‫‪:‬الشخصيات الخاصة هي‬

‫‪.‬‬

‫تم تحديد العلم ‪ ،‬فهذا يطابق أي حرف ‪ DOTALL‬في الوضع االفتراضي ‪ ،‬يتطابق هذا مع أي حرف باستثناء سطر جديد‪ .‬إذا )‪.‬نقطة(‬
‫‪.‬بما في ذلك سطر جديد‬

‫^‬

‫‪.‬الوضع يتطابق أيضً ا مباشرة بعد كل سطر جديد‪ MULTILINE‬يطابق بداية السلسلة ‪ ،‬وفي )عالمة اإلقحام(‬

‫‪$‬‬

‫ضا قبل السطر ‪ MULTILINE‬يطابق نهاية السلسلة أو قبل السطر الجديد مباشر ًة في نهاية السلسلة ‪ ،‬وفي‬
‫الوضع يتطابق أي ً‬
‫‪ foo.$‬فقط‪ .‬المثير لالهتمام أكثر‪ ،‬والبحث عن "‪ "foo‬يطابق‪ ‬التعبير العادي‪ foo$‬بينما ‪ "foobar" ،‬و "‪ "foo‬يطابق‪. foo ‬الجديد‬
‫سيجد '‪ 'foo\n‬الوضع‪ .‬البحث عن واحد‪$ ‬في‪ MULTILINE‬في "‪ "foo1‬المباريات عادة‪ ،‬ولكن "‪ 'foo1\nfoo2\n' "foo2‬في‬
‫‪.‬مطابقتين (فارغتين)‪ :‬واحدة قبل السطر الجديد مباشرة ‪ ،‬وواحدة في نهاية السلسلة‬

‫*‬

‫"‪ "ab‬أو "‪ "a‬سيطابق*‪. ab‬الناتجة مع ‪ 0‬أو أكثر من التكرارات السابقة ‪ ،‬بأكبر عدد ممكن من التكرارات ‪ RE‬يتسبب في أن تتطابق‬
‫‪ "b's".‬متبو ًعا بأي عدد من "‪ "a‬أو‬

‫‪+‬‬

‫سيطابق "أ" متبو ًعا بأي عدد غير صفري من "ب" ؛‪ ‬لن ‪. ab+‬السابق ‪ RE‬الناتج مع تكرار واحد أو أكثر من ‪ RE‬يتسبب في تطابق‬
‫‪.‬تتطابق مع "أ" فقط‬

‫?‬

‫‪ "ab".‬أو "‪ "a‬سيطابق إما?‪. ab‬السابق ‪ RE‬الناتجة ‪ 0‬أو ‪ 1‬تكرار من ‪ RE‬يتسبب في مطابقة‬

‫??‪*?, +?, ‬‬

‫و‪'+' ،'*' ‬و‪'?' ‬التصفيات كلها‪ ‬الجشع‪ . ‬تتطابق مع أكبر قدر ممكن من النص‪ .‬أحيا ًنا يكون هذا السلوك غير مرغوب‬
‫ضد‪ ، ‬فسوف تتطابق مع السلسلة بأكملها ‪ ،‬وليس فقط‪ . ‬اإلضافة‪ ‬بعد التصفيات تجعلها تؤدي المباراة ‪ RE ‬فيه ؛‪ ‬إذا‪>*.< ‬تمت مطابقة‬
‫بطريقة‪ ‬غير جشعة‪ L‬أو‪ ‬بسيطة‪ ‬؛‪ ‬سيتم مطابقة‪ ‬أقل‪ ‬عدد‪ ‬ممكن من األحرف‪ .‬استخدام الطاقة المتجددة‬
‫'>‪ .'<a> b <c>''<a>'?<.*?>'<a‬سيتطابق‪ ‬فقط‬

‫}‪{m‬‬

‫بالكامل‪ .‬على ‪ RE‬السابقة يجب أن تكون مطابقة ؛‪ ‬عدد أقل من التطابقات يتسبب في عدم تطابق ‪ RE‬بالضبط‪ ‬من‪ m ‬يحدد أن‪ ‬نسخ‬
‫‪.‬أحرف‪ ‬بالضبط‪ ، ‬لكن ليس خمسة'‪ 'a‬سيطابق ستة}‪ ، a{6‬سبيل المثال‬

‫}‪{m,n‬‬

‫السابق ‪ ،‬في محاولة لمطابقة أكبر عدد ممكن من التكرارات‪ .‬على سبيل ‪ RE‬تكرارً ا لـ‪ n ‬إلى‪ m ‬الناتج من ‪ RE‬يتسبب في تطابق‬
‫حدا علويًا ‪ n ‬إلى‪ ‬تحديد الحد األدنى للصفر ‪ ،‬وحذف ‪ m‬أحرف‪ .‬يؤدي حذف'‪ 'a‬سيتطابق من ‪ 3‬إلى ‪ ، a{3,5}5‬المثال‬ ‫يحدد ً‬
‫ال يجوز حذف ‪ 'aaab'. ‬ولكن ليس ‪ 'b'،‬حرف متبو ًعا بـ'‪ 'a‬أو ألف'‪ 'aaaab‬سوف تطابق‪ ، a{4,}b‬النهائيًا‪ .‬على سبيل المثال‬
‫‪.‬الفاصلة أو قد يتم الخلط بين المع ّدل والنموذج الموصوف ساب ًقا‬

‫?}‪{m,n‬‬

‫‪Pg. 284‬‬
‫السابق ‪ ،‬في محاولة لمطابقة أقل‪ ‬عدد‪ ‬ممكن من التكرارات‪ .‬هذه هي النسخة ‪ RE‬تكرارً ا لـ‪ n ‬إلى‪ m ‬الناتج من ‪ RE‬يتسبب في تطابق‬
‫'‪ 'a‬مع ‪ a{3,5}5‬سيتطابق‪ 'aaaaaa'، ‬غير الجشعة‪ L‬من المؤهل السابق‪ .‬على سبيل المثال ‪ ،‬في السلسلة المكونة من ‪ 6‬أحرف‬
‫‪.‬سيتطابق مع ‪ 3‬أحرف فقط?}‪ a{3,5‬أحرف ‪ ،‬بينما‬

‫\‬

‫إما يهرب األحرف الخاصة (السماح لكم لمباراة شخصيات‪ L‬مثل‪'?' ،'*' ‬وهكذا دواليك)‪ ،‬أو إشارات تسلسل خاص‪ .‬يتم مناقشة‬
‫‪.‬التسلسالت الخاصة أدناه‬

‫تستخدم أيضً ا الشرطة المائلة للخلف كتسلسل هروب في سلسلة ‪ Python‬إذا كنت ال تستخدم سلسلة خام للتعبير عن النمط ‪ ،‬فتذكر أن‬
‫حرفية ؛‪  ‬إذا لم يتعرف محلل بايثون على تسلسل الهروب ‪ ،‬فسيتم تضمين الشرطة المائلة للخلف والحرف التالي في السلسلة‬
‫على التسلسل الناتج ‪ ،‬فيجب تكرار الخط المائل العكسي مرتين‪ .‬هذا معقد ويصعب فهمه ‪ Python ،‬الناتجة‪ .‬ومع ذلك ‪ ،‬إذا تعرفت‬
‫‪.‬لذا يوصى بشدة باستخدام سالسل أولية لجميع التعبيرات باستثناء أبسطها‬

‫][‬

‫‪:‬يستخدم لإلشارة إلى مجموعة من األحرف‪ .‬في مجموعة‬

‫‪‬‬ ‫‪ 'k'.‬أو'‪ 'a'، 'm‬سوف تطابق]‪ [amk‬األحرف يمكن سرد كل على حدة‪ ،‬على سبيل المثال‬

‫‪‬‬ ‫سوف يتطابق ]‪ [a-z‬على سبيل المثال ‪ a '-'،‬يمكن اإلشارة إلى نطاقات من األحرف بإعطاء حرفين وفصلهما عن طريق‬
‫‪، [9-0A-‬صغير ‪]9-0[]5-0[ ،‬وسوف يتطابق مع جميع األرقام المكونة من رقمين من‪00 ‬إلى‪ ASCII 59 ‬مع أي حرف‬
‫أو إذا تم وضعه على أنه )]‪ [a\-z‬على سبيل المثال( وسوف يتطابق مع أي رقم سداسي عشري‪ .‬إذا‪- ‬تم الهروب]‪Fa-f‬‬
‫‪ '-'.‬فسوف يتطابق مع‪ ‬الحرف ‪ [a-]) ،‬أو]‪ [-a‬على سبيل المثال( الحرف األول أو األخير‬

‫‪‬‬ ‫تفقد الشخصيات الخاصة معناها الخاص داخل المجموعات‪ .‬على سبيل المثال‪])*+([ ،‬سوف تطابق أي من األحرف‬
‫‪'.‬الحرفية‪ ،'*' ،'+' ،'(' ‬أو‪)' ‬‬

‫‪‬‬ ‫وتقبل أيضا داخل مجموعة‪ ،‬على الرغم من أن الشخصيات التي تطابق )هو موضح أدناه(‪ \S‬أو‪ \w‬الطابع الطبقات مثل‬
‫‪.‬وضع ساري المفعول‪ LOCALE‬أو‪ ASCII‬يعتمد على ما إذا‬

‫‪‬‬ ‫يمكن مطابقة األحرف التي ليست ضمن النطاق من خالل‪ ‬استكمال‪ ‬المجموعة‪ .‬إذا كان الحرف األول من المجموعة‬
‫هو‪ ،'^' ‬فستتم مطابقة‪ ‬جميع األحرف‪ ‬غير‪ ‬الموجودة في المجموعة‪ .‬على سبيل المثال ‪]5^[ ،‬سيتطابق مع أي حرف‬
‫‪.‬باستثناء‪]^^[ ،'5' ‬وسيتطابق مع أي حرف باستثناء‪^  .'^' ‬ليس له معنى خاص إذا لم يكن الحرف األول في المجموعة‬

‫‪‬‬ ‫لمطابقة حرفية‪']'  ‬داخل مجموعة ‪ ،‬اسبقها بشرطة مائلة للخلف ‪ ،‬أو ضعها في بداية المجموعة‪ .‬على سبيل المثال‪ ،‬على حد‬
‫‪.‬سواء‪]}{]\[)([ ‬و‪]}{[)(][ ‬سوف تطابق كل من قوس‬

‫‪‬‬ ‫الفني رقم ‪ 18‬في ‪ Unicode‬قد يتم إضافة‪ ‬دعم المجموعات المتداخلة والعمليات المحددة كما هو الحال في‪ ‬معيار‬
‫سيتم رفعه في حاالت غامضة ‪ FutureWarning‬المستقبل‪  .‬هذا من شأنه أن يغير بناء الجملة ‪ ،‬وذلك لتسهيل هذا التغيير‬
‫في الوقت الحالي‪ .‬يتضمن ذلك مجموعات تبدأ بحرفية‪'[' ‬أو تحتوي على تسلسالت أحرف حرفية‪'&&' ،'--' ‬و‪،'~~' ‬‬
‫‪.‬و‪ .'||' ‬لتجنب التحذير ‪ ،‬تجنبهم بشرطة مائلة للخلف‬

‫يتم رفعه إذا كانت مجموعة األحرف تحتوي على بنيات ستتغير معنويًا في ‪:FutureWarning ‬تم التغيير في اإلصدار ‪3.7‬‬
‫‪.‬المستقبل‬

‫|‬

‫'|'‪ REs ‬يمكن فصل عدد تعسفي من‪ B . ‬أو‪ A ‬يمكن أن تكون الدقة التعسفي‪ ،‬يخلق التعبير العادية التي تتناسب إما‪ B ‬و‪ A ‬حيث‪A|B‬‬
‫بهذه الطريقة‪ .‬يمكن استخدام هذا داخل المجموعات (انظر أدناه) أيضًا‪ .‬أثناء فحص السلسلة المستهدفة‪ ، L‬تتم‬
‫تجربة‪'|' ‬العناصر‪ ‬التي‪ ‬تم‪ ‬فصلها بواسطة‪ ‬من اليسار إلى اليمين‪ .‬عندما يتطابق نمط واحد تمامًا ‪ ،‬يتم قبول هذا الفرع‪ .‬هذا يعني أنه‬
‫أكثر ‪ ،‬حتى لو كان سينتج تطاب ًقا إجماليًا أطول‪ .‬بمعنى آخر ‪'|' ،‬المشغل ليس جش ًعا ً‬
‫أبدا‪ .‬لمطابقة ‪ B ‬لن يتم اختبار‪ A ، ‬بمجرد‪ ‬تطابق‬
‫‪ [|].‬حرفي‪ ،'|' ‬استخدمه‪|\ ‬أو قم بتضمينه داخل فئة حرف ‪ ،‬كما في‬

‫)‪(...‬‬

‫‪Pg. 285‬‬
‫يطابق أي تعبير عادي موجود داخل األقواس ‪ ،‬ويشير إلى بداية المجموعة ونهايتها ؛‪ ‬يمكن استرداد محتويات المجموعة بعد إجراء‬
‫التسلسل الخاص ‪ ،‬الموصوف أدناه‪ .‬لتتناسب مع الحرفية‪'(' ‬أو‪ \number  ،')' ‬المطابقة ‪ ،‬ويمكن مطابقتها الح ًقا في السلسلة مع‬
‫‪: [(]، [)].‬استخدام‪(\ ‬أو‪ ،)\ ‬أو أرفق لهم داخل فئة الحرف‬

‫)‪(?...‬‬

‫يحدد الحرف األول بعد الحرف‪'?' ‬ما هو المعنى وبناء الجملة اإلضافي ‪). ‬ال يعني خالف ذلك'('‪ a ‬هذا تدوين امتداد (ما‪'?' ‬يلي‬
‫هو االستثناء الوحيد لهذه القاعدة‪ .‬فيما يلي الملحقات المدعومة )‪ (?P<name>...‬للبناء‪ .‬ال ُتنشئ اإلضافات عاد ًة مجموعة جديدة ؛‬
‫‪.‬حاليًا‬

‫)‪(?aiLmsux‬‬

‫تطابق المجموعة السلسلة الفارغة ؛‪ ‬تقوم األحرف بتعيين )‪ 'a'، 'i'، 'L'، 'm'، 's'، 'u'، 'x'.‬حرف واحد أو أكثر من المجموعة(‬
‫)متعددة األسطر(‪) ، re.M‬تعتمد على اللغة المحلية(‪) ، re.L‬تجاهل الحالة(‪) ، re.I‬فقط ‪ ASCII‬مطابقة(‪: re.A‬العالمات المقابلة‬
‫لكامل النظام العادي التعبير‪( .‬تم وصف العالمات ‪) ،‬مطول(‪ re.X‬و ‪ Unicode) ،‬مطابقة(‪) ، re.U‬تطابق النقطة مع الكل(‪، re.S‬‬
‫في‪ ‬محتويات الوحدة النمطية‪ ). ‬هذا مفيد إذا كنت ترغب في تضمين العالمات‪ L‬كجزء من التعبير العادي ‪ ،‬بدالً من‬
‫‪.‬الوظيفة‪ .‬يجب استخدام العالمات أوالً في سلسلة التعبير)(‪ re.compile‬تمرير‪ ‬وسيطة‪ ‬العلم‪ ‬إلى‬

‫)‪(?:...‬‬

‫نسخة غير ملتقطة من األقواس العادية‪ .‬يطابق أي تعبير عادي موجود داخل األقواس ‪ ،‬ولكن‪ ‬ال‪ ‬يمكن استرداد‪ ‬السلسلة الفرعية التي‬
‫‪.‬تطابقها المجموعة‪ ‬بعد إجراء مطابقة أو اإلشارة إليها الح ًقا في النمط‬

‫)‪(?aiLmsux-imsx:...‬‬

‫اختياريًا متبوعًا‪'-' ‬بحرف واحد أو أكثر ‪ 'a'، 'i'، 'L'، 'm'، 's'، 'u'، 'x'،‬صفر أو أكثر من األحرف من المجموعة(‬


‫(‪ re.L‬و ) تجاهل الحالة(‪) ، re.I‬فقط ‪ ASCII‬مطابقة(‪: re.A‬تقوم األحرف بتعيين أو إزالة العالمات المقابلة )‪ 'i'، 'm'، 's'، ، 'x'.‬من‬
‫)مطول(‪ re.X‬و )‪ Unicode‬مطابقة(‪ re.U‬و )تطابق النقاط مع الكل(‪ re.S‬و )متعددة األسطر(‪ re.M‬و )تعتمد على اإلعدادات المحلية‬
‫لجزء التعبير‪( .‬تم وصف العالمات‪ L‬في "‪ ‬محتويات الوحدة النمطية"‪). ‬‬

‫تستبعد بعضها البعض عندما تستخدم على النحو األعالم المضمنة‪ ،‬بحيث ال يمكن الجمع أو متابعة‪ .'-' ‬بدالً من'‪ 'u‬و'‪ 'a'، 'L‬الحروف‬
‫?(‪ ‬يتم ‪ Unicode ،‬ذلك ‪ ،‬عندما يظهر أحدهم في مجموعة مضمنة ‪ ،‬فإنه يتجاوز وضع المطابقة في مجموعة التضمين‪ .‬في أنماط‬
‫يتحول إلى )‪ ، (?L:...‬في نمط البايت‪). ‬افتراضي( ‪ Unicode‬ويتحول إلى مطابقة)‪ ، (?u:...‬فقط ‪ ASCII‬التبديل إلى مطابقة)‪a:...‬‬
‫فقط (افتراضي)‪ .‬هذا التجاوز ساري المفعول فقط ‪ ASCII‬ويتحول إلى مطابقة)‪ ، (?a:...‬اإلعدادات المحلية بنا ًء على المطابقة‬
‫‪.‬للمجموعة الضيقة المضمنة ‪ ،‬ويتم استعادة وضع المطابقة األصلي خارج المجموعة‬

‫الجديد في اإلصدار ‪3.6.1‬‬

‫‪.‬يمكن أن تستخدم أيضا في مجموعة'‪ 'u‬و'‪ 'a'، 'L‬تغير في اإلصدار ‪ :3.7‬الرسائل‬

‫)‪(?P<name>...‬‬

‫تشبه األقواس العادية ‪ ،‬ولكن يمكن الوصول إلى السلسلة الفرعية المطابقة بواسطة المجموعة عبر اسم‪ ‬اسم‪ ‬المجموعة‬
‫صالحة ‪ ،‬ويجب تحديد اسم كل مجموعة مرة واحدة فقط في تعبير ‪ Python‬الرمزي‪ . ‬يجب أن تكون أسماء المجموعات معرّفات‪L‬‬
‫‪.‬عادي‪ .‬المجموعة الرمزية هي أيضً ا مجموعة مرقمة ‪ ،‬تمامًا كما لو لم يتم تسمية المجموعة‬

‫أي مطابقة سلسلة ()‪ (?P<quote>['"]).*?(?P=quote‬يمكن اإلشارة إلى المجموعات المسماة‪ L‬في ثالثة سياقات‪ .‬إذا كان النمط هو‬
‫‪):‬مقتبسة بعالمات اقتباس مفردة أو مزدوجة‬

‫"سياق اإلشارة إلى المجموعة "اقتباس‬ ‫طرق الرجوع إليها‬

‫‪‬‬ ‫)كما هو موضح(‪(?P=quote) ‬‬


‫في نفس النمط نفسه‬
‫‪‬‬ ‫‪\1‬‬

‫‪Pg. 286‬‬
‫"سياق اإلشارة إلى المجموعة "اقتباس‬ ‫طرق الرجوع إليها‬

‫‪‬‬ ‫)'‪m.group('quote‬‬
‫عند معالجة كائن المباراة‪ ‬م‬
‫‪‬‬ ‫)‪.‬إلخ(‪m.end('quote') ‬‬

‫‪‬‬ ‫>‪\g<quote‬‬
‫في سلسلة تم تمريرها‬
‫‪‬‬ ‫>‪\g<1‬‬
‫)(‪re.sub‬من‪ repl ‬إلى‪ ‬وسيطة‬
‫‪‬‬ ‫‪\1‬‬

‫)‪(?P=name‬‬

‫‪ .‬مرجع خلفي لمجموعة محددة ؛‪  ‬يتطابق مع أي نص تمت مطابقته من قبل المجموعة المسماة‪ L‬االسم السابق‬

‫)‪(?#...‬‬

‫‪.‬تعليق؛‪ ‬يتم تجاهل محتويات األقواس ببساطة‬

‫)‪(?=...‬‬

‫على سبيل المثال ‪ ،‬سيتطابق‪ ‬فقط إذا كان‪ lookahead . ‬يطابق‪ ‬إذا‪ ‬تطابق التالي ‪ ،‬لكنه ال يستهلك أيًا من السلسلة‪ .‬هذا يسمى‪ ‬تأكيد ‪...‬‬
‫'‪ .Isaac (?=Asimov)'Isaac ''Asimov‬متبوعً ا بعالمة‬

‫)‪(?!...‬‬

‫!?(‪ .Isaac ‬المطابقات إذا‪... ‬لم تتطابق مع التالي‪ .‬هذا‪ ‬تأكيد سلبي ينظر إلى األمام‪ . ‬على سبيل المثال ‪ ،‬سيتطابق‪ ‬فقط إذا‪ ‬لم‪ ‬يتبعه‬
‫'‪Asimov)'Isaac ''Asimov‬‬

‫)‪(?<=...‬‬

‫يطابق إذا كان الموضع الحالي في السلسلة مسبو ًقا بمطابقة‪ ... ‬لتلك النهاية في الموضع الحالي‪ .‬وهذا ما يسمى‪ ‬تأكيد البحث الخلفي‬
‫نظرً ا ألن البحث الخلفي سيعيد نسخ ‪ 3‬أحرف احتياطيًا ويتحقق مما إذا كان النمط ‪ 'abcdef'،‬سيجد تطاب ًقا‪ . (?<=abc)def‬اإليجابي‬
‫*‪ a‬يسمح‪ ،‬ولكن‪ a|b‬أو‪ abc‬المتضمن مطاب ًقا‪  .‬نمط الواردة يجب أن تتطابق فقط سالسل من بعض طول ثابت‪ ،‬وهذا يعني أن‬
‫ليسوا كذلك‪  .‬الحظ أن األنماط التي تبدأ بتأكيدات البحث الخلفية اإليجابية لن تتطابق في بداية السلسلة التي يتم البحث }‪ a{3,4‬و‬
‫‪:‬الوظيفة)(‪ match‬الوظيفة بدالً من)(‪ search‬عنها ؛‪ ‬سترغب على األرجح في استخدام‬

‫>>>‬

‫‪>>> import re‬‬

‫)'‪>>> m = re.search('(?<=abc)def', 'abcdef‬‬

‫)‪>>> m.group(0‬‬

‫'‪'def‬‬

‫‪:‬يبحث هذا المثال عن كلمة تلي واصلة‬

‫>>>‬

‫)'‪>>> m = re.search(r'(?<=-)\w+', 'spam-egg‬‬

‫)‪>>> m.group(0‬‬

‫'‪'egg‬‬

‫‪Pg. 287‬‬
‫‪.‬تم التغيير في اإلصدار ‪ :3.5‬تمت إضافة دعم لمراجع المجموعة ذات الطول الثابت‬

‫)‪(?<!...‬‬

‫يطابق إذا كان الموضع الحالي في السلسلة غير مسبوق بمطابقة لـ‪ .... ‬وهذا ما يسمى‪ ‬تأكيد البحث الخلفي السلبي‪ . ‬على غرار‬
‫تأكيدات البحث الخلفي اإليجابية ‪ ،‬يجب أن يتطابق النمط المضمن فقط مع سالسل ذات طول ثابت‪ .‬قد تتطابق األنماط التي تبدأ‬
‫‪.‬بتأكيدات بحث خلفي سلبية في بداية السلسلة التي يتم البحث عنها‬

‫)‪(?(id/name)yes-pattern|no-pattern‬‬

‫وإذا لم تكن‪ ، no-pattern‬ما إذا كانت المجموعة ذات‪ ‬المعرف‪ ‬أو‪ ‬االسم‪ ‬المحدد‪ ‬موجودة‪ yes-pattern‬سنحاول التطابق مع‬


‫هو نمط ضعيف )‪ ، (<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$‬اختياري ويمكن حذفه‪ .‬على سبيل المثال‪  . no-pattern‬موجودة‬
‫ولكن ليس ‪ 'user@host.com'،‬وكذلك'>‪ '<user@host.com‬لمطابقة البريد اإللكتروني ‪ ،‬والذي سيتطابق مع‬
‫‪ 'user@host.com>'.‬وال'‪ '<user@host.com‬مع‬

‫الناتج ‪ RE‬فإن ‪ ASCII ،‬أو حرف ‪ ASCII‬تتكون التسلسالت الخاصة من‪'\' ‬وحرف من القائمة أدناه‪ .‬إذا لم يكن الحرف العادي رقم‬
‫‪ '$'.‬سيتطابق مع الحرف الثاني‪ .‬على سبيل المثال ‪$\ ،‬يطابق الحرف‬

‫‪\number‬‬

‫يتطابق مع محتويات المجموعة التي لها نفس الرقم‪ .‬يتم ترقيم المجموعات بدءًا من ‪ .1‬على سبيل المثال ‪ ،‬التطابقات‪ ‬أو‪ ، ‬ولكن‬
‫ال‪( ‬الحظ المسافة بعد المجموعة)‪  .‬ال يمكن استخدام هذا التسلسل الخاص إال لمطابقة واحدة من أول ‪ 99‬مجموعة‪ .‬إذا كان الرقم‬
‫األول من‪ ‬رقم‪ ،0 ‬أو‪ ‬عدد‪ ‬غير ‪ 3‬أرقام ثماني طويلة‪ ،‬لن يتم تفسيرها على أنها مباراة المجموعة‪ ،‬ولكن الطابع مع قيمة‬
‫']''[''‪'the the''55 55''thethe‬ثماني‪ ‬عدد‪ . ‬داخل‪ ‬و‪ ‬من فئة حرف‪ ،‬ويتم التعامل مع كل هروب رقمية كما حرفا‪1\ )+.(.‬‬

‫‪\A‬‬

‫‪.‬يطابق فقط في بداية السلسلة‬

‫‪\b‬‬

‫يتطابق مع السلسلة الفارغة ‪ ،‬ولكن في بداية الكلمة أو نهايتها فقط‪ .‬يتم تعريف الكلمة على أنها سلسلة من أحرف الكلمة‪ .‬علما بأن‬
‫وبداية ‪ /‬نهاية السلسلة‪ .‬وهذا يعني ‪ \w‬حرف (أو العكس بالعكس)‪ ،‬أو بين‪ \W‬و‪ \w‬يعرف بأنه الحدود بين‪، \b‬رسميا‬
‫'‪ .'bar foo baz''foobar''foo3‬ولكن ليس‪ ‬أو‪ 'foo'، 'foo.'، '(foo)'، ‬المباريات'‪ r'\bfoo\b‬أن‬

‫ولكن يمكن تغيير ذلك ‪ Unicode ،‬هي تلك المستخدمة في أنماط ‪ Unicode‬بشكل افتراضي ‪ ،‬الحروف األبجدية الرقمية في‬
‫تم استخدام العلم‪ .‬داخل نطاق األحرف‪ LOCALE‬العلم‪ .‬يتم تحديد حدود الكلمات‪ L‬بواسطة اإلعدادات المحلية الحالية إذا‪ ASCII‬باستخدام‬
‫‪ Python.‬يمثل حرف مسافة‪ L‬للخلف للتوافق مع القيم الحرفية لسلسلة‪، \b‬‬

‫‪\B‬‬

‫'‪ r'py\B‬يطابق السلسلة النصية الفارغة ‪ ،‬ولكن فقط عندما‪ ‬ال تكون‪ ‬في بداية الكلمة أو نهايتها‪ .‬وهذا يعني أن‬
‫لذا فإن أحرف الكلمات في أنماط ‪ \b،‬هو عكس ذلك تمامًا‪ 'py!'. \B‬أو'‪ 'py'، 'py.‬ولكن ال ‪ 'python'، 'py3'، 'py2'،‬المباريات‬
‫العلم‪ .‬يتم ‪ ASCII‬أو شرطة سفلية ‪ ،‬على الرغم من أنه يمكن تغيير ذلك باستخدام ‪ Unicode‬هي أحرف أبجدية رقمية ‪Unicode‬‬
‫‪.‬تم استخدام العلم‪ LOCALE‬تحديد حدود الكلمات بواسطة اإلعدادات المحلية الحالية إذا‬

‫‪\d‬‬

‫‪ Unicode (str):‬ألنماط‬

‫وهذا يشمل‪ ،]9-0[ ‬وكذلك العديد من ‪ Unicode [Nd]). ‬أي ‪ ،‬أي حرف في فئة أحرف( ‪ Unicode‬يتطابق مع أي رقم عشري‬
‫‪.‬تم استخدام العلم فقط‪]9-0[ ‬يتم مطابقة‪ ASCII‬األحرف الرقمية األخرى‪ .‬إذا‬

‫‪:‬ألنماط ‪ 8‬بت (بايت)‬

‫‪.‬يتطابق مع أي رقم عشري ؛‪ ‬هذا يعادل‪]9-0[ ‬‬

‫‪Pg. 288‬‬
‫‪\D‬‬

‫‪.‬تم استخدام العلم يصبح هذا مكاف ًئا‪ L‬لـ‪ ASCII]9-0^[ ‬إذا‪ \d. ‬يتطابق مع أي حرف ليس رقمًا عشريًا‪ .‬هذا هو عكس‬

‫‪\s‬‬

‫‪ Unicode (str):‬ألنماط‬

‫البيضاء (التي تتضمن‪ ، ‬والعديد من األحرف األخرى أيضً ا ‪ ،‬على سبيل المثال المسافات غير ‪ Unicode‬يطابق أحرف مسافات‪L‬‬
‫‪ .‬الفاصلة التي تفرضها قواعد الطباعة في العديد من اللغات)‪ .‬إذا‪ ‬تم استخدام العلم ‪ ،‬فسيتم مطابقة‪ ‬فقط‬
‫]‪[ \t\n\r\f\v]ASCII[ \t\n\r\f\v‬‬

‫‪:‬ألنماط ‪ 8‬بت (بايت)‬

‫]‪ .[ \t\n\r\f\v‬؛‪ ‬هذا يعادل ‪ ASCII‬يتطابق مع األحرف التي تعتبر مسافة‪ L‬بيضاء في مجموعة أحرف‬

‫‪\S‬‬

‫]‪ .[^ \t\n\r\f\v‬تم استخدام العلم يصبح هذا مكاف ًئا لـ‪ ASCII‬إذا‪ \s. ‬يتطابق مع أي حرف ليس مسافة‪ L‬بيضاء‪ .‬هذا هو عكس‬

‫‪\w‬‬

‫‪ Unicode (str):‬ألنماط‬

‫؛‪ ‬يتضمن هذا معظم األحرف التي يمكن أن تكون جزءًا من كلمة بأي لغة ‪ ،‬باإلضافة إلى األرقام ‪ Unicode‬يطابق أحرف كلمة‬
‫‪ .‬فسيتم مطابقة‪ ‬فقط]_‪ ، [a-zA-Z0-9‬تم استخدام العلم‪ ASCII‬والشرطة السفلية‪ .‬إذا‬

‫‪:‬ألنماط ‪ 8‬بت (بايت)‬

‫تم استخدام ‪ LOCALE‬إذا‪ [a-zA-Z0-9_]. ‬؛‪ ‬هذا يعادل ‪ ASCII‬األحرف المتطابقة التي تعتبر أبجدية رقمية في مجموعة أحرف‬
‫‪.‬العالمة ‪ ،‬فستتطابق مع األحرف التي تعتبر أبجدية رقمية في اإلعدادات المحلية الحالية والشرطة السفلية‬

‫‪\W‬‬

‫‪ [^a-zA-Z0-‬تم استخدام العلم يصبح هذا مكاف ًئا‪ L‬لـ‪ ASCII‬إذا‪ \w. ‬يتطابق مع أي حرف ليس حر ًفا من أحرف الكلمات‪ .‬هذا هو عكس‬
‫تم استخدام العالمة ‪ ،‬فستتطابق مع األحرف التي ليست أبجدية رقمية في اإلعدادات المحلية الحالية وال الشرطة ‪ LOCALE‬إذا‪9_]. ‬‬
‫‪.‬السفلية‬

‫‪\Z‬‬

‫‪.‬يطابق فقط في نهاية السلسلة‬

‫‪:‬بواسطة محلل التعبير العادي ‪ Python‬يتم أي ً‬


‫ض ا قبول معظم عمليات الهروب القياسية التي تدعمها القيم الحرفية لسلسلة‬

‫‪\a‬‬ ‫‪\b‬‬ ‫‪\f‬‬ ‫‪\n‬‬

‫‪\N‬‬ ‫‪\r‬‬ ‫‪\t‬‬ ‫‪\u‬‬

‫‪\U‬‬ ‫‪\v‬‬ ‫‪\x‬‬ ‫\\‬

‫)‪ .‬يُستخدم لتمثيل حدود الكلمات ‪ ،‬ويعني "مسافة للخلف" فقط داخل فئات األحرف‪ \b‬الحظ أنه(‬

‫يتم التعرف على أحرف فقط في أنماط يونيكود‪ .‬في أنماط البايت هي أخطاء‪ .‬عمليات الهروب غير المعروفة '‪ '\N‬و'‪'\u'، '\U‬‬
‫‪.‬محجوزة لالستخدام في المستقبل ويتم التعامل معها على أنها أخطاء ‪ ASCII‬ألحرف‬

‫يتم تضمين عمليات الهروب أوكتال في شكل محدود‪ .‬إذا كان الرقم األول صفرً ا ‪ ،‬أو إذا كان هناك ثالثة أرقام ثماني ‪ ،‬فسيتم اعتباره‬
‫هروبًا ثمانيًا‪ .‬خالف ذلك ‪ ،‬فهو مرجع مجموعة‪  .‬أما بالنسبة للحروف الحرفية ‪ ،‬فإن عمليات الهروب الثماني دائمًا ما تكون بطول‬
‫‪.‬ثالثة أرقام على األكثر‬

‫‪Pg. 289‬‬
‫‪.‬تم إضافة أحرف'‪ '\U‬و'‪ '\u‬تغير في اإلصدار ‪ :3.3‬و‬

‫‪.‬هي اآلن أخطاء ‪ ASCII‬وحرف ‪ ASCII‬تم التغيير في اإلصدار ‪ :3.6‬عمليات‪ ‬الهروب غير المعروفة المكونة من‪'\' ‬حرف‬

‫تمت إضافة تسلسل هروب‪ .‬كما هو الحال في السلسلة الحرفية ‪ ،‬فإنه يتوسع إلى حرف'}‪ '\N{name‬تغير في اإلصدار ‪ :3.8‬و‬
‫'}‪.'\N{EM DASH‬المسماة (على سبيل المثال‪Unicode ) ‬‬

‫‪ ‬محتويات الوحدة‬
‫تحدد الوحدة العديد من الوظائف والثوابت واالستثناء‪  .‬بعض الوظائف عبارة عن نسخ مبسطة من الطرق المميزة الكاملة للتعبيرات‬
‫‪.‬العادية المترجمة‪ .‬تستخدم معظم التطبيقات غير التافهة‪ L‬دائمًا النموذج المترجم‬

‫‪ enum.IntFlag.‬وهي فئة فرعية من ‪ RegexFlag،‬تم التغيير في اإلصدار ‪ :3.6‬أصبحت‪ ‬ثوابت العالمة اآلن حاالت‬

‫‪ ) ‬نمط‪ ، ‬أعالم‪re.compile( 0  =  ‬‬

‫وغيرها من)(‪ match()، search‬تجميع نمط التعبير العادي إلى‪ ‬وجوه التعبير العادية‪ ، ‬والتي يمكن استخدامها لمطابقة باستخدام لها‬
‫‪.‬األساليب‪ ،‬هو موضح أدناه‬

‫يمكن تعديل سلوك التعبير عن طريق تحديد‪ ‬قيمة‪ ‬إشارات‪ . ‬يمكن أن تكون القيم أيًا من المتغيرات التالية ‪ ،‬مجمعة‪ L‬باستخدام أحادي‬
‫‪).‬عامل التشغيل|‪ OR ( ‬المعامل‬

‫الترتيب‬

‫)‪prog = re.compile(pattern‬‬

‫)‪result = prog.match(string‬‬

‫يعادل‬

‫)‪result = re.match(pattern, string‬‬

‫وحفظ كائن التعبير العادي الناتج إلعادة االستخدام يكون أكثر كفاءة عندما يتم استخدام التعبير عدة )(‪ re.compile‬ولكن استخدام‬
‫‪.‬مرات في برنامج واحد‬

‫ملحوظة‬

‫‪ ‬‬

‫وظائف المطابقة على مستوى الوحدة النمطية يتم تخزينها )(‪ re.compile‬النسخ المترجمة من أحدث األنماط التي تم تمريرها إلى‬
‫عددا قليالً من التعبيرات العادية في وقت واحد‬
‫‪.‬مؤق ًت ا ‪ ،‬لذلك ال داعي للقلق بشأن تجميع التعبيرات العادية للبرامج التي تستخدم ً‬

‫‪re.A‬‬

‫‪re.ASCII‬‬

‫فقط بدال من مطابقة الكامل يونيكود‪ .‬هذا مفيد فقط ألنماط ‪ ASCII‬أداء مطابقة‪ \S ‬و‪ \w، \W، \b، \B، \d، \D، \s‬جعل‬
‫‪ (?a).‬ويتم تجاهله ألنماط البايت‪ .‬يتوافق مع العلم المضمن ‪Unicode ،‬‬

‫ونظيرتها ‪ re.UNICODE‬باإلضافة إلى مرادفها‪ (L‬ال تزال العالمة موجودة‪ ، re.U‬الحظ أنه من أجل التوافق مع اإلصدارات السابقة‬
‫وال يُسمح بمطابقة( افتراضيًا للسالسل ‪ Unicode‬ألن المطابقات هي ‪ Python 3‬ولكنها زائدة عن الحاجة في ‪ (?u)) ،‬المضمنة‬
‫‪).‬للبايت ‪Unicode‬‬

‫‪re.DEBUG‬‬

‫‪.‬عرض معلومات تصحيح األخطاء حول التعبير المترجم‪ .‬ال توجد عالمة مضمنة مقابلة‬

‫‪re.I‬‬

‫‪Pg. 290‬‬
‫‪re.IGNORECASE‬‬

‫‪ Unicode‬سوف تتطابق أيضًا‪ ‬تعبيرات مثل‪ ‬األحرف الصغيرة‪ .‬تعمل مطابقة]‪ [A-Z‬إجراء مطابقة غير حساسة‪ L‬لحالة األحرف ؛‬
‫ضا ما لم )‪ ü‬المطابقة‪ Ü‬مثل( الكاملة‬ ‫ال تغير اإلعدادات المحلية ‪ ASCII. ‬يتم استخدام العالمة لتعطيل التطابقات غير‪ re.ASCII‬أي ً‬
‫‪ (?i).‬يتم استخدام العالمة أيضًا‪ .‬يتوافق مع العلم المضمن‪ re.LOCALE‬الحالية تأثير هذه العالمة ما لم‬

‫‪ ASCII 52‬العلم‪ ،‬وسوف تطابق الحروف‪ IGNORECASE‬يتم استخدامها في تركيبة مع]‪ [A-Z‬أو]‪ [a-z‬الحظ أنه عند أنماط يونيكود‬
‫حرف التيني صغير بدون ‪" (U + 0131 ،‬أنا" ‪)،‬مع نقطة أعاله ‪ I‬حرف التيني ‪" (U + 0130،‬أنا" ‪ ASCII:‬و ‪ 4‬رسائل إضافية غير‬
‫تم استخدام العلم ‪ ،‬فلن تتم ‪ ASCII‬إذا‪). ‬عالمة كلفن ‪ "K" (U + 212A ،‬و )أحرف التينية صغيرة طويلة ‪ i) ، "ſ" (U + 017F ،‬نقاط‬
‫‪".‬مطابقة سوى األحرف من "أ" إلى "ع" و "أ" إلى "ي‬

‫‪re.L‬‬

‫‪re.LOCALE‬‬

‫وتحسس حالة األحرف المطابقة تعتمد على لغة الحالية‪ .‬يمكن استخدام هذه العالمة فقط مع أنماط البايت‪ .‬ال ‪ \w، \W، \b، \B‬جعل‬
‫يُنصح باستخدام هذا العلم ألن آلية اإلعدادات المحلية غير موثوقة للغاية ‪ ،‬فهي تتعامل فقط مع "ثقافة" واحدة في كل مرة ‪ ،‬وال تعمل‬
‫وهي قادرة على التعامل ‪ Unicode (str) ،‬ألنماط ‪ Python 3‬بالفعل افتراضيًا في ‪ Unicode‬إال مع لغات ‪ 8‬بت‪ .‬تم تمكين مطابقة‬
‫‪ (?L).‬مع لغات ‪ /‬لغات مختلفة‪ .‬يتوافق مع العلم المضمن‬

‫‪ re.ASCII.‬يمكن استخدامه فقط مع أنماط البايت وهو غير متوافق مع‪:re.LOCALE ‬تم التغيير في اإلصدار ‪3.6‬‬

‫لم تعد‪ ‬كائنات التعبير العادي المترجمة مع اإلشارة‪ ‬تعتمد على اإلعدادات المحلية في وقت‪:re.LOCALE ‬تم التغيير في اإلصدار ‪3.7‬‬
‫‪.‬الترجمة‪ .‬تؤثر اإلعدادات المحلية فقط في وقت المطابقة على نتيجة المطابقة‬

‫‪re.M‬‬

‫‪re.MULTILINE‬‬

‫عند التحديد ‪'^' ،‬يتطابق‪ ‬حرف النمط‪  ‬في بداية السلسلة وفي بداية كل سطر (مباشرة بعد كل سطر جديد) ؛‪'$' ‬ويتطابق‪ ‬حرف‬
‫النمط‪ ‬في نهاية السلسلة وفي نهاية كل سطر (قبل كل سطر جديد مباشرة)‪ .‬بشكل افتراضي ‪ '^' ،‬يطابق فقط في بداية‬
‫‪ (?m).‬السلسلة ‪'$'  ،‬وفقط في نهاية السلسلة ومباشرة قبل السطر الجديد (إن وجد) في نهاية السلسلة‪ .‬يتوافق مع العلم المضمن‬

‫‪re.S‬‬

‫‪re.DOTALL‬‬

‫اجعل‪'.'  ‬الحرف الخاص يطابق أي حرف على اإلطالق ‪ ،‬بما في ذلك السطر الجديد ؛‪ ‬بدون هذه العالمة ‪'.' ،‬سيطابق أي‬
‫‪ (?s).‬شيء‪ ‬باستثناء‪ ‬سطر جديد‪ .‬يتوافق مع العلم المضمن‬

‫‪re.X‬‬

‫‪re.VERBOSE‬‬

‫تتيح لك هذه العالمة كتابة تعبيرات عادية تبدو أجمل وأكثر قابلية للقراءة من خالل السماح لك بفصل األقسام‪ L‬المنطقية للنمط بصريًا‬
‫وإضافة تعليقات‪  .‬يتم تجاهل المسافة البيضاء داخل النمط ‪ ،‬إال إذا كانت في فئة األحرف ‪ ،‬أو عندما تسبقها شرطة مائلة للخلف لم يتم‬
‫عندما يحتوي السطر على‪# ‬حرف غير موجود في فئة أحرف وال ‪ (?P<...>. ‬تجاوزها ‪ ،‬أو داخل الرموز المميزة مثل‪:?( ،?* ‬أو‬
‫‪.‬يسبقه خط مائل عكسي غير مهذب ‪# ،‬يتم تجاهل‪ ‬جميع األحرف من أقصى اليسار مثل‪ ‬نهاية السطر‬

‫‪:‬هذا يعني أن كائني التعبير العادي التاليين اللذين يتطابقان مع رقم عشري متساويان وظيفيًا‬

‫‪a = re.compile(r"""\d + # the integral part‬‬

‫‪\. # the decimal point‬‬

‫)‪\d * # some fractional digits""", re.X‬‬

‫)"*‪b = re.compile(r"\d+\.\d‬‬

‫‪Pg. 291‬‬
‫‪ (?x).‬يتوافق مع العلم المضمن‬

‫‪ ) ‬نمط‪ ، ‬سلسلة‪ ، ‬أعالم‪re.search( 0  =  ‬‬
‫إذا‪ None‬امسح عبر‪ ‬سلسلة‪ً  ‬‬
‫بحثا عن الموقع األول حيث‪ ‬يُنتج‪ ‬نمط‪ ‬التعبير العادي‪ ‬تطاب ًقا ‪ ،‬ثم قم بإرجاع‪ ‬كائن مطابقة مطابق‪ . ‬العودة‬
‫‪.‬لم يتطابق أي موضع في السلسلة مع النمط ؛‪  ‬الحظ أن هذا يختلف عن العثور على تطابق صفري في نقطة ما في السلسلة‬

‫‪ ) ‬نمط‪ ، ‬سلسلة‪ ، ‬أعالم‪re.match( 0  =  ‬‬

‫إذا ‪ None‬إذا‪ ‬تطابق‪ ‬صفر أو أكثر من األحرف في بداية‪ ‬السلسلة‪ ‬مع‪ ‬نمط‪ ‬التعبير العادي‪ ، ‬فقم‪ ‬بإرجاع‪ ‬كائن مطابقة مطابق‪ . ‬العودة‬


‫‪.‬كانت السلسلة ال تتطابق مع النمط ؛‪ ‬الحظ أن هذا يختلف عن المطابقة الصفرية‬

‫‪.‬سيتطابق فقط في بداية السلسلة وليس في بداية كل سطر)(‪ ، re.match‬الوضع‪ MULTILINE‬الحظ أنه حتى في‬

‫بدالً من ذلك (انظر أيضًا‪ ‬البحث () مقابل المطابقة ‪ search() ‬إذا كنت تريد تحديد موقع تطابق في أي مكان في‪ ‬السلسلة‪ ، ‬فاستخدم‪L‬‬
‫‪) )(.‬‬

‫‪ ) ‬نمط‪ ، ‬سلسلة‪ ، ‬أعالم‪re.fullmatch( 0  =  ‬‬

‫إذا كانت السلسلة ال تتطابق مع‪ None‬إذا كانت‪ ‬السلسلة‪ ‬بأكملها‪ ‬تطابق‪ ‬نمط‪ ‬التعبير العادي‪ ، ‬فقم‪ ‬بإرجاع‪ ‬كائن مطابقة مطابق‪ . ‬العودة‬


‫‪.‬النمط ؛‪ ‬الحظ أن هذا يختلف عن المطابقة الصفرية‬

‫الجديد في اإلصدار ‪3.4.1‬‬

‫‪ ) ‬أعالم‪ ، maxsplit  =  0 ، 0  =  ‬نمط‪ ، ‬سلسلة ‪re.split( ‬‬

‫ضا إرجاع نص جميع المجموعات في‬ ‫قسّم‪ ‬السلسلة‪ ‬حسب تكرارات‪ ‬النمط‪ . ‬إذا تم استخدام أقواس االلتقاط في‪ ‬النمط‪ ، ‬فسيتم أي ً‬
‫غير صفري ‪ ،‬تحدث االنقسامات‪ L‬في أقصى‪ ‬حد‪ ، ‬ويتم إرجاع باقي السلسلة ‪ maxsplit ‬النموذج كجزء من القائمة الناتجة‪ .‬إذا كان‬
‫‪.‬كعنصر نهائي في القائمة‬

‫>>>‬

‫)'‪>>> re.split(r'\W+', 'Words, words, words.‬‬

‫]'' ‪['Words', 'words', 'words',‬‬

‫)'‪>>> re.split(r'(\W+)', 'Words, words, words.‬‬

‫]'' ‪['Words', ', ', 'words', ', ', 'words', '.',‬‬

‫)‪>>> re.split(r'\W+', 'Words, words, words.', 1‬‬

‫]'‪['Words', 'words, words.‬‬

‫)‪>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE‬‬

‫]'‪['0', '3', '9‬‬

‫إذا كانت هناك مجموعات التقاط في الفاصل وكانت مطابقة في بداية السلسلة ‪ ،‬فستبدأ النتيجة بسلسلة فارغة‪ .‬ينطبق األمر نفسه على‬
‫‪:‬نهاية السلسلة‬

‫>>>‬

‫)'‪>>> re.split(r'(\W+)', '...words, words...‬‬

‫]'' ‪['', '...', 'words', ', ', 'words', '...',‬‬

‫‪.‬بهذه الطريقة ‪ ،‬يتم دائ ًم ا العثور على مكونات الفاصل في نفس المؤشرات النسبية ضمن قائمة النتائج‬

‫‪.‬المطابقات الفارغة للنمط تقسم السلسلة فقط عندما ال تكون متجاورة مع مطابقة فارغة سابقة‬

‫‪Pg. 292‬‬
‫>>>‬

‫)'‪>>> re.split(r'\b', 'Words, words, words.‬‬

‫]'‪['', 'Words', ', ', 'words', ', ', 'words', '.‬‬

‫)'‪>>> re.split(r'\W*', '...words...‬‬

‫]'' ‪['', '', 'w', 'o', 'r', 'd', 's', '',‬‬

‫)'‪>>> re.split(r'(\W*)', '...words...‬‬

‫]'' ‪['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '',‬‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.1‬تمت إضافة وسيطة اإلشارات االختيارية‬

‫‪.‬تم التغيير في اإلصدار ‪  :3.7‬تمت إضافة دعم للتقسيم على نمط يمكن أن يتطابق مع سلسلة فارغة‬

‫‪ ) ‬نمط‪ ، ‬سلسلة‪ ، ‬أعالم‪re.findall( 0  =  ‬‬

‫قم بإرجاع جميع التطابقات غير المتداخلة‪ ‬للنمط‪ ‬في‪ ‬سلسلة‪ ، ‬كقائمة سالسل أو مجموعات‪ .‬في‪ ‬سلسلة‪ ‬يتم مسحها من اليسار إلى‬
‫‪.‬اليمين‪ ،‬وعاد مباريات في الترتيب وجدت‪ .‬يتم تضمين مباريات فارغة في النتيجة‬

‫تعتمد النتيجة على عدد مجموعات االلتقاط في النمط‪ .‬إذا لم تكن هناك مجموعات ‪ ،‬فقم بإرجاع قائمة السالسل المطابقة للنمط‬
‫بأكمله‪  .‬إذا كانت هناك مجموعة واحدة بالضبط ‪ ،‬فقم بإرجاع قائمة السالسل المطابقة لتلك المجموعة‪ .‬في حالة وجود مجموعات‬
‫‪.‬متعددة ‪ ،‬قم بإرجاع قائمة مجموعات السالسل التي تطابق المجموعات‪  .‬ال تؤثر المجموعات غير الملتقطة على شكل النتيجة‬

‫>>>‬

‫)'‪>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest‬‬

‫]'‪['foot', 'fell', 'fastest‬‬

‫)'‪>>> re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10‬‬

‫])'‪[('width', '20'), ('height', '10‬‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.7‬يمكن اآلن بدء المباريات غير الفارغة بعد مباراة فارغة سابقة‬

‫‪ ) ‬نمط‪ ، ‬سلسلة‪ ، ‬أعالم‪re.finditer( 0  =  ‬‬

‫في‪ ‬السلسلة‪ . ‬في‪ ‬سلسلة‪ ‬يتم مسحها‪ L‬من ‪ RE ‬قم‪ ‬بإرجاع مكرر‪ ‬ينتج عنه‪ ‬كائنات مطابقة‪ ‬على جميع التطابقات غير المتداخلة‪ ‬لنمط‬
‫‪.‬اليسار إلى اليمين‪ ،‬وعاد مباريات في الترتيب وجدت‪ .‬يتم تضمين مباريات فارغة في النتيجة‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.7‬يمكن اآلن بدء المباريات غير الفارغة بعد مباراة فارغة سابقة‬

‫‪ ) ‬سلسلة‪ ، ‬العد‪ ، 0  =  ‬األعالم‪ ، REPL ، 0  =  ‬نمط ‪re.sub( ‬‬

‫العودة السلسلة التي تم الحصول عليها عن طريق استبدال تواجد أقصى اليسار غير متداخلة من‪ ‬نمط‪ ‬في‪ ‬سلسلة‪ ‬من‬
‫يمكن أن يكون سلسلة أو وظيفة‪ .‬إذا كانت ‪. REPL ‬إذا لم يتم العثور على النمط ‪ ،‬يتم إرجاع‪ ‬السلسلة‪ ‬دون تغيير‪ REPL . ‬استبدال‬
‫وتحويلها إلى حرف إرجاع ‪ ، \r ،‬يتم تحويلها إلى حرف سطر جديد واحد‪ ، \n‬سلسلة ‪ ،‬تتم معالجة أي خط مائل عكسي فيه‪ .‬أي‬
‫محجوزة لالستخدام في المستقبل ويتم التعامل معها على أنها أخطاء‪ .‬حاالت ‪ ASCII‬وهكذا‪ .‬عمليات الهروب غير المعروفة ألحرف‬
‫الهروب األخرى غير المعروفة مثل‪&\ ‬تركت بمفردها‪6\ .‬يتم استبدال‪ ‬التفضيالت الخلفية ‪ ،‬مثل ‪ ،‬بالسلسلة‪ ‬الفرعية المطابقة‬
‫‪:‬للمجموعة ‪ 6‬في النمط‪ .‬على سبيل المثال‬

‫>>>‬

‫‪>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',‬‬

‫‪Pg. 293‬‬
‫‪...‬‬ ‫‪r'static PyObject*\npy_\1(void)\n{',‬‬

‫‪...‬‬ ‫)'‪'def myfunc():‬‬

‫'{‪'static PyObject*\npy_myfunc(void)\n‬‬

‫هي وظيفة‪ ،‬ويسمى كل قوع متداخلة غير من‪ ‬نمط‪ . ‬تأخذ الدالة‪ ‬وسيطة‪ ‬كائن مطابقة‪ ‬واحدة‪ ، ‬وتعيد سلسلة االستبدال‪ .‬على ‪ REPL ‬إذا‬
‫‪:‬سبيل المثال‬

‫>>>‬

‫‪>>> def dashrepl(matchobj):‬‬

‫‪...‬‬ ‫' ' ‪if matchobj.group(0) == '-': return‬‬

‫‪...‬‬ ‫'‪else: return '-‬‬

‫)'‪>>> re.sub('-{1,2}', dashrepl, 'pro----gram-files‬‬

‫'‪'pro--gram files‬‬

‫)‪>>> re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE‬‬

‫'‪'Baked Beans & Spam‬‬

‫‪ .‬قد يكون النمط عبارة عن سلسلة أو‪ ‬كائن نمط‬

‫عدد‪ ‬الوسيطة االختياري‪ ‬هو الحد األقصى لعدد تكرارات النمط المراد استبدالها ؛‪ ‬العد‪ ‬يجب أن يكون عدد صحيح غير سالب‪ .‬إذا تم‬
‫حذفها أو صفر ‪ ،‬فسيتم استبدال جميع التكرارات‪  .‬يتم استبدال التطابقات الفارغة للنمط فقط عندما ال تكون مجاورة لمطابقة فارغة‬
‫'‪ .sub('x*', '-', 'abxd')'-a-b--d-‬سابقة ‪ ،‬لذا يتم‪ ‬إرجاعها‬

‫سوف تستخدم >‪، \g<name‬المذكورة أعاله ‪backreferences‬الحجج‪ ،‬باإلضافة إلى هروب الحرف و‪ REPL ‬في سلسلة من نوع‬
‫يستخدم رقم >‪. \g<number‬بناء الجملة)‪ (?P<name>...‬على النحو المحدد في ‪ name،‬فرعية من مجموعة باسم المتطابقة‬
‫سيتم تفسيره على أنه إشارة إلى ‪ \g<2>0. \20‬لذلك يعادل‪ ،2\ ‬ولكن ليس غام ً‬
‫ضا في االستبدال مثل>‪ \g<2‬المجموعة المقابل ؛‬
‫يستبدل‪ ‬المرجع الخلفي‪ ‬في السلسلة الفرعية >‪'. \g<0‬المجموعة ‪ ، 20‬وليس إشارة إلى المجموعة ‪ 2‬متبوعة بالحرف الحرفي‪0' ‬‬
‫‪ RE.‬بأكملها المطابقة لـ‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.1‬تمت إضافة وسيطة اإلشارات االختيارية‬

‫‪.‬تم التغيير في اإلصدار ‪  :3.5‬يتم استبدال المجموعات غير المتطابقة بسلسلة فارغة‬

‫‪.‬وأصبحت اآلن أخطاء ‪ ASCII‬تم التغيير في اإلصدار ‪ :3.6‬عمليات‪ ‬الهروب غير المعروفة في‪ ‬نمط‪ ‬يتكون من‪'\' ‬حرف‬

‫‪.‬اآلن أخطاء ‪ ASCII‬تتكون من‪'\' ‬وحرف‪ REPL ‬تغير في اإلصدار ‪ :3.7‬هروب غير محدد في‬

‫‪.‬تم التغيير في اإلصدار ‪  :3.7‬يتم استبدال التطابقات الفارغة للنمط عندما تكون مجاورة لمطابقة سابقة غير فارغة‬

‫‪ ) ‬سلسلة‪ ، ‬العد‪ ، 0  =  ‬األعالم‪ ، REPL ، 0  =  ‬نمط ‪re.subn( ‬‬

‫)‪ tuple .(new_string, number_of_subs_made‬لكن قم بإرجاع ‪ sub()،‬قم بإجراء نفس العملية مثل‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.1‬تمت إضافة وسيطة اإلشارات االختيارية‬

‫‪.‬تم التغيير في اإلصدار ‪  :3.5‬يتم استبدال المجموعات غير المتطابقة بسلسلة فارغة‬

‫‪ ) ‬نمط ‪re.escape( ‬‬
‫الهروب من الشخصيات‪ L‬الخاصة في‪ ‬النمط‪ . ‬يكون هذا ً‬
‫مفيد ا إذا كنت تريد مطابقة سلسلة حرفية عشوائية قد تحتوي على أحرف أولية‬
‫‪:‬للتعبير العادي‪ .‬على سبيل المثال‬

‫‪Pg. 294‬‬
‫>>>‬

‫))'‪>>> print(re.escape('https://www.python.org‬‬

‫‪https://www\.python\.org‬‬

‫"‪>>> legal_chars = string.ascii_lowercase + string.digits + "!#$%&'*+-.^_`|~:‬‬

‫))‪>>> print('[%s]+' % re.escape(legal_chars‬‬

‫‪[abcdefghijklmnopqrstuvwxyz0123456789!\#\$%\&'\*\+\-\.\^_`\|\~:]+‬‬

‫]'**' ‪>>> operators = ['+', '-', '*', '/',‬‬

‫))))‪>>> print('|'.join(map(re.escape, sorted(operators, reverse=True‬‬

‫*\|*\*\|‪/|\-|\+‬‬

‫يجب أن يتم تخطي الخطوط المائلة العكسية فقط‪ .‬على سبيل ‪ subn()،‬و‪ sub() ‬يجب عدم استخدام هذه الوظيفة لسلسلة االستبدال في‬
‫‪:‬المثال‬

‫>>>‬

‫'‪>>> digits_re = r'\d+‬‬

‫'‪>>> sample = '/usr/sbin/sendmail - 0 errors, 12 warnings‬‬

‫))‪>>> print(re.sub(digits_re, digits_re.replace('\\', r'\\'), sample‬‬

‫‪/usr/sbin/sendmail - \d+ errors, \d+ warnings‬‬

‫‪.‬تغير في اإلصدار ‪ :3.3‬إن‪'_' ‬لم يعد نجا الحرف‬


‫ً‬
‫نتيجة‬ ‫تم التغيير في اإلصدار ‪ :3.7‬يتم‪ ‬فقط تخطي األحرف التي يمكن أن يكون لها معنى خاص في التعبير العادي‪ .‬‬
‫‪.‬لذلك ‪"`" ، ،'@' ،'>' ،'=' ،'<' ،';' ،':' ،'/' ،',' ،"'" ،'%' ،'"' ، ، ،'!' ،‬ولم يعد يتم هروبهم‬

‫)(‪re.purge‬‬

‫‪.‬امسح ذاكرة التخزين المؤقت للتعبير العادي‬

‫‪ ) ‬رسالة‪ ، ‬نمط‪  =  ‬ال شيء‪ ، ‬نقاط البيع‪  =  ‬ال شيء ‪ re.error( ‬استثناء‬

‫يظهر االستثناء عندما ال تكون السلسلة التي تم تمريرها إلى إحدى الوظائف هنا تعبيرً ا عاديًا صالحً ا (على سبيل المثال ‪ ،‬قد تحتوي‬
‫على أقواس غير متطابقة) أو عند حدوث خطأ آخر أثناء التحويل البرمجي أو المطابقة‪ .‬لن يكون خطأ ً‬
‫أبدا إذا كانت السلسلة ال‬
‫‪:‬تحتوي على تطابق للنمط‪ .‬مثيل الخطأ له السمات‪ L‬اإلضافية التالية‬

‫‪msg‬‬

‫‪.‬رسالة الخطأ غير المنسقة‬

‫‪pattern‬‬

‫‪.‬نمط التعبير النمطي‬

‫‪pos‬‬

‫‪ None).‬قد يكون( الفهرس في‪ ‬النمط‪ ‬حيث فشل التجميع‬

‫‪Pg. 295‬‬
‫‪lineno‬‬

‫‪ None).‬قد يكون(‪ ‬السطر المقابل‪ ‬لنقطة البيع‬

‫‪colno‬‬

‫‪ None).‬قد يكون(‪ ‬العمود المقابل‪ ‬لنقاط البيع‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.5‬تمت إضافة سمات إضافية‬

‫‪ ‬كائنات التعبير العادي‬

‫‪:‬تدعم كائنات التعبير العادي المترجمة األساليب والسمات‪ L‬التالية‬

‫‪ [ ، pos  [ ، endpos  ] ] ) ‬سلسلة ‪Pattern.search( ‬‬


‫امسح عبر‪ ‬سلسلة‪ً  ‬‬
‫بحث ا عن الموقع األول حيث ينتج عن هذا التعبير العادي تطاب ًقا ‪ ،‬ثم قم بإرجاع‪ ‬كائن مطابقة‬
‫إذا لم يتطابق أي موضع في السلسلة مع النمط ؛‪  ‬الحظ أن هذا يختلف عن العثور على تطابق صفري في نقطة‪ None‬مطابق‪ . ‬العودة‬
‫‪.‬ما في السلسلة‬

‫يعطي فهر ًسا في السلسلة حيث يبدأ البحث ؛‪ ‬انها افتراضية‪ .0 ‬هذا ال يكافئ تمامًا تقطيع ‪ pos ‬المعامل الثاني االختياري‬
‫السلسلة ؛‪ ‬و‪'^'  ‬تطابق شخصية نمط في بداية الحقيقية للسلسلة وفي المواقف بعد سطر جديد‪ ،‬ولكن ليس بالضرورة في مؤشر حيث‬
‫‪.‬البحث هو أن تبدأ‬

‫طويلة ‪ endpos  ،‬مدى البحث عن السلسلة ؛‪ ‬سيكون األمر كما لو أن السلسلة‪ ‬تتكون من‪ ‬أحرف‪ endpos ‬تحدد المعلمة االختيارية‬
‫أقل من‪ ‬نقاط البيع‪ ، ‬فلن يتم العثور على تطابق‪ endpos ‬إلى‪ ‬عن تطابق‪ .‬إذا كانت‪ ‬قيمة ‪ pos ‬لذلك‪ ‬سيتم البحث‪ ‬فقط عن األحرف من‬
‫كائ ًنا مترجمًا للتعبير العادي ‪ ،‬فسيكون مكاف ًئا‪ rx  L‬؛‪ ‬خال ًفا لذلك ‪ ،‬إذا كان‬
‫)‪ .endpos - 1rx.search(string, 0, 50)rx.search(string[:50], 0‬لـ‬

‫>>>‬

‫)"‪>>> pattern = re.compile("d‬‬

‫)"‪>>> pattern.search("dog‬‬ ‫‪# Match at index 0‬‬

‫>'‪<re.Match object; span=(0, 1), match='d‬‬

‫"‪>>> pattern.search("dog", 1) # No match; search doesn't include the "d‬‬

‫‪ [ ، pos  [ ، endpos  ] ] ) ‬سلسلة ‪Pattern.match( ‬‬

‫إذا كانت ‪ None‬إذا صفر أو أكثر من الحروف في‪ ‬بداية‪ ‬ل‪ ‬سلسلة‪ ‬تطابق هذا التعبير العادي‪ ،‬والعودة المقابلة‪ ‬الكائن المباراة‪ . ‬العودة‬
‫‪.‬السلسلة ال تتطابق مع النمط ؛‪ ‬الحظ أن هذا يختلف عن المطابقة الصفرية‬

‫‪.‬بالطريقة)(‪ search‬االختيارية‪ ‬لها نفس المعنى الخاص‪ endpos ‬و‪ pos ‬معلمات‪L‬‬

‫>>>‬

‫)"‪>>> pattern = re.compile("o‬‬

‫)"‪>>> pattern.match("dog‬‬ ‫‪# No match as "o" is not at the start of "dog".‬‬

‫‪>>> pattern.match("dog", 1) # Match as "o" is the 2nd character of "dog".‬‬

‫>'‪<re.Match object; span=(1, 2), match='o‬‬

‫بدالً من ذلك (انظر أيضًا‪ ‬البحث () مقابل المطابقة )(‪ search‬إذا كنت تريد تحديد موقع تطابق في أي مكان في‪ ‬السلسلة‪ ، ‬فاستخدم‪L‬‬
‫‪) )(.‬‬

‫‪Pg. 296‬‬
‫‪ [ ، pos  [ ، endpos  ] ] ) ‬سلسلة ‪Pattern.fullmatch( ‬‬

‫إذا كانت السلسلة ال تتطابق مع ‪ None‬إذا كانت‪ ‬السلسلة‪ ‬بأكملها‪ ‬تطابق هذا التعبير العادي ‪ ،‬فقم بإرجاع‪ ‬كائن مطابقة مطابق‪ . ‬العودة‬
‫‪.‬النمط ؛‪ ‬الحظ أن هذا يختلف عن المطابقة الصفرية‬

‫‪.‬بالطريقة)(‪ search‬االختيارية‪ ‬لها نفس المعنى الخاص‪ endpos ‬و‪ pos ‬معلمات‪L‬‬

‫>>>‬

‫)"]‪>>> pattern = re.compile("o[gh‬‬

‫)"‪>>> pattern.fullmatch("dog‬‬ ‫‪# No match as "o" is not at the start of "dog".‬‬

‫)"‪>>> pattern.fullmatch("ogre‬‬ ‫‪# No match as not the full string matches.‬‬

‫‪>>> pattern.fullmatch("doggie", 1, 3) # Matches within given limits.‬‬

‫>'‪<re.Match object; span=(1, 3), match='og‬‬

‫الجديد في اإلصدار ‪3.4.1‬‬

‫‪ ، maxsplit  =  0 ) ‬سلسلة ‪Pattern.split( ‬‬

‫‪.‬للوظيفة ‪ ،‬باستخدام النمط المترجم)(‪ split‬مطابقة‬

‫‪ [ ، pos  [ ، endpos  ] ] ) ‬سلسلة ‪Pattern.findall( ‬‬

‫االختيارية‪ ‬التي تحد من منطقة ‪ endpos ‬و‪ pos ‬الوظيفة ‪ ،‬باستخدام النمط‪ ‬المترجم‪ ، ‬ولكنه يقبل أيضًا‪ ‬معلمات )(‪ findall‬على غرار‬
‫‪ search().‬البحث مثل‬

‫‪ [ ، pos  [ ، endpos  ] ] ) ‬سلسلة ‪Pattern.finditer( ‬‬

‫االختيارية‪ ‬التي تحد من منطقة‪ endpos ‬و‪ pos ‬الوظيفة ‪ ،‬باستخدام النمط‪ ‬المترجم‪ ، ‬ولكنه يقبل أيضًا‪ ‬معلمات )(‪ finditer‬على غرار‬
‫‪ search().‬البحث مثل‬

‫‪ ) ‬سلسلة‪ ، ‬العد‪Pattern.sub( REPL ، 0  =  ‬‬

‫‪.‬للوظيفة ‪ ،‬باستخدام النمط المترجم)(‪ sub‬مطابقة‬

‫‪ ) ‬سلسلة‪ ، ‬العد‪Pattern.subn( REPL ، 0  =  ‬‬

‫‪.‬للوظيفة ‪ ،‬باستخدام النمط المترجم)(‪ subn‬مطابقة‬

‫‪Pattern.flags‬‬

‫أي‪)...?( ‬إشارات مضمنة في النموذج ‪ compile()، ،‬أعالم مطابقة التعبير العادي‪ .‬هذا هو مزيج من العالمات‪ L‬المعطاة إلى‬
‫‪ Unicode.‬إذا كان النمط عبارة عن سلسلة‪ UNICODE‬والعالمات‪ L‬الضمنية مثل ما‬

‫‪Pattern.groups‬‬

‫‪.‬عدد مجموعات االلتقاط في النمط‬

‫‪Pattern.groupindex‬‬

‫أرقام المجموعة‪ .‬يكون القاموس فار ًغا إذا لم يتم استخدام )>‪ (?P<id‬قاموس يقوم بتعيين أي أسماء مجموعة رمزية محددة بواسطة‬
‫‪.‬مجموعات رمزية في النمط‬

‫‪Pattern.pattern‬‬

‫‪.‬سلسلة النمط التي تم تجميع كائن النمط منها‬

‫‪Pg. 297‬‬
‫تعتبر كائنات التعبير النمطي المترجمة ‪ copy.deepcopy(). ‬و)(‪ copy.copy‬تم التغيير في اإلصدار ‪ :3.7‬تمت إضافة دعم لـ‬
‫‪.‬ذرية‬

‫‪ ‬كائنات المباراة‬

‫عندما يكون هناك أي تطابق‪ ،‬يمكنك ‪ None ‬العودة)(‪ search‬و)(‪ match‬منذ‪ True. ‬كائنات المطابقة لها دائمًا قيمة منطقية تبلغ‬
‫‪:‬البيان‪ if‬اختبار ما إذا كان هناك تطابق مع بسيطة‬

‫)‪match = re.search(pattern, string‬‬

‫‪if match:‬‬

‫)‪process(match‬‬

‫‪:‬تدعم كائنات المطابقة األساليب والسمات‪ L‬التالية‬

‫‪ ) ‬نموذج ‪Match.expand( ‬‬

‫يتم‪. \n‬الطريقة)(‪  sub‬أعد السلسلة التي تم الحصول عليها عن طريق استبدال الخط المائل العكسي في قالب سلسلة‪ ‬القالب‪ ، ‬كما فعلت‬
‫تحويل‪ ‬الهروب مثل‪ ‬إلى األحرف المناسبة ‪ ،‬ويتم استبدال المراجع الخلفية الرقمية (‪ )2\ ،1\ ‬والمرجع الخلفي المسماة‪L‬‬
‫‪.‬بمحتويات المجموعة المقابلة )>‪( \g<1>، \g<name‬‬

‫‪.‬تم التغيير في اإلصدار ‪  :3.5‬يتم استبدال المجموعات غير المتطابقة بسلسلة فارغة‬

‫‪Match.group( [ group1 ، ...  ] ) ‬‬

‫ُترجع مجموعة فرعية واحدة أو أكثر من المباراة‪  .‬إذا كانت هناك وسيطة واحدة ‪ ،‬تكون النتيجة سلسلة واحدة ؛‪ ‬إذا كانت هناك‬
‫وسيطات متعددة ‪ ،‬تكون النتيجة مجموعة تحتوي على عنصر واحد لكل وسيطة‪ .‬بدون وسيطات ‪ ،‬يتم تعيين‬
‫تساوي‪ ‬صفرً ا ‪ ،‬فإن قيمة اإلرجاع ‪ groupN‬المجموعة‪ 1  ‬االفتراضية على الصفر (يتم إرجاع المباراة بأكملها)‪ .‬إذا كانت‪ ‬وسيطة‬
‫المقابلة هي سلسلة المطابقة بالكامل ؛‪ ‬إذا كانت في النطاق الشامل [‪ ، ]99..1‬فهي السلسلة التي تطابق المجموعة المحاصرة‬
‫استثناء‪ .‬إذا تم ‪ IndexError‬المقابلة‪ .‬إذا كان رقم المجموعة سالبًا أو أكبر من عدد المجموعات المحددة في النمط ‪ ،‬فسيتم إصدار‬
‫إذا تم تضمين مجموعة في جزء من النمط الذي تمت‪None. ‬تضمين مجموعة في جزء من النمط غير مطابق ‪ ،‬تكون النتيجة المقابلة‬
‫‪.‬مطابقته عدة مرات ‪ ،‬فسيتم إرجاع آخر تطابق‬

‫>>>‬

‫)"‪>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist‬‬

‫)‪>>> m.group(0‬‬ ‫‪# The entire match‬‬

‫'‪'Isaac Newton‬‬

‫)‪>>> m.group(1‬‬ ‫‪# The first parenthesized subgroup.‬‬

‫'‪'Isaac‬‬

‫)‪>>> m.group(2‬‬ ‫‪# The second parenthesized subgroup.‬‬

‫'‪'Newton‬‬

‫‪>>> m.group(1, 2) # Multiple arguments give us a tuple.‬‬

‫)'‪('Isaac', 'Newton‬‬

‫أي ً‬
‫ضا عبارة عن سالسل تحدد ‪ groupN ‬بناء الجملة ‪ ،‬فقد‪ ‬تكون‪ ‬وسيطات)‪ (?P<name>...‬إذا كان التعبير العادي يستخدم‬
‫‪.‬استثناء‪ IndexError ‬المجموعات حسب اسم المجموعة‪ .‬إذا لم يتم استخدام وسيطة سلسلة كاسم‪ L‬مجموعة في النمط ‪ ،‬يظهر‬

‫‪:‬مثال معقد إلى حد ما‬

‫‪Pg. 298‬‬
>>>

>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")

>>> m.group('first_name')

'Malcolm'

>>> m.group('last_name')

'Reynolds'

ً ‫يمكن أي‬:
L‫ضا اإلشارة إلى المجموعات المسماة بواسطة فهرسها‬

>>>

>>> m.group(1)

'Malcolm'

>>> m.group(2)

'Reynolds'

‫ فيمكن الوصول إلى آخر تطابق فقط‬، ‫إذا تطابقت مجموعة عدة مرات‬:

>>>

>>> m = re.match(r"(..)+", "a1b2c3") # Matches 3 times.

>>> m.group(1) # Returns only the last match.

'c3'

Match.__getitem__(  ‫ز‬ ) 

‫هذا مطابق ل‬ m.group(g). ‫يتيح ذلك سهولة الوصول إلى مجموعة فردية من المباراة‬:

>>>

>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")

>>> m[0] # The entire match

'Isaac Newton'

>>> m[1] # The first parenthesized subgroup.

'Isaac'

>>> m[2] # The second parenthesized subgroup.

'Newton'

3.6.1 ‫الجديد في اإلصدار‬

Match.groups(  ‫ ال شيء‬ =  ‫افتراضي‬ ) 

‫ وحتى العديد من المجموعات في‬1 ‫ بدءًا من‬، ‫أعد مجموعة تحتوي على كل المجموعات الفرعية للمباراة‬
‫انها افتراضية‬ .‫يستخدم حجة للمجموعات التي لم تشارك في المباراة‬ ‫االفتراضية‬ ‫و‬ .‫النمط‬ None.

Pg. 299
‫‪:‬على سبيل المثال‬

‫>>>‬

‫)"‪>>> m = re.match(r"(\d+)\.(\d+)", "24.1632‬‬

‫)(‪>>> m.groups‬‬

‫)'‪('24', '1632‬‬

‫إذا جعلنا المكان العشري وكل شيء بعده اختياريًا ‪ ،‬فلن تشارك جميع المجموعات في المباراة‪ .‬ستتحول هذه المجموعات افتراضيًا‬
‫‪ :‬ما لم‪ ‬يتم تقديم الوسيطة‪ ‬االفتراضية ‪ None‬إلى‬

‫>>>‬

‫)"‪>>> m = re.match(r"(\d+)\.?(\d+)?", "24‬‬

‫)(‪>>> m.groups‬‬ ‫‪# Second group defaults to None.‬‬

‫)‪('24', None‬‬

‫‪>>> m.groups('0') # Now, the second group defaults to '0'.‬‬

‫)'‪('24', '0‬‬

‫‪ ) ‬افتراضي‪  =  ‬ال شيء ‪Match.groupdict( ‬‬

‫قم بإرجاع قاموس يحتوي على جميع‪ ‬المجموعات الفرعية‪ ‬المسماة‪  L‬للمباراة ‪ ،‬والتي تم تمييزها بواسطة اسم المجموعة‬
‫‪:‬على سبيل المثال‪ None. ‬الفرعية‪ .‬و‪ ‬االفتراضية‪ ‬يستخدم حجة للمجموعات التي لم تشارك في المباراة‪ .‬انها افتراضية‬

‫>>>‬

‫)"‪>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds‬‬

‫)(‪>>> m.groupdict‬‬

‫}'‪{'first_name': 'Malcolm', 'last_name': 'Reynolds‬‬

‫‪ ] ) ‬مجموعة ‪Match.start( [ ‬‬

‫‪ ] ) ‬مجموعة ‪Match.end( [ ‬‬

‫إرجاع مؤشرات بداية ونهاية السلسلة الفرعية المطابقة‪ ‬للمجموعة‪ ‬؛‪ ‬يتم تعيين المجموعة‪ ‬االفتراضية على الصفر (بمعنى السلسلة‬
‫‪ m ،‬الفرعية المتطابقة بالكامل)‪ .‬العودة‪1- ‬إذا كانت‪ ‬المجموعة‪ ‬موجودة ولكنها لم تساهم في المباراة‪ .‬بالنسبة لكائن المطابقة‬
‫هي ))‪ m.group(g‬تعادل(‪ g ‬التي ساهمت في المباراة ‪ ،‬فإن السلسلة الفرعية المطابقة للمجموعة‪ g ‬والمجموعة‬

‫])‪m.string[m.start(g):m.end(g‬‬

‫إذا‪ ‬تطابقت‪ ‬المجموعة‪ ‬مع سلسلة فارغة‪ .‬على سبيل المثال‪ ،‬بعد‪ ، ‬هو)‪ m.end(group‬سيساوي)‪ m.start(group‬الحظ أن ذلك‬


‫‪ ،1‬هو ‪ ،2‬و‪ ‬كالهما ‪،2‬‬
‫‪.m = re.search('b(c?)', 'cba')m.start(0)m.end(0)m.start(1)m.end(1)m.start(2)IndexError‬و‪ ‬يثير‪ ‬استثناء‬

‫‪:‬من عناوين البريد اإللكتروني‪ remove_this ‬مثال سيزيل‬

‫>>>‬

‫"‪>>> email = "tony@tiremove_thisger.net‬‬

‫)‪>>> m = re.search("remove_this", email‬‬

‫‪Pg. 300‬‬
‫]‪>>> email[:m.start()] + email[m.end():‬‬

‫'‪'tony@tiger.net‬‬

‫‪ ] ) ‬مجموعة ‪Match.span( [ ‬‬

‫الحظ أنه في حالة‪ ‬عدم مساهمة‪ ‬المجموعة‪ ‬في المباراة ‪ ،‬يكون هذا صحيحً ا‪ . ‬المجموعة‪ ‬االفتراضية إلى‪-tuple . ‬أعد ‪ m ، 2‬للمباراة‬
‫)‪.(m.start(group), m.end(group))(-1, -1‬الصفر ‪ ،‬المباراة بأكملها‬

‫‪Match.pos‬‬

‫‪ RE‬هذا هو الفهرس في السلسلة التي بدأ محرك‪ regex . ‬طريقة‪ ‬كائن)(‪ match‬أو)(‪ search‬قيمة نقطة‪ ‬البيع‪ ‬التي تم تمريرها إلى‬
‫‪.‬بالبحث عن تطابق‬

‫‪Match.endpos‬‬

‫هذا هو الفهرس في السلسلة التي لن يذهب محرك‪ regex . ‬طريقة‪ ‬كائن)(‪ match‬أو)(‪ search‬التي تم تمريرها إلى‪ endpos ‬قيمة‬


‫‪.‬بعدها ‪RE‬‬

‫‪Match.lastindex‬‬

‫حالة عدم مطابقة أي مجموعة على اإلطالق‪ .‬على سبيل المثال ‪ None،‬فهرس العدد الصحيح آلخر مجموعة التقاط متطابقة ‪ ،‬أو في‬
‫سيكون لها‪ ‬إذا تم تطبيقها على السلسلة‪ ، ‬في حين أن التعبير‪ ‬سيكون كذلك‪ ، ‬إذا تم تطبيقه على ))‪ ، ((ab‬و))‪ (a)b، ((a)(b‬التعبيرات‬
‫‪.lastindex == 1'ab'(a)(b)lastindex == 2‬نفس السلسلة‬

‫‪Match.lastgroup‬‬

‫‪.‬إذا لم يكن للمجموعة اسم ‪ ،‬أو إذا لم يتم مطابقة أي مجموعة على اإلطالق‪ None‬اسم آخر مجموعة التقاط متطابقة ‪ ،‬أو‬

‫‪Match.re‬‬

‫‪.‬طريقة إنتاجها هذا المثال المباراة)(‪ search‬أو)(‪ match‬و‪ ‬جوه التعبير العادي‪ ‬الذي‬

‫‪Match.string‬‬

‫‪ search().‬أو)(‪ match‬تم تمرير السلسلة إلى‬

‫‪.‬تعتبر كائنات المطابقة ذرية‪ copy.deepcopy(). ‬و)(‪ copy.copy‬تم التغيير في اإلصدار ‪ :3.7‬تمت إضافة دعم لـ‬

‫‪ ‬أمثلة على التعبير العادي‬


‫‪ ‬التحقق من وجود زوج‬

‫‪:‬في هذا المثال ‪ ،‬سنستخدم الوظيفة المساعدة التالية لعرض الكائنات المتطابقة بشكل أكثر رشاقة‪L‬‬

‫‪def displaymatch(match):‬‬

‫‪if match is None:‬‬

‫‪return None‬‬

‫))(‪return '<Match: %r, groups=%r>' % (match.group(), match.groups‬‬

‫لـ "‪ ، "a‬لنفترض أنك تكتب برنامج بوكر حيث يتم تمثيل يد الالعب على هيئة سلسلة مكونة من ‪ 5‬أحرف مع كل حرف يمثل بطاقة‬
‫‪.‬لـ ‪ ، 10‬و "‪ "2‬إلى "‪ "9‬تمثل البطاقة بهذه القيمة "‪ ، "t‬لجاك "‪ ، "j‬للملكة "‪ ، "q‬للملك "‪ace ، "k‬‬

‫‪:‬لمعرفة ما إذا كانت سلسلة نصية معينة هي يد صالحة ‪ ،‬يمكن للمرء أن يقوم بما يلي‬

‫>>>‬

‫‪Pg. 301‬‬
>>> valid = re.compile(r"^[a2-9tjqk]{5}$")

>>> displaymatch(valid.match("akt5q")) # Valid.

"<Match: 'akt5q', groups=()>"

>>> displaymatch(valid.match("akt5e")) # Invalid.

>>> displaymatch(valid.match("akt")) # Invalid.

>>> displaymatch(valid.match("727ak")) # Valid.

"<Match: '727ak', groups=()>"

727" ‫تلك اليد األخيرة‬ak"، ‫ يمكن للمرء‬، ‫لمطابقة هذا مع تعبير عادي‬ .‫تحتوي على زوج أو اثنتين من البطاقات ذات القيمة نفسها‬
‫ استخدام‬backreferences ‫على هذا النحو‬:

>>>

>>> pair = re.compile(r".*(.).*\1")

>>> displaymatch(pair.match("717ak")) # Pair of 7s.

"<Match: '717', groups=('7',)>"

>>> displaymatch(pair.match("718ak")) # No pairs.

>>> displaymatch(pair.match("354aa")) # Pair of aces.

"<Match: '354aa', groups=('a',)>"

‫ يمكن للمرء استخدام‬، ‫لمعرفة البطاقة التي يتكون منها الزوج‬ group()‫طريقة كائن المطابقة بالطريقة التالية‬:

>>>

>>> pair = re.compile(r".*(.).*\1")

>>> pair.match("717ak").group(1)

'7'

# Error because re.match() returns None, which doesn't have a group() method:

>>> pair.match("718ak").group(1)

Traceback (most recent call last):

File "<pyshell#23>", line 1, in <module>

re.match(r".*(.).*\1", "718ak").group(1)

AttributeError: 'NoneType' object has no attribute 'group'

>>> pair.match("354aa").group(1)

'a'

Pg. 302
‫‪ scanf () ‬محاكاة‪L‬‬

‫تكون التعبيرات العادية بشكل عام أكثر قوة ‪ ،‬وإن كانت أيضً ا أكثر تفصيالً ‪ scanf().  ،‬ال يوجد في بايثون حاليًا ما يعادل‬
‫الرموز المميزة للتنسيق )(‪ scanf‬سالسل التنسيق‪ .‬يقدم الجدول أدناه بعض التعيينات المكافئة‪ L‬بشكل أو بآخر بين)(‪ scanf‬من‬
‫‪.‬والتعبيرات العادية‬

‫الستخراج اسم الملف واألرقام من سلسلة مثل‬

‫‪/usr/sbin/sendmail - 0 errors, 4 warnings‬‬

‫تنسيق مثل)(‪ scanf‬يمكنك استخدام‬

‫‪%s - %d errors, %d warnings‬‬

‫سيكون التعبير النمطي المكافئ‪L‬‬

‫‪(\S+) - (\d+) errors, (\d+) warnings‬‬

‫‪ () ‬البحث () مقابل المطابقة‬

‫عمليات التحقق من التطابق فقط في بداية )(‪: re.match‬عمليتين بدائيتين مختلفتين تستندان إلى التعبيرات العادية ‪ Python‬تقدم‬
‫‪).‬افتراضيًا ‪ Perl‬هذا ما يفعله( تتحقق من وجود تطابق في أي مكان في السلسلة)(‪ re.search‬السلسلة ‪ ،‬بينما‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫‪>>> re.match("c", "abcdef") # No match‬‬

‫‪>>> re.search("c", "abcdef") # Match‬‬

‫>'‪<re.Match object; span=(2, 3), match='c‬‬

‫‪:‬لتقييد المطابقة في بداية السلسلة)(‪ search‬يمكن استخدام‪ ‬التعبيرات العادية التي تبدأ بـ'^'‬

‫‪Pg. 303‬‬
>>>

>>> re.match("c", "abcdef") # No match

>>> re.search("^c", "abcdef") # No match

>>> re.search("^a", "abcdef") # Match

<re.Match object; span=(0, 1), match='a'>

‫الحظ مع ذلك أنه في‬ MULTILINE‫الوضع‬ match()‫ بينما يتطابق االستخدام‬، ‫يتطابق فقط مع بداية السلسلة‬ search() ‫مع تعبير‬
‫'^'في بداية كل سطر‬ ‫عادي يبدأ بـ‬.

>>>

>>> re.match('X', 'A\nB\nX', re.MULTILINE) # No match

>>> re.search('^X', 'A\nB\nX', re.MULTILINE) # Match

<re.Match object; span=(4, 5), match='X'>

‫صنع دليل‬ 

split() ‫ هذه الطريقة ال تقدر بثمن لتحويل البيانات النصية إلى هياكل‬ .‫يقسم سلسلة إلى قائمة محددة بواسطة النمط الذي تم تمريره‬
‫ بيانات يمكن قراءتها بسهولة وتعديلها بواسطة‬Python ‫كما هو موضح في المثال التالي الذي ينشئ دفتر هاتف‬.

‫ وهنا نستخدم بناء جملة ثالثي بين عالمات االقتباس‬، ‫ عادة قد يأتي من ملف‬ .‫ هذا هو المدخل‬، ‫أوال‬

>>>

>>> text = """Ross McFluff: 834.345.1254 155 Elm Street

...

... Ronald Heathmore: 892.345.3428 436 Finley Avenue

... Frank Burger: 925.541.7625 662 South Dogwood Way

...

...

... Heather Albrecht: 548.326.4584 919 Park Place"""

‫ نقوم اآلن بتحويل السلسلة إلى قائمة بها إدخال خاص لكل سطر غير فارغ‬ .‫يتم فصل اإلدخاالت بسطر جديد واحد أو أكثر‬:

>>>

>>> entries = re.split("\n+", text)

>>> entries

['Ross McFluff: 834.345.1254 155 Elm Street',

'Ronald Heathmore: 892.345.3428 436 Finley Avenue',

'Frank Burger: 925.541.7625 662 South Dogwood Way',

'Heather Albrecht: 548.326.4584 919 Park Place']

Pg. 304
‫نستخدم‬ .‫ باالسم األول واسم العائلة ورقم الهاتف والعنوان‬L‫ قسّم كل إدخال إلى قائمة‬، ‫أخيرً ا‬ maxsplit‫المعلمة‬ split()  ‫ألن العنوان‬
‫ بداخله‬، ‫ ونمط التقسيم الخاص بنا‬، L‫يحتوي على مسافات‬:

>>>

>>> [re.split(":? ", entry, 3) for entry in entries]

[['Ross', 'McFluff', '834.345.1254', '155 Elm Street'],

['Ronald', 'Heathmore', '892.345.3428', '436 Finley Avenue'],

['Frank', 'Burger', '925.541.7625', '662 South Dogwood Way'],

['Heather', 'Albrecht', '548.326.4584', '919 Park Place']]

‫مع‬ .‫ بحيث ال يحدث في قائمة النتائج‬،‫?نمط يطابق القولون بعد اسم آخر‬:  ‫على‬ maxsplit ‫ ونحن يمكن فصل رقم المنزل من‬،4 ‫من‬
‫اسم الشارع‬:

>>>

>>> [re.split(":? ", entry, 4) for entry in entries]

[['Ross', 'McFluff', '834.345.1254', '155', 'Elm Street'],

['Ronald', 'Heathmore', '892.345.3428', '436', 'Finley Avenue'],

['Frank', 'Burger', '925.541.7625', '662', 'South Dogwood Way'],

['Heather', 'Albrecht', '548.326.4584', '919', 'Park Place']]

‫ نص‬Munging 

sub()‫يوضح هذا المثال استخدام‬ .‫يستبدل كل تكرار لنمط بسلسلة أو نتيجة دالة‬ sub() ‫ أو ترتيب جميع األحرف‬، ‫دالة "لدمج" النص‬
‫عشوائيًا في كل كلمة من الجملة باستثناء الحرفين األول واألخير‬:

>>>

>>> def repl(m):

... inner_word = list(m.group(2))

... random.shuffle(inner_word)

... return m.group(1) + "".join(inner_word) + m.group(3)

>>> text = "Professor Abdolmalek, please report your absences promptly."

>>> re.sub(r"(\w)(\w+)(\w)", repl, text)

'Poefsrosr Aealmlobdk, pslaee reorpt your abnseces plmrptoy.'

>>> re.sub(r"(\w)(\w+)(\w)", repl, text)

'Pofsroser Aodlambelk, plasee reoprt yuor asnebces potlmrpy.'

‫إيجاد كل الظروف‬ 

findall()‫ وليس األول فقط كما‬، ‫تكرارات النمط‬ ‫جميع‬ ‫يطابق‬ search() ‫ إذا أراد كاتب العثور على جميع‬، ‫ على سبيل المثال‬ .‫يفعل‬
L‫ فقد يستخدمها‬، ‫الظروف في بعض النصوص‬ findall()‫بالطريقة التالية‬:

Pg. 305
‫>>>‬

‫"‪>>> text = "He was carefully disguised but captured quickly by police.‬‬

‫)‪>>> re.findall(r"\w+ly\b", text‬‬

‫]'‪['carefully', 'quickly‬‬

‫‪ ‬إيجاد كل األحوال و مواقفها‬

‫فهذا مفيد ألنه )(‪ ، finditer‬إذا أراد المرء المزيد من المعلومات حول جميع تطابقات النمط أكثر من النص المطابق‬
‫يوفر‪ ‬كائنات‪ ‬متطابقة‪ ‬بدالً من السالسل‪  .‬االستمرار في المثال السابق‪ ،‬إذا كان الكاتب يريد أن تجد كل من االحوال‪ ‬ومواقفهم‪ ‬في‬
‫‪:‬على النحو التالي)(‪ finditer‬بعض النصوص‪ ،‬فإنها تستخدم‬

‫>>>‬

‫"‪>>> text = "He was carefully disguised but captured quickly by police.‬‬

‫‪>>> for m in re.finditer(r"\w+ly\b", text):‬‬

‫‪...‬‬ ‫)))‪print('%02d-%02d: %s' % (m.start(), m.end(), m.group(0‬‬

‫‪07-16: carefully‬‬

‫‪40-47: quickly‬‬

‫‪ ‬تدوين السلسلة الخام‬

‫يحافظ على التعابير العادية‪ .‬بدونها ‪ ،‬كل شرطة مائلة للخلف (‪ )'\' ‬في تعبير عادي يجب أن تكون )"‪ ( r"text‬تدوين السلسلة الخام‬
‫‪:‬مسبوقة بواحدة أخرى للهروب منها‪  .‬على سبيل المثال ‪ ،‬سطرا الكود التاليان متطابقان وظيفيا ً‬

‫>>>‬

‫)" ‪>>> re.match(r"\W(.)\1\W", " ff‬‬

‫>' ‪<re.Match object; span=(0, 4), match=' ff‬‬

‫)" ‪>>> re.match("\\W(.)\\1\\W", " ff‬‬

‫>' ‪<re.Match object; span=(0, 4), match=' ff‬‬

‫عندما يريد المرء مطابقة شرطة مائلة عكسية حرفية ‪ ،‬يجب تخطيه في التعبير العادي‪ .‬مع تدوين السلسلة الخام ‪ ،‬هذا‬
‫‪:‬بدون تدوين السلسلة األولية ‪ ،‬يجب على المرء أن يستخدم‪ ،"\\\\" ‬مما يجعل سطور الكود التالية متطابقة وظيفيًا‪ r"\\". ‬يعني‬

‫>>>‬

‫)"\\"‪>>> re.match(r"\\", r‬‬

‫>'\\'=‪<re.Match object; span=(0, 1), match‬‬

‫)"\\"‪>>> re.match("\\\\", r‬‬

‫>'\\'=‪<re.Match object; span=(0, 1), match‬‬

‫‪ ‬كتابة رمز مميز‬

‫أو الماسح الضوئي‪ ‬بتحليل سلسلة لتصنيف مجموعات األحرف‪ .‬هذه خطوة أولى مفيدة في كتابة المترجم أو ‪ tokenizer‬يقوم جهاز‬
‫‪.‬المترجم الفوري‬

‫‪Pg. 306‬‬
‫ تتمثل الطريقة في دمج هذه العناصر في تعبير عادي رئيسي واحد وتكرار‬ .‫يتم تحديد فئات النص باستخدام التعبيرات العادية‬
‫التطابقات المتتالية‬:

from typing import NamedTuple

import re

class Token(NamedTuple):

type: str

value: str

line: int

column: int

def tokenize(code):

keywords = {'IF', 'THEN', 'ENDIF', 'FOR', 'NEXT', 'GOSUB', 'RETURN'}

token_specification = [

('NUMBER', r'\d+(\.\d*)?'), # Integer or decimal number

('ASSIGN', r':='), # Assignment operator

('END', r';'), # Statement terminator

('ID', r'[A-Za-z]+'), # Identifiers

('OP', r'[+\-*/]'), # Arithmetic operators

('NEWLINE', r'\n'), # Line endings

('SKIP', r'[ \t]+'), # Skip over spaces and tabs

('MISMATCH', r'.'), # Any other character

tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification)

line_num = 1

line_start = 0

for mo in re.finditer(tok_regex, code):

kind = mo.lastgroup

value = mo.group()

column = mo.start() - line_start

if kind == 'NUMBER':

Pg. 307
value = float(value) if '.' in value else int(value)

elif kind == 'ID' and value in keywords:

kind = value

elif kind == 'NEWLINE':

line_start = mo.end()

line_num += 1

continue

elif kind == 'SKIP':

continue

elif kind == 'MISMATCH':

raise RuntimeError(f'{value!r} unexpected on line {line_num}')

yield Token(kind, value, line_num, column)

statements = '''

IF quantity THEN

total := total + price * quantity;

tax := price * 0.05;

ENDIF;

'''

for token in tokenize(statements):

print(token)

‫ ينتج جهاز‬tokenizer ‫الناتج التالي‬:

Token(type='IF', value='IF', line=2, column=4)

Token(type='ID', value='quantity', line=2, column=7)

Token(type='THEN', value='THEN', line=2, column=16)

Token(type='ID', value='total', line=3, column=8)

Token(type='ASSIGN', value=':=', line=3, column=14)

Token(type='ID', value='total', line=3, column=17)

Token(type='OP', value='+', line=3, column=23)

Token(type='ID', value='price', line=3, column=25)

Pg. 308
‫)‪Token(type='OP', value='*', line=3, column=31‬‬

‫)‪Token(type='ID', value='quantity', line=3, column=33‬‬

‫)‪Token(type='END', value=';', line=3, column=41‬‬

‫)‪Token(type='ID', value='tax', line=4, column=8‬‬

‫)‪Token(type='ASSIGN', value=':=', line=4, column=12‬‬

‫)‪Token(type='ID', value='price', line=4, column=15‬‬

‫)‪Token(type='OP', value='*', line=4, column=21‬‬

‫)‪Token(type='NUMBER', value=0.05, line=4, column=23‬‬

‫)‪Token(type='END', value=';', line=4, column=27‬‬

‫)‪Token(type='ENDIF', value='ENDIF', line=5, column=4‬‬

‫)‪Token(type='END', value=';', line=5, column=9‬‬

‫الجمعة ‪09‬‬

‫الطبعة الثالثة من الكتاب لم تعد تغطي لغة ‪ ، O'Reilly Media ، 2009.‬فريدل ‪ ،‬جيفري‪ .‬إتقان التعبيرات العادية‪ .‬الطبعة الثالثة‬
‫‪.‬على اإلطالق ‪ ،‬لكن الطبعة األولى غطت كتابة أنماط التعبير المنتظم الجيدة بتفصيل كبير ‪Python‬‬

‫‪ ‬مساعدين لحساب‪ L‬دلتا ‪difflib-‬‬

‫‪: Lib / difflib.py‬كود المصدر‬

‫توفر هذه الوحدة فئات ووظائف لمقارنة التسلسالت‪  .‬يمكن استخدامه على سبيل المثال ‪ ،‬لمقارنة الملفات ‪ ،‬ويمكن أن ينتج معلومات‬
‫والسياق والفوارق الموحدة‪ .‬لمقارنة الدالئل والملفات ‪ ،‬انظر ‪ HTML‬حول اختالفات الملفات في تنسيقات مختلفة ‪ ،‬بما في ذلك‬
‫‪.‬الوحدة النمطية‪ filecmp‬أيضًا‬

‫‪ difflib.SequenceMatcher‬صف دراسي‬

‫هذه فئة مرنة لمقارنة أزواج التسلسالت من أي نوع ‪ ،‬طالما أن عناصر التسلسل قابلة‪ ‬للتجزئة‪ . ‬تسبق الخوارزمية األساسية‬
‫خوارزمية تم نشرها في أواخر الثمانينيات من قبل راتكليف وأوبرشيلب تحت االسم الزائدي "مطابقة نمط الجشطالت"‪ ، L‬وهي أكثر‬
‫روعة من خوارزمية‪  .‬والفكرة هي العثور على أطول نتيجة مطابقة متجاورة ال تحتوي على عناصر "خردة" ؛‪ ‬هذه العناصر "غير‬
‫يعتبر التعامل مع البريد غير (‪. ‬المرغوب فيها" هي تلك العناصر غير المهمة إلى حد ما ‪ ،‬مثل األسطر الفارغة أو المسافات البيضاء‬
‫ثم يتم تطبيق نفس الفكرة بشكل متكرر على قطع التسلسالت‪ L‬الموجودة )‪ Obershelp.‬و ‪ Ratcliff‬المرغوب فيه امتدا ًدا لخوارزمية‬
‫على يسار ويمين التسلسالت الالحقة المطابقة‪  .‬ال ينتج عن هذا الحد األدنى من تسلسالت التحرير ‪ ،‬ولكنه ينتج عنه مطابقات "تبدو‬
‫‪.‬مناسبة" لألشخاص‬

‫األساسية‪ L‬هي الوقت المكعب في أسوأ الحاالت والوقت التربيعي في الحالة ‪ Ratcliff-Obershelp‬التوقيت‪ :‬خوارزمية‬
‫هو وقت تربيعي ألسوأ حالة وله سلوك متو ّقع يعتمد بطريقة معقدة على عدد العناصر المشتركة بين‪. SequenceMatcher‬المتوقعة‬
‫‪.‬التسلسالت ؛‪ ‬أفضل وقت خطي‬

‫يدعم االستدالل الذي يتعامل تلقائيًا مع عناصر تسلسل ‪: SequenceMatcher ‬االستدالل التلقائي للمخلفات غير المرغوب فيه‬
‫معينة على أنها غير مهمة‪  .‬يحسب االستدالل عدد المرات التي يظهر فيها كل عنصر فردي في التسلسل‪ .‬إذا كانت تكرارات عنصر‬
‫ما (بعد العنصر األول) تمثل أكثر من ‪ ٪1‬من التسلسل وكان التسلسل بطول ‪ 200‬عنصر على األقل ‪ ،‬فسيتم تمييز هذا العنصر على‬
‫‪ autojunk‬أنه "شائع" ويتم التعامل معه على أنه غير هام لغرض مطابقة التسلسل‪ .‬يمكن إيقاف هذا االستدالل عن طريق تعيين‬
‫‪ SequenceMatcher.‬عند إنشاء‪ False‬الحجة‬

‫‪.‬المعلمة‪ autojunk ‬الجديد في اإلصدار ‪ :3.2‬و‬

‫‪Pg. 309‬‬
‫‪ difflib.Differ‬فئة‬

‫هذه فئة لمقارنة تسلسالت سطور النص ‪ ،‬وإنتاج اختالفات أو دلتا يمكن قراءتها من قبل اإلنسان‪ .‬استخدامات‬
‫‪.‬لمقارنة تسلسل السطور ‪ ،‬ولمقارنة تسلسل األحرف داخل أسطر متشابهة (شبه مطابقة)‪ SequenceMatcher ‬مختلفة‬

‫‪:‬يبدأ‪ ‬كل سطر في‪ ‬دلتا برمز مكون من حرفين‪Differ‬‬

‫الشفرة‬ ‫المعنى‬

‫'‪'- ‬‬ ‫سطر فريد للتسلسل ‪1‬‬

‫'‪'+ ‬‬ ‫خط فريد للتسلسل ‪2‬‬

‫'‪'  ‬‬ ‫خط مشترك لكال التسلسل‬

‫'‪'? ‬‬ ‫الخط غير موجود في أي من تسلسل اإلدخال‬

‫الخطوط التي تبدأ بـ "‪?  ‬محاولة لتوجيه العين إلى االختالفات الداخلية ‪ ،‬ولم تكن موجودة في أي من تسلسل اإلدخال‪ .‬يمكن أن تكون‬
‫‪.‬هذه األسطر محيرة إذا كانت التسلسالت تحتوي على أحرف جدولة‬

‫‪ difflib.HtmlDiff‬فئة‬

‫يعرض مقارنة النص جنبًا إلى جنب )كامل يحتوي على الجدول ‪ HTML‬أو ملف( ‪ HTML‬يمكن استخدام هذه الفئة إلنشاء جدول‬
‫‪.‬وسطرً ا بسطر مع تمييزات التغيير بين السطور وداخل السطر‪ .‬يمكن إنشاء الجدول إما في وضع االختالف الكامل أو السياقي‬

‫‪:‬مُنشئ هذه الفئة هو‬

‫‪ ، charjunk  =  IS_CHARACTER_JUNK ) ‬ال يوجد ‪ ، linejunk  = ‬ال يوجد ‪__init__( tabsize  =  8 ، wrapcolumn  = ‬‬

‫‪ HtmlDiff.‬يقوم بتهيئة مثيل‬

‫‪ .‬هي وسيطة أساسية اختيارية لتحديد تباعد عالمات الجدولة واالفتراضيات‪tabsize 8 ‬‬

‫حيث ال يتم ‪ None‬هي كلمة أساسية اختيارية لتحديد رقم العمود حيث يتم تقسيم األسطر وتغليفها ‪ ،‬وافتراضيات‪wrapcolumn ‬‬
‫‪.‬التفاف األسطر‬

‫إلنشاء ‪ HtmlDiff‬تستخدم بواسطة(‪ ndiff() ‬عبارة عن‪ ‬وسيطات‪ ‬اختيارية للكلمات الرئيسية يتم تمريرها‪ charjunk ‬و‪linejunk ‬‬


‫‪.‬الوثائق للقيم واألوصاف االفتراضية للوسيطة)(‪ ndiff‬راجع‪). ‬جنبًا إلى جنب ‪ HTML‬اختالفات‬

‫‪:‬الطرق التالية عامة‬

‫‪ ‬محارف ‪ ، numlines  =  5 ، * ، ‬السياق‪  =  ‬الكاذبة ‪make_file( fromlines ، tolines ، fromdesc  =  '' ، todesc  =  '' ، ‬‬


‫‪=  "UTF-8" ) ‬‬

‫كامل يحتوي على جدول يعرض االختالفات ‪ HTML‬ويعيد سلسلة عبارة عن ملف )قوائم السالسل(‪ tolines ‬و‪ fromlines ‬يقارن‬
‫‪.‬سطراً بسطر مع تمييز التغييرات بين السطور وداخل السطر‬

‫وسيطات أساسية اختيارية للتحديد من ‪ /‬إلى سالسل رأس عمود الملف (كالهما افتراضي لسلسلة ‪ todesc ‬و‪ fromdesc ‬تعد‬
‫‪.‬فارغة)‬

‫حين االختالفات‪ L‬السياقية هي التي ‪ True‬كالهما من الوسائط االختيارية للكلمات‪ L‬الرئيسية‪ .‬تعيين‪ ‬السياق‪ ‬إلى‪ numlines ‬السياق‪ ‬و‬


‫افتراضيًا ‪ numlines ‬إلظهار الملفات الكاملة‪ .‬يتم تعيين ‪ False‬سيتم عرضها‪ ،‬وإال االفتراضي هو‬
‫يتحكم في عدد سطور السياق التي ‪ True numlines ‬إلى‪ .5 ‬عندما‪ ‬يكون‪ ‬السياق‪ ‬هو‬
‫يتحكم في عدد األسطر التي تظهر قبل تمييز االختالف عند ‪ False numlines ‬تحيط‪ ‬بإبرازات‪ ‬االختالف‪ .‬عندما‪ ‬يكون‪ ‬السياق‪ ‬هو‬

‫‪Pg. 310‬‬
‫استخدام االرتباطات التشعبية "التالية" (قد يتسبب اإلعداد على الصفر في أن تضع االرتباطات التشعبية "التالية" االختالف التالي في‬
‫‪.‬الجزء العلوي من المتصفح بدون أي سياق رئيسي )‬

‫ملحوظة‬

‫‪ ‬‬

‫لم يتم‪ ‬تجاوزه‪ ‬ويجب‪ ‬تخطيهما‪ ‬بشكل صحيح أثناء تلقي مدخالت من مصادر ‪ HTML‬على أنهما‪ todesc ‬و‪ fromdesc ‬يتم تفسير‬
‫‪.‬غير موثوق بها‬

‫تم تغيير مجموعة األحرف االفتراضية لمستند‪ charset . ‬تم التغيير في اإلصدار ‪ :3.5‬تمت إضافة وسيطة الكلمات‪ L‬األساسية فقط‬
‫‪ 'utf-8'.‬إلى'‪ 'ISO-8859-1‬من ‪HTML‬‬

‫‪ ) ‬السياق‪  =  ‬خطأ‪ ، ‬األسطر‪make_table( fromlines ، tolines ، fromdesc  =  '' ، todesc  =  '' ، 5  =  ‬‬

‫كامل يعرض االختالفات‪ L‬سطراً بسطر مع ‪ HTML‬ويعيد سلسلة عبارة عن جدول )قوائم السالسل(‪ tolines ‬و‪ fromlines ‬يقارن‬
‫‪.‬تمييز التغييرات بين السطور وداخل السطر‬

‫‪.‬بالطريقة‪ make_file() ‬الحجج الخاصة بهذه الطريقة هي نفسها تلك الخاصة‬

‫‪.‬هي واجهة سطر أوامر لهذه الفئة وتحتوي على مثال جيد الستخدامها‪Tools/scripts/diff.py L‬‬

‫‪difflib.context_diff( a ، b ، fromfile  =  '' ، tofile  =  '' ، fromfiledate  =  '' ، tofiledate  =  '' ، n  =  3 ، lineterm ‬‬


‫‪=  '\ n' ) ‬‬

‫‪.‬قارن‪ ‬أ‪ ‬و‪ ‬ب‪( ‬قوائم السالسل) ؛‪ ‬إرجاع دلتا (‪ ‬مولد‪ ‬يولد خطوط دلتا) في تنسيق فرق السياق‬

‫تعد االختالفات في السياق طريقة مضغوطة إلظهار الخطوط التي تغيرت فقط باإلضافة إلى بضعة أسطر من السياق‪ .‬تظهر‬
‫‪.‬والذي‪ ‬يتم تعيينه‪ ‬افتراضيًا إلى ثالثة‪ n ‬التغييرات بأسلوب قبل ‪ /‬بعد‪ .‬يتم تعيين عدد سطور السياق بواسطة‬

‫بشكل افتراضي ‪ ،‬يتم إنشاء‪ ‬خطوط التحكم في الفروق (تلك التي تحتوي على‪*** ‬أو‪ )--- ‬بسطر جديد الحق‪ .‬هذا مفيد بحيث تكون‬
‫)(‪ io.IOBase.writelines‬النتيجة في االختالفات المناسبة لالستخدام مع)(‪ io.IOBase.readlines‬المدخالت‪ L‬التي تم إنشاؤها من‬
‫‪.‬كل من المدخالت والمخرجات‪ L‬لها خطوط جديدة الحقة‬

‫على‪"" ‬بحيث يكون اإلخراج خاليًا من السطر ‪ lineterm ‬بالنسبة للمدخالت التي ال تحتوي على أسطر جديدة الحقة ‪ ،‬اضبط‪ ‬وسيطة‬
‫‪.‬الجديد بشكل موحد‬

‫يحتوي تنسيق فرق السياق عاد ًة على رأس ألسماء الملفات وأوقات التعديل‪ .‬يمكن تحديد أي من هذه العناصر أو جميعها باستخدام‬
‫إذا لم ‪ ISO 8601. ‬عادة ما يتم التعبير عن أوقات التعديل بتنسيق‪ tofiledate . ‬و‪ fromfiledate ‬و‪ tofile ‬و‪ fromfile ‬سالسل لـ‬
‫‪.‬يتم تحديدها ‪ ،‬فإن السالسل افتراضية إلى الفراغات‬

‫>>>‬

‫]'‪>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n‬‬

‫]'‪>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n‬‬

‫))'‪>>> sys.stdout.writelines(context_diff(s1, s2, fromfile='before.py', tofile='after.py‬‬

‫‪*** before.py‬‬

‫‪--- after.py‬‬

‫***************‬

‫**** ‪*** 1,4‬‬

‫‪! bacon‬‬

‫‪Pg. 311‬‬
‫‪! eggs‬‬

‫‪! ham‬‬

‫‪guido‬‬

‫‪--- 1,4 ----‬‬

‫‪! python‬‬

‫‪! eggy‬‬

‫‪! hamster‬‬

‫‪guido‬‬
‫‪.‬راجع‪ ‬واجهة سطر أوامر للنسخة‪ ‬للحصول على مثال أكثر تفصيالً‬

‫‪ ) ‬كلمة‪ ، ‬احتماالت‪ ، ‬ن‪ ، 3  =  ‬قطع‪difflib.get_close_matches( 0.6  =  ‬‬

‫قم بإرجاع قائمة بأفضل التطابقات "جيدة بما يكفي"‪ .‬الكلمة‪  ‬هي تسلسل مطلوب من أجله التطابقات القريبة (عاد ًة سلسلة‬
‫‪.‬نصية) ‪ ،‬واإلمكانيات‪ ‬هي قائمة من التسلسالت‪ L‬التي يمكن مطابقة‪ ‬الكلمة‪ ‬على أساسها‪( L‬عاد ًة قائمة من السالسل)‬

‫‪.‬أكبر من‪ n 0 ‬هي الحد األقصى لعدد المطابقات القريبة التي يمكن إرجاعها ؛‪ ‬يجب أن يكون )افتراضيًا‪ n (3 ‬الوسيطة االختيارية‬

‫قطع‪ ‬الوسيطة االختياري‪( ‬افتراضي‪ )0.6 ‬هو عدد عشري في النطاق [‪ .]1 ، 0‬يتم تجاهل‪ ‬االحتماالت التي ال تسجل على األقل تلك‬
‫‪ .‬المشابهة‪ L‬للكلمة‬

‫‪.‬من التطابقات من بين االحتماالت في قائمة‪ ، L‬مرتبة حسب‪ L‬درجة التشابه ‪ ،‬واألكثر تشابهًا أوالً )‪ n ‬ليس أكثر من( يتم إرجاع‪ ‬أفضل‬

‫>>>‬

‫)]'‪>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy‬‬

‫]'‪['apple', 'ape‬‬

‫‪>>> import keyword‬‬

‫)‪>>> get_close_matches('wheel', keyword.kwlist‬‬

‫]'‪['while‬‬

‫)‪>>> get_close_matches('pineapple', keyword.kwlist‬‬

‫][‬

‫)‪>>> get_close_matches('accept', keyword.kwlist‬‬

‫]'‪['except‬‬

‫‪difflib.ndiff( a ، b ، linejunk  =  None ، charjunk  =  IS_CHARACTER_JUNK ) ‬‬

‫‪.‬دلتا نمط (‪ ‬مولد‪ ‬يولد خطوط دلتا)‪ Differ‬قارن‪ ‬أ‪ ‬و‪ ‬ب‪( ‬قوائم السالسل) ؛‪ ‬إرجاع‬

‫‪ None):‬أو( هي وظائف تصفية‪ charjunk ‬و‪ linejunk ‬معلمات‪ L‬الكلمات األساسية االختيارية‬

‫دالة تقبل وسيطة سلسلة واحدة ‪ ،‬وتعيد صحيحً ا إذا كانت السلسلة غير مهمة‪ ، L‬أو خطأ إذا لم تكن كذلك‪ .‬االفتراضي ‪linejunk :‬‬
‫ضا وظيفة على مستوى الوحدة النمطية‪ None. ‬هو‬ ‫والتي تقوم بتصفية األسطر بدون أحرف مرئية ‪ IS_LINE_JUNK()، ،‬هناك أي ً‬
‫الفئة‪ ‬األساسية‪ ‬بإجراء تحليل ديناميكي ‪ SequenceMatcher‬باستثناء حرف واحد على األكثر رطل (‪ - )'#' ‬ومع ذلك ‪ ،‬تقوم‬
‫‪.‬لألسطر التي تكون متكررة ج ًد ا لتشكيل ضوضاء ‪ ،‬وهذا عادة ما ينجح أفضل من استخدام هذه الوظيفة‬

‫‪Pg. 312‬‬
charjunk : ‫الوظيفة االفتراضية‬ .‫ أو خطأ إذا لم يكن كذلك‬، ‫ و ُت رجع إذا كان الحرف غير هام‬، )1 ‫دالة تقبل حر ًفا (سلسلة طولها‬
‫هي وظيفة على مستوى الوحدة النمطية‬ IS_CHARACTER_JUNK()، ‫والتي تقوم بتصفية أحرف المسافات البيضاء (فارغة أو‬
ً
)!‫جديدا في هذا‬ ‫عالمة تبويب ؛ إنها فكرة سيئة أن تتضمن سطرً ا‬.

Tools/scripts/ndiff.py ‫هي واجهة سطر أوامر لهذه الوظيفة‬.

>>>

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),

... 'ore\ntree\nemu\n'.splitlines(keepends=True))

>>> print(''.join(diff), end="")

- one

? ^

+ ore

? ^

- two

- three

? -

+ tree

+ emu

difflib.restore(  ‫الذي‬ ، ‫تسلسل‬ ) 

‫قم بإرجاع أحد التسلسلين اللذين أنشا دلتا‬.

‫إنتاجه بواسطة‬ ‫تسلسل تم‬ ‫بالنظر إلى‬ Differ.compare()‫أو‬ ndiff()، 2 ‫ أو‬1 ‫قم باستخراج األسطر الناشئة من الملف‬
‫ وإزالة بادئات السطر‬، ) ‫التي‬ ‫(المعلمة‬.

‫مثال‬:

>>>

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),

... 'ore\ntree\nemu\n'.splitlines(keepends=True))

>>> diff = list(diff) # materialize the generated delta into a list

>>> print(''.join(restore(diff, 1)), end="")

one

two

three

>>> print(''.join(restore(diff, 2)), end="")

ore

Pg. 313
‫‪tree‬‬

‫‪emu‬‬

‫‪difflib.unified_diff( a ، b ، fromfile  =  '' ، tofile  =  '' ، fromfiledate  =  '' ، tofiledate  =  '' ، n  =  3 ، lineterm ‬‬


‫‪=  '\ n' ) ‬‬

‫‪.‬قارن‪ ‬أ‪ ‬و‪ ‬ب‪( ‬قوائم السالسل) ؛‪ ‬إرجاع دلتا (‪ ‬مولد‪ ‬يولد خطوط دلتا) بتنسيق فرق موحد‬

‫تعد االختالفات الموحدة طريقة مضغوطة إلظهار الخطوط التي تغيرت فقط باإلضافة إلى بضعة أسطر من السياق‪ .‬تظهر التغييرات‬
‫‪.‬والذي‪ ‬يتم تعيينه‪ ‬افتراضيًا إلى ثالثة‪ n ‬بأسلوب مضمّن (بدالً من الكتل المنفصلة قبل ‪ /‬بعد)‪ .‬يتم تعيين عدد سطور السياق بواسطة‬

‫افتراضيا‪ ،‬خطوط السيطرة فرق (أولئك مع‪+++ ،--- ‬أو‪ )@@ ‬يتم إنشاؤها مع السطر الجديد زائدة‪ .‬هذا مفيد بحيث تكون‬
‫)(‪ io.IOBase.writelines‬النتيجة في االختالفات المناسبة لالستخدام مع)(‪ io.IOBase.readlines‬المدخالت‪ L‬التي تم إنشاؤها من‬
‫‪.‬كل من المدخالت والمخرجات‪ L‬لها خطوط جديدة الحقة‬

‫على‪"" ‬بحيث يكون اإلخراج خاليًا من السطر ‪ lineterm ‬بالنسبة للمدخالت التي ال تحتوي على أسطر جديدة الحقة ‪ ،‬اضبط‪ ‬وسيطة‬
‫‪.‬الجديد بشكل موحد‬

‫يحتوي تنسيق فرق السياق عاد ًة على رأس ألسماء الملفات وأوقات التعديل‪ .‬يمكن تحديد أي من هذه العناصر أو جميعها باستخدام‬
‫إذا لم ‪ ISO 8601. ‬عادة ما يتم التعبير عن أوقات التعديل بتنسيق‪ tofiledate . ‬و‪ fromfiledate ‬و‪ tofile ‬و‪ fromfile ‬سالسل لـ‬
‫‪.‬يتم تحديدها ‪ ،‬فإن السالسل افتراضية إلى الفراغات‬

‫>>>‬

‫]'‪>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n‬‬

‫]'‪>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n‬‬

‫))'‪>>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py‬‬

‫‪--- before.py‬‬

‫‪+++ after.py‬‬

‫@@ ‪@@ -1,4 +1,4‬‬

‫‪-bacon‬‬

‫‪-eggs‬‬

‫‪-ham‬‬

‫‪+python‬‬

‫‪+eggy‬‬

‫‪+hamster‬‬

‫‪guido‬‬
‫‪.‬راجع‪ ‬واجهة سطر أوامر للنسخة‪ ‬للحصول على مثال أكثر تفصيالً‬

‫‪difflib.diff_bytes( dfunc ، a ، b ، fromfile  =  b '' ، tofile  =  b '' ، fromfiledate  =  b '' ، tofiledate  =  b‬‬


‫‪'' ، n  =  3 ، lineterm  =  b '\ n' ) ‬‬

‫؛‪ ‬ينتج سلسلة من خطوط دلتا (أي ً‬


‫ضا بايت) بالتنسيق الذي تم إرجاعه ‪ dfunc ‬باستخدام )قوائم كائنات البايت(‪ b ‬و‪ a ‬قارن‬
‫ً‬
‫‪ context_diff().‬أو)(‪ unified_diff‬قابال لالستدعاء ‪ ،‬عاد ًة إما‪ dfunc ‬يجب أن يكون‪ dfunc . ‬بواسطة‬

‫‪Pg. 314‬‬
‫عبارة عن كائنات بايت ‪ n ‬يسمح لك بمقارنة البيانات بترميز غير معروف أو غير متسق‪ .‬يجب أن تكون‪ ‬جميع المدخالت‪ L‬باستثناء‬
‫مرة ‪ dfunc ‬واستدعاء‪ . ‬يتم تحويل‪ ‬ناتج ‪ str ،‬إلى )‪ n ‬باستثناء( يعمل عن طريق تحويل جميع المدخالت بدون خسارة‪ str. ‬وليس‬
‫أخرى إلى بايت ‪ ،‬وبالتالي فإن خطوط دلتا التي تتلقاها لها نفس الترميزات غير المعروفة ‪ /‬غير المتناسقة‬
‫)‪ b .dfunc(a, b, fromfile, tofile, fromfiledate, tofiledate, n, lineterm‬و‪ a ‬مثل‬

‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫‪ ) ‬خط ‪difflib.IS_LINE_JUNK( ‬‬

‫للخطوط الجاهلة‪ .‬خط‪ ‬خط‪ ‬هو تجاهلها إذا‪ ‬خط‪ ‬فارغ أو يحتوي على واحد‪ ،'#' ‬وإال فإنه ليس تجاهلها‪ .‬يُستخدم كخيار ‪ True‬العودة‬
‫‪.‬اإلصدارات األقدم)(‪ ndiff‬في‪ linejunk ‬افتراضي للمعلمة‬

‫‪ ) ‬الفصل ‪difflib.IS_CHARACTER_JUNK( ‬‬

‫مسافة أو عالمة تبويب ‪ ،‬وإال فإنه ال يمكن ‪ ch ‬إذا كان‪ ch ‬لألحرف التي يمكن تجاهلها‪ .‬يمكن‪ ‬تجاهل‪ ‬الحرف‪ True‬العودة‬
‫‪ ndiff().‬في‪ charjunk ‬تجاهله‪ .‬يتم استخدامه كخيار افتراضي للمعلمة‬

‫أنظر أيضا‬
‫مطابقة األنماط‪ :‬نهج الجشطالت‬

‫‪.‬مناقشة‪ L‬خوارزمية مماثلة بواسطة جون دبليو راتكليف و دي ميتزينر‪ُ  .‬نشر هذا في‪ ‬مجلة دكتور دوب‪ ‬في يوليو ‪1988 ،‬‬

‫‪ SequenceMatcher ‬كائنات‬

‫‪:‬فئة لديها هذا المنشئ‪ SequenceMatcher‬و‬

‫‪ difflib.SequenceMatcher( isjunk  =  None ، a  =  '' ، b  =  '' ، autojunk  =  True ) ‬فئة‬

‫إذا وفقط ‪ true‬أو دالة ذات وسيطة واحدة تأخذ عنصر تسلسل وتعيد )االفتراضي(‪ isjunkNone ‬يجب أن تكون‪ ‬الوسيطة االختيارية‬
‫يعادل التمرير‪ ‬؛‪ ‬بمعنى آخر ‪ ،‬ال يتم تجاهل أي ‪ isjunk ‬أجل‪ None‬إذا كان العنصر "غير هام" ويجب تجاهله‪ .‬التمرير من‬
‫‪:lambda x: False‬عناصر‪ .‬على سبيل المثال ‪ ،‬قم بتمرير‬

‫"‪lambda x: x in " \t‬‬

‫‪.‬إذا كنت تقارن األسطر كتسلسل من األحرف ‪ ،‬وال تريد المزامنة في الفراغات أو عالمات التبويب الصلبة‬

‫عبارة عن تسلسالت يجب مقارنتها ؛‪ ‬كالهما افتراضي لسالسل فارغة‪ .‬يجب أن تكون عناصر كال ‪ b ‬و‪ a ‬الوسيطات االختيارية‬
‫‪ .‬التسلسلين قابلة‪ ‬للتجزئة‬

‫‪.‬يمكن استخدام‪ ‬الوسيطة‪ ‬غير المرغوب فيها‪ ‬االختيارية‪ ‬لتعطيل الكشف‪ ‬التلقائي عن البريد غير الهام‬

‫‪.‬المعلمة‪ autojunk ‬الجديد في اإلصدار ‪ :3.2‬و‬

‫التي‪ ‬يكو‪ b ‬هي مجموعة عناصر‪: bjunk ‬على ثالث سمات بيانات ‪ SequenceMatcher‬تحصل كائنات‬


‫عبارة ‪ b2j ‬هي مجموعة العناصر غير‪ ‬المهملة‪ ‬التي يعتبرها االستدالل رائجً ا (إذا لم يتم تعطيلها) ؛‪ bpopular ‬؛‪ isjunkTrue ‬ن‬
‫إلى قائمة المواضع التي تحدث فيها‪ .‬تتم إعادة تعيين الثالثة عند إعادة ‪ b ‬عن‪ ‬دكت‪ ‬تعيين العناصر المتبقية من‬
‫‪ set_seq2().‬أو)(‪ set_seqs‬مع‪ b ‬تعيين‬

‫‪.‬الصفات‪ bpopular ‬و‪ bjunk ‬الجديد في اإلصدار ‪ :3.2‬و‬

‫‪:‬الكائنات لها الطرق التالية‪SequenceMatcher ‬‬

‫‪ ) ‬أ‪ ، ‬ب ‪set_seqs( ‬‬

‫‪.‬قم بتعيين التسلسلين المراد مقارنتها‬

‫‪Pg. 315‬‬
‫يحسب ويخزن معلومات مفصلة حول التسلسل الثاني ‪ ،‬لذلك إذا كنت تريد مقارنة تسلسل واحد مقابل العديد ‪SequenceMatcher‬‬
‫بشكل متكرر ‪ ،‬مرة )(‪ set_seq1‬لتعيين التسلسل الشائع االستخدام مرة واحدة واستدعاء)(‪ set_seq2‬من التسلسالت ‪ ،‬فاستخدم‪L‬‬
‫‪.‬واحدة لكل من التسلسالت‪ L‬األخرى‬

‫‪ ) ‬أ ‪set_seq1( ‬‬

‫‪.‬اضبط التسلسل األول المراد مقارنته‪ .‬التسلسل الثاني المراد مقارنته لم يتغير‬

‫‪ ) ‬ب ‪set_seq2( ‬‬

‫‪.‬اضبط التسلسل الثاني المراد مقارنته‪ .‬التسلسل األول المراد مقارنته لم يتغير‬

‫‪ ) ‬معاد التدوير‪  =  ‬ال شيء‪ ، ‬ضربة‪ ، 0  =  ‬أيضًا‪  =  ‬ال شيء ‪find_longest_match( Alo  =  0 ، ‬‬

‫‪ b[blo:bhi].‬و]‪ a[alo:ahi‬البحث عن أطول كتلة مطابقة في‬

‫يعود‪ ‬بحيث‪ ‬تساوي‪ ، ‬حيث‪ ‬و‪ . ‬للجميع‪ ‬تلبية تلك الشروط‪ ،‬شروط )(‪ None، find_longest_match‬تم حذف أو‪ isjunk ‬إذا‬


‫‪ a ،‬إضافية‪ ، ‬وإذا‪ ، ‬والتقى أيضا‪  .‬بعبارة أخرى ‪ ،‬من بين جميع الكتل المطابقة القصوى ‪ ،‬قم بإرجاع واحدة تبدأ في وقت مبكر من‬
‫‪ b .‬قم بإرجاع‪ ‬الكتلة التي تبدأ في‪ ‬وقت مبكر في ‪ a ،‬ومن بين كل تلك الكتل المطابقة القصوى التي تبدأ في أقرب وقت في‬
‫'‪(i, j, k)a[i:i+k]b[j:j+k]alo <= i <= i+k <= ahiblo <= j <= j+k <= bhi(i', j', k')k >= k'i <= i'i == i'j <= j‬‬

‫>>>‬

‫)"‪>>> s = SequenceMatcher(None, " abcd", "abcd abcd‬‬

‫)‪>>> s.find_longest_match(0, 5, 0, 9‬‬

‫)‪Match(a=0, b=4, size=5‬‬

‫فسيتم‪ ‬أوالً تحديد أطول كتلة مطابقة على النحو الوارد أعاله ‪ ،‬ولكن مع التقييد اإلضافي الذي ال يظهر فيه أي ‪ isjunk ، ‬إذا‪ ‬تم توفير‬
‫عنصر غير هام في الكتلة‪  .‬ثم يتم تمديد تلك الكتلة إلى أقصى حد ممكن عن طريق مطابقة (فقط) العناصر غير المرغوب فيها على‬
‫كال الجانبين‪ .‬لذا فإن الكتلة الناتجة ال تتطابق أب ًد ا مع البريد غير المرغوب فيه باستثناء وجود خردة متطابقة مجاورة لمباراة مثيرة‬
‫‪.‬لالهتمام‬

‫إليك نفس المثال السابق ‪ ،‬ولكن اعتبار الفراغات خردة‪ .‬يمنع ذلك‪ ‬من مطابقة‪ ‬الطرف الخلفي للتسلسل الثاني مباشرة‪ .‬بدالً من‬
‫'‪:' abcd'' abcd''abcd''abcd‬ذلك ‪ ،‬يمكن أن تتطابق‪ ‬فقط‪ ‬وتتطابق مع أقصى اليسار‪ ‬في التسلسل الثاني‬

‫>>>‬

‫)"‪>>> s = SequenceMatcher(lambda x: x==" ", " abcd", "abcd abcd‬‬

‫)‪>>> s.find_longest_match(0, 5, 0, 9‬‬

‫)‪Match(a=1, b=0, size=4‬‬

‫)‪ .(alo, blo, 0‬إذا لم تكن هناك كتل متطابقة ‪ ،‬فسيتم إرجاع هذا‬

‫)‪ .Match(a, b, size‬تقوم هذه الطريقة بإرجاع مجموعة‪ ‬مسماة‪L‬‬

‫‪.‬تم التغيير في اإلصدار ‪ :3.9‬تمت إضافة الوسائط االفتراضية‬

‫)(‪get_matching_blocks‬‬

‫قائمة إرجاع ثالثية تصف التكرارات المطابقة غير المتداخلة‪ .‬كل ثالثية هي من الشكل‪ ، ‬وهذا يعني ذلك‪ . ‬يتزايد العدد الثالثي بشكل‬
‫]‪ j .(i, j, n)a[i:i+n] == b[j:j+n‬و‪ i ‬رتيب في‬

‫‪Pg. 316‬‬
‫الثالثي األخير دمية وله قيمة‪ . ‬هذا هو الثالثي الوحيد مع‪ . ‬إذا كان‪ ‬و‪ ‬هو ثالثة أضعاف متجاورة في القائمة ‪ ،‬والثاني ليس آخر ثالثي‬
‫‪.‬في القائمة ‪ ،‬إذن‪ ‬أو‪ ‬؛‪ ‬بعبارة أخرى ‪ ،‬تصف الثالثيات المتجاورة دائمًا الكتل المتساوية غير المتجاورة‬
‫'‪(len(a), len(b), 0)n == 0(i, j, n)(i', j', n')i+n < i'j+n < j‬‬

‫>>>‬

‫)"‪>>> s = SequenceMatcher(None, "abxcd", "abcd‬‬

‫)(‪>>> s.get_matching_blocks‬‬

‫])‪[Match(a=0, b=0, size=2), Match(a=3, b=2, size=2), Match(a=5, b=4, size=0‬‬

‫)(‪get_opcodes‬‬

‫كل مجموعة من النموذج‪ . ‬تحتوي المجموعة األولى‪ b .  ، ‬إلى‪ a ‬قائمة إرجاع مكونة من ‪ 5‬مجموعات تصف كيفية تحويل‬
‫‪ .(tag, i1, i2, j1, j2)i1 == j1 == 0‬السابق‪ j2 ‬يساوي‪ ، j1 ‬من المجموعة السابقة ‪ ،‬وبالمثل‪ i2 ‬يساوي‪ i1 ‬والبطاقات‪ L‬المتبقية على‬

‫‪:‬و‪ ‬العالمة‪ ‬القيم هي سالسل‪ ،‬مع هذه المعاني‬

‫قيمة‬ ‫المعنى‬

‫‪'replace‬‬
‫‪ b[j1:j2].‬يجب استبداله بـ]‪a[i1:i2‬‬
‫'‬

‫'‪'delete‬‬ ‫‪.j1 == j2‬يجب حذفها‪ .‬الحظ أنه‪ ‬في هذه الحالة]‪a[i1:i2‬‬

‫'‪'insert‬‬ ‫‪.i1 == i2‬الحظ أنه‪ ‬في هذه الحالة‪ a[i1:i1]. ‬يجب إدخالها في]‪b[j1:j2‬‬

‫'‪'equal‬‬ ‫‪).‬التسلسالت الفرعية متساوية(‪a[i1:i2] == b[j1:j2] ‬‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫"‪>>> a = "qabxcd‬‬

‫"‪>>> b = "abycdf‬‬

‫)‪>>> s = SequenceMatcher(None, a, b‬‬

‫‪>>> for tag, i1, i2, j1, j2 in s.get_opcodes():‬‬

‫‪...‬‬ ‫(‪print('{:7} a[{}:{}] --> b[{}:{}] {!r:>8} --> {!r}'.format‬‬

‫‪...‬‬ ‫))]‪tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2‬‬

‫]‪delete a[0:1] --> b[0:0‬‬ ‫'' >‪'q' --‬‬

‫‪equal‬‬ ‫]‪a[1:3] --> b[0:2‬‬ ‫'‪'ab' --> 'ab‬‬

‫]‪replace a[3:4] --> b[2:3‬‬ ‫'‪'x' --> 'y‬‬

‫‪equal‬‬ ‫]‪a[4:6] --> b[3:5‬‬ ‫'‪'cd' --> 'cd‬‬

‫]‪insert a[6:6] --> b[5:6‬‬ ‫'‪'' --> 'f‬‬

‫‪ ) ‬ن‪get_grouped_opcodes( 3  =  ‬‬

‫‪Pg. 317‬‬
‫‪.‬من أسطر السياق‪ n ‬قم بإرجاع‪ ‬منشئ‪ ‬المجموعات مع ما يصل إلى‬

‫تقسم هذه الطريقة مجموعات التغيير األصغر وتزيل النطاقات ‪ get_opcodes()،‬بدءًا من المجموعات التي تم إرجاعها بواسطة‬
‫‪.‬المتداخلة التي ليس لها تغييرات‬

‫‪ get_opcodes().‬يتم إرجاع المجموعات بنفس التنسيق مثل‬

‫)(‪ratio‬‬

‫‪.‬قم بإرجاع مقياس تشابه التسلسالت‪ L‬كعامل عائم في النطاق [‪]1 ، 0‬‬

‫الحظ أن هذا‪1.0 ‬إذا كانت ‪ * M / T.‬هو عدد التطابقات ‪ ،‬هذا هو ‪ M 2.0‬هو العدد اإلجمالي للعناصر في كال التسلسل ‪ ،‬و ‪ T‬حيث‬
‫‪.‬المتواليات متطابقة ‪0.0 ،‬وإذا لم يكن هناك أي شيء مشترك بينهما‬

‫لم يتم االتصال به بالفعل ‪ ،‬وفي )(‪ get_opcodes‬أو)(‪ get_matching_blocks‬يعد حساب هذا مكل ًفا إذا‪ ‬تم االتصال به بالفعل‬
‫‪.‬الحصول أوالً على حد أعلى)(‪ real_quick_ratio‬أو)(‪ quick_ratio‬هذه الحالة قد ترغب في المحاولة‬

‫ملحوظة‬

‫‪ ‬‬

‫‪:‬قد تعتمد‪ ‬نتيجة‪ ‬المكالمة على ترتيب الوسائط‪ .‬على سبيل المثال)(‪: ratio‬تحذير‬

‫>>>‬

‫)(‪>>> SequenceMatcher(None, 'tide', 'diet').ratio‬‬

‫‪0.25‬‬

‫)(‪>>> SequenceMatcher(None, 'diet', 'tide').ratio‬‬

‫‪0.5‬‬

‫)(‪quick_ratio‬‬

‫‪.‬بسرعة نسبيًا)(‪ ratio‬قم بإرجاع الحد األعلى‬

‫)(‪real_quick_ratio‬‬

‫‪.‬بسرعة كبيرة)(‪ ratio‬قم بإرجاع الحد األعلى‬

‫الطرق الثالثة التي ترجع نسبة مطابقة لمجموع األحرف يمكن أن تعطي نتائج مختلفة نظرا لمستويات تقريب مختلفة‪ ،‬على الرغم‬
‫‪ ratio():‬دائما ما ال يقل عن قدر كبير)(‪ real_quick_ratio‬و)(‪ quick_ratio‬من‬

‫>>>‬

‫)"‪>>> s = SequenceMatcher(None, "abcd", "bcde‬‬

‫)(‪>>> s.ratio‬‬

‫‪0.75‬‬

‫)(‪>>> s.quick_ratio‬‬

‫‪0.75‬‬

‫)(‪>>> s.real_quick_ratio‬‬

‫‪1.0‬‬

‫‪ SequenceMatcher ‬أمثلة على‬

‫‪Pg. 318‬‬
‫‪":‬يقارن هذا المثال بين سلسلتين ‪ ،‬مع اعتبار الفراغات "غير مهمة‬

‫>>>‬

‫‪>>> s = SequenceMatcher(lambda x: x == " ",‬‬

‫‪...‬‬ ‫‪"private Thread currentThread;",‬‬

‫‪...‬‬ ‫)";‪"private volatile Thread currentThread‬‬

‫تعني القيمة التي تزيد عن ‪ 0.6‬أن )(‪ ، ratio‬إرجاع عدد عشري في [‪ ، ]1 ، 0‬لقياس تشابه المتواليات‪ .‬كقاعدة عامة)(‪ratio‬‬
‫‪:‬التسلسالت متطابقة متقاربة‬

‫>>>‬

‫))‪>>> print(round(s.ratio(), 3‬‬

‫‪0.866‬‬

‫‪:‬فهذا مفيد)(‪ ، get_matching_blocks‬إذا كنت مهتمًا فقط بمكان تطابق التسلسالت‬

‫>>>‬

‫‪>>> for block in s.get_matching_blocks():‬‬

‫‪...‬‬ ‫)‪print("a[%d] and b[%d] match for %d elements" % block‬‬

‫‪a[0] and b[0] match for 8 elements‬‬

‫‪a[8] and b[17] match for 21 elements‬‬

‫‪a[29] and b[38] match for 0 elements‬‬

‫هي دائمًا مجموعة وهمية ‪ ،‬وهذه هي الحالة الوحيدة التي يكون )(‪ get_matching_blocks‬الحظ أن آخر مجموعة تم إرجاعها‬
‫‪ .(len(a), len(b), 0)0‬فيها آخر عنصر مجموعة (عدد العناصر المطابقة)‬

‫‪ get_opcodes():‬إذا كنت تريد معرفة كيفية تغيير التسلسل األول إلى الثاني ‪ ،‬فاستخدم‪L‬‬

‫>>>‬

‫‪>>> for opcode in s.get_opcodes():‬‬

‫‪...‬‬ ‫)‪print("%6s a[%d:%d] b[%d:%d]" % opcode‬‬

‫]‪equal a[0:8] b[0:8‬‬

‫]‪insert a[8:8] b[8:17‬‬

‫]‪equal a[8:29] b[17:38‬‬

‫أنظر أيضا‬

‫‪‬‬ ‫يمكن ‪ SequenceMatcher‬ظيفة في هذه الوحدة التي تبين مدى بساطة قانون البناء على)(‪ get_close_matches‬و‬
‫‪.‬استخدامها للقيام بعمل مفيد‬

‫‪‬‬ ‫‪ SequenceMatcher.‬وصفة بسيطة للتحكم في اإلصدار‪ ‬لتطبيق صغير تم إنشاؤه باستخدام‬

‫‪ ‬كائنات مختلفة‬

‫‪Pg. 319‬‬
‫تجعل تعلن أي جهة على أن يكون‪ ‬الحد األدنى‪ ‬بيانات االختالف‪ .‬على العكس من ذلك ‪ ،‬غالبًا ما ‪ -generated‬دلتا‪ Differ‬علما بأن‬
‫تكون الفروق الدنيا غير بديهية ‪ ،‬ألنها تتزامن في أي مكان ممكن ‪ ،‬وأحيا ًنا تتطابق عرضيًا مع ‪ 100‬صفحة على حدة‪ .‬تقييد نقاط‬
‫‪.‬التزامن على المطابقات المتجاورة يحافظ على بعض فكرة الموقع ‪ ،‬على حساب تكلفة عرضية إلنتاج فرق أطول‬

‫‪:‬فئة لديها هذا المنشئ‪ Differ‬و‬

‫)‪ ‬ال شيء ‪ ، charjunk  = ‬ال شيء ‪ difflib.Differ( linejunk  = ‬فئة‬

‫‪ None):‬أو( مخصصة لوظائف التصفية‪ charjunk ‬و‪ linejunk ‬معلمات‪ L‬الكلمات األساسية االختيارية‬

‫مما يعني أنه ال ‪ None،‬دالة تقبل وسيطة سلسلة واحدة وترجع صحيحً ا إذا كانت السلسلة غير مهمة‪ .‬االفتراضي هو ‪linejunk :‬‬
‫‪.‬يوجد خط يعتبر غير هام‬

‫دالة تقبل وسيطة ذات حرف واحد (سلسلة طولها ‪ ، )1‬و ُترجع صحيحً ا إذا كان الحرف غير هام‪ .‬االفتراضي ‪charjunk :‬‬
‫‪.‬مما يعني أنه ال يتم اعتبار أي حرف غير هام ‪ None،‬هو‬

‫تعمل وظائف تصفية البريد غير الهام هذه على تسريع المطابقة للعثور على االختالفات وال تتسبب في تجاهل أي سطور أو أحرف‬
‫‪.‬معلمة تفسيرا لذلك‪ isjunk ‬طريقة ل)(‪ find_longest_match‬مختلفة‪ .‬قراءة وصف‬

‫‪:‬يتم استخدام الكائنات (إنشاء دلتا) بطريقة واحدة‪Differ ‬‬

‫‪ ) ‬أ‪ ، ‬ب ‪compare( ‬‬

‫‪.‬قارن بين تسلسلين من األسطر ‪ ،‬وأنشئ دلتا (سلسلة من األسطر)‬

‫يجب أن يحتوي كل تسلسل على سالسل فردية من سطر واحد تنتهي بأسطر جديدة‪ .‬يمكن الحصول على مثل هذه التسلسالت‬
‫طريقة الكائنات التي تشبه الملفات‪ .‬تتكون الدلتا التي تم إنشاؤها أيضً ا من سالسل منتهية بالسطر الجديد ‪ ،‬جاهزة )(‪ readlines‬من‬
‫‪.‬طريقة كائن يشبه الملف)(‪ writelines‬للطباعة كما هي عبر‬

‫‪ ‬مثال مختلف‬

‫يمكن أيضًا ( هذا المثال يقارن بين نصين‪ .‬أوالً قمنا بإعداد النصوص ‪ ،‬تسلسل سالسل فردية من سطر واحد تنتهي بخطوط جديدة‬
‫‪):‬طريقة الكائنات التي تشبه الملفات)(‪ readlines‬الحصول على مثل هذه التسلسالت من‬

‫>>>‬

‫‪>>> text1 = ''' 1. Beautiful is better than ugly.‬‬

‫‪... 2. Explicit is better than implicit.‬‬

‫‪... 3. Simple is better than complex.‬‬

‫‪... 4. Complex is better than complicated.‬‬

‫)‪... '''.splitlines(keepends=True‬‬

‫)‪>>> len(text1‬‬

‫‪4‬‬

‫]‪>>> text1[0][-1‬‬

‫'‪'\n‬‬

‫‪>>> text2 = ''' 1. Beautiful is better than ugly.‬‬

‫‪... 3. Simple is better than complex.‬‬

‫‪... 4. Complicated is better than complex.‬‬

‫‪Pg. 320‬‬
... 5. Flat is better than nested.

... '''.splitlines(keepends=True)

‫بعد ذلك نقوم بإنشاء كائن مختلف‬:

>>>

>>> d = Differ()

‫الحظ أنه عند إنشاء‬ Differ‫راجع‬ ."‫ قد نقوم بتمرير وظائف لتصفية السطر والحرف "غير المرغوب فيه‬، ‫ كائن‬ Differ() ‫المنشئ‬
‫للحصول على التفاصيل‬.

‫ نقارن بين االثنين‬، ‫أخيرً ا‬:

>>>

>>> result = list(d.compare(text1, text2))

result ‫ لذلك دعونا نطبعها جي ًدا‬، ‫عبارة عن قائمة سالسل‬:

>>>

>>> from pprint import pprint

>>> pprint(result)

[' 1. Beautiful is better than ugly.\n',

'- 2. Explicit is better than implicit.\n',

'- 3. Simple is better than complex.\n',

'+ 3. Simple is better than complex.\n',

'? ++\n',

'- 4. Complex is better than complicated.\n',

'? ^ ---- ^\n',

'+ 4. Complicated is better than complex.\n',

'? ++++ ^ ^\n',

'+ 5. Flat is better than nested.\n']

‫كسلسلة واحدة متعددة األسطر تبدو كما يلي‬:

>>>

>>> import sys

>>> sys.stdout.writelines(result)

1. Beautiful is better than ugly.

- 2. Explicit is better than implicit.

- 3. Simple is better than complex.

Pg. 321
+ 3. Simple is better than complex.

? ++

- 4. Complex is better than complicated.

? ^ ---- ^

+ 4. Complicated is better than complex.

? ++++ ^ ^

+ 5. Flat is better than nested.

‫واجهة سطر األوامر ل‬difflib 

‫ يوضح هذا المثال كيفية استخدام‬difflib ‫إلنشاء‬ diff‫يتم تضمينه أيضً ا في توزيع مصدر‬ .‫ أداة مشابهة‬Python ،
‫مثل‬ Tools/scripts/diff.py.

#!/usr/bin/env python3

""" Command line interface to difflib.py providing diffs in four formats:

* ndiff: lists every line and highlights interline changes.

* context: highlights clusters of changes in a before/after format.

* unified: highlights clusters of changes in an inline format.

* html: generates side by side comparison with change highlights.

"""

import sys, os, difflib, argparse

from datetime import datetime, timezone

def file_mtime(path):

t = datetime.fromtimestamp(os.stat(path).st_mtime,

timezone.utc)

return t.astimezone().isoformat()

def main():

parser = argparse.ArgumentParser()

Pg. 322
parser.add_argument('-c', action='store_true', default=False,

help='Produce a context format diff (default)')

parser.add_argument('-u', action='store_true', default=False,

help='Produce a unified format diff')

parser.add_argument('-m', action='store_true', default=False,

help='Produce HTML side by side diff '

'(can use -c and -l in conjunction)')

parser.add_argument('-n', action='store_true', default=False,

help='Produce a ndiff format diff')

parser.add_argument('-l', '--lines', type=int, default=3,

help='Set number of context lines (default 3)')

parser.add_argument('fromfile')

parser.add_argument('tofile')

options = parser.parse_args()

n = options.lines

fromfile = options.fromfile

tofile = options.tofile

fromdate = file_mtime(fromfile)

todate = file_mtime(tofile)

with open(fromfile) as ff:

fromlines = ff.readlines()

with open(tofile) as tf:

tolines = tf.readlines()

if options.u:

diff = difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate, n=n)

elif options.n:

diff = difflib.ndiff(fromlines, tolines)

elif options.m:

Pg. 323
‫)‪diff = difflib.HtmlDiff().make_file(fromlines,tolines,fromfile,tofile,context=options.c,numlines=n‬‬

‫‪else:‬‬

‫)‪diff = difflib.context_diff(fromlines, tolines, fromfile, tofile, fromdate, todate, n=n‬‬

‫)‪sys.stdout.writelines(diff‬‬

‫‪if __name__ == '__main__':‬‬

‫)(‪main‬‬

‫‪ ‬تغليف وتعبئة النص ‪textwrap-‬‬

‫‪: Lib / textwrap.py‬كود المصدر‬

‫الفئة التي يعمل كل عمل‪ .‬إذا كنت تقوم فقط بلف أو ملء ‪ TextWrapper،‬توفر وحدة بعض وظائف الراحة‪ ،‬وكذلك‪ textwrap‬و‬
‫سلسلة نصية واحدة أو اثنتين ‪ ،‬فيجب أن تكون الوظائف المالئمة جيدة بما فيه الكفاية ؛‪ ‬وإال ‪ ،‬يجب عليك استخدام مثيل‬
‫‪.‬أجل الكفاءة‪ TextWrapper‬من‬

‫‪ ، * ، initial_indent  =  '' ، subsequent_indent  =  '' ، expand_tabs  = ‬النص‪ ، ‬عرض‪textwrap.wrap( 70  =  ‬‬


‫‪ ، dro‬صحيح ‪ ، break_long_words  = ‬خطأ ‪ ، fix_sentence_endings  = ‬صحيح ‪ ، replace_whitespace  = ‬صحيح‬
‫)ال يوجد ‪ ، tabsize  =  8 ، max_lines  = ‬صحيح ‪ ، break_on_hyphens  = ‬صحيح ‪p_whitespace  = ‬‬

‫التفاف الفقرة المفردة في‪ ‬نص‪( ‬سلسلة) بحيث يكون طول كل سطر‪ ‬بأحرف‪ ‬عرض‪ ‬على األكثر‪ . ‬إرجاع قائمة بأسطر اإلخراج ‪،‬‬
‫‪.‬بدون أسطر جديدة نهائية‬

‫‪.‬الموثقة أدناه ‪ TextWrapper،‬تتوافق وسيطات الكلمات الرئيسية االختيارية مع سمات‪ L‬مثيل‬

‫‪ wrap().‬الطريقة للحصول على تفاصيل إضافية حول كيفية التصرف)(‪ TextWrapper.wrap‬راجع‬

‫‪ ، * ، initial_indent  =  '' ، subsequent_indent  =  '' ، expand_tabs  = ‬النص‪ ، ‬عرض‪textwrap.fill( 70  =  ‬‬


‫‪ ، dro‬صحيح ‪ ، break_long_words  = ‬خطأ ‪ ، fix_sentence_endings  = ‬صحيح ‪ ، replace_whitespace  = ‬صحيح‬
‫)ال يوجد ‪ ، tabsize  =  8 ، max_lines  = ‬صحيح ‪ ، break_on_hyphens  = ‬صحيح ‪p_whitespace  = ‬‬

‫هو اختصار ل)(‪. fill‬التفاف الفقرة المفردة في‪ ‬النص‪ ، ‬وإرجاع سلسلة واحدة تحتوي على الفقرة الملتفة‬

‫))‪"\n".join(wrap(text, ...‬‬

‫‪ wrap().‬يقبل بالضبط نفس وسيطات الكلمات الرئيسية مثل)(‪ ، fill‬على وجه الخصوص‬

‫‪textwrap.shorten( text ، width ، * ، fix_sentence_endings  =  False ، break_long_words  =  True ، break‬‬


‫‪_on_hyphens  =  True ، placeholder  =  '[...]' ) ‬‬

‫‪ .‬طي‪ ‬النص‪ ‬المحدد‪ ‬واقتطاعه‪ ‬ليالئم‪ ‬العرض‪ ‬المحدد‬

‫أوالً‪ ‬يتم طي‪ ‬المسافة البيضاء في‪ ‬النص‪( ‬يتم استبدال كل المسافات بمسافات‪ L‬مفردة)‪ .‬إذا كانت النتيجة تتناسب مع‪ ‬العرض‪ ، ‬يتم‬
‫‪ placeholder‬إرجاعها‪ .‬خالف ذلك ‪ ،‬يتم إسقاط عدد كافٍ من الكلمات من النهاية بحيث تكون الكلمات‪ L‬المتبقية باإلضافة إلى‬
‫‪ width:‬المالءمة‪ L‬الداخلية‬

‫>>>‬

‫)‪>>> textwrap.shorten("Hello world!", width=12‬‬

‫‪Pg. 324‬‬
‫'!‪'Hello world‬‬

‫)‪>>> textwrap.shorten("Hello world!", width=11‬‬

‫']‪'Hello [...‬‬

‫)"‪>>> textwrap.shorten("Hello world", width=10, placeholder="...‬‬

‫'‪'Hello...‬‬

‫الموثقة أدناه‪ .‬علما بأن وانهار بيضاء قبل أن يتم ‪ TextWrapper،‬تتوافق وسيطات الكلمات الرئيسية االختيارية مع سمات‪ L‬مثيل‬
‫تمرير النص إلى‪ ‬وظيفة‪ ،‬لذلك تغيير قيمة‪ ، ، ، ‬و‪ ‬سيكون لها أي‬
‫‪.TextWrapper fill()tabsizeexpand_tabsdrop_whitespacereplace_whitespace‬تأثير‬

‫الجديد في اإلصدار ‪3.4.1‬‬

‫‪ ) ‬نص ‪textwrap.dedent( ‬‬

‫‪ .‬قم بإزالة أي مسافة‪ L‬بيضاء مشتركة بين السطور من كل سطر في‪ ‬النص‬

‫يمكن استخدام هذا لجعل السالسل الثالثية بين عالمات االقتباس تصطف مع الحافة اليسرى من الشاشة ‪ ،‬مع االستمرار في عرضها‬
‫‪.‬في الكود المصدري في شكل مسافة‪ L‬بادئة‬

‫الحظ أنه يتم التعامل مع عالمات الجدولة والمسافات‪ L‬على أنها مسافات بيضاء ‪ ،‬ولكنها ليست متساوية‪ :‬األسطر‪ ‬وال‪ ‬يُنظر إليها على‬
‫"‪."  hello""\thello‬أنها تحتوي على مسافة بادئة مشتركة‬

‫‪.‬يتم تجاهل األسطر التي تحتوي على مسافة بيضاء فقط في اإلدخال وتسويتها إلى حرف سطر جديد واحد في اإلخراج‬

‫‪:‬على سبيل المثال‬

‫‪def test():‬‬

‫!‪# end first line with \ to avoid the empty line‬‬

‫\''' = ‪s‬‬

‫‪hello‬‬

‫‪world‬‬

‫'''‬

‫))‪print(repr(s‬‬ ‫‪# prints ' hello\n‬‬ ‫' ‪world\n‬‬

‫'‪print(repr(dedent(s))) # prints 'hello\n world\n‬‬

‫‪ ) ‬النص‪ ، ‬البادئة‪ ، ‬المسند‪  =  ‬ال شيء ‪textwrap.indent( ‬‬

‫‪ .‬أضف‪ ‬بادئة‪ ‬إلى بداية األسطر المحددة في‪ ‬النص‬

‫‪ text.splitlines(True).‬يتم فصل السطور عن طريق االتصال‬

‫‪.‬بشكل افتراضي ‪ ،‬تتم إضافة‪ ‬البادئة‪  ‬إلى جميع األسطر التي ال تتكون فقط من مسافات بيضاء (بما في ذلك أي نهايات سطر)‬

‫‪:‬على سبيل المثال‬

‫>>>‬

‫'‪>>> s = 'hello\n\n \nworld‬‬

‫)' ' ‪>>> indent(s,‬‬

‫‪Pg. 325‬‬
‫'‪' hello\n\n \n world‬‬

‫يمكن استخدام وسيطة‪ ‬المسند‪ ‬االختيارية‪ ‬للتحكم في األسطر التي تم وضع مسافة‪ L‬بادئة لها‪ .‬على سبيل المثال ‪ ،‬من السهل‬
‫‪:‬إضافة‪ ‬بادئة‪ ‬حتى إلى األسطر الفارغة والمسافات البيضاء فقط‬

‫>>>‬

‫))‪>>> print(indent(s, '+ ', lambda line: True‬‬

‫‪+ hello‬‬

‫‪+‬‬

‫‪+‬‬

‫‪+ world‬‬

‫الجديد في اإلصدار ‪3.3.1‬‬

‫المثال واستدعاء أسلوب واحد على ذلك‪ .‬ال يتم إعادة استخدام‪ TextWrapper‬العمل عن طريق إنشاء)(‪ shorten‬و)(‪wrap()، fill‬‬
‫قد يكون ‪ fill()،‬و ‪ /‬أو)(‪ wrap‬هذا المثال ‪ ،‬لذلك بالنسبة للتطبيقات التي تعالج العديد من السالسل النصية باستخدام‬
‫‪ .‬الكائن‪ ‬الخاص بك أكثر كفاءة‪ TextWrapper‬إنشاء‬

‫يُفضل أن يُلف النص على مسافات‪ L‬بيضاء وبعد الواصالت مباشر ًة في الكلمات الموصولة ؛‪ ‬عندها فقط سيتم كسر الكلمات الطويلة‬
‫‪.‬يتم ضبطها على خطأ‪ TextWrapper.break_long_words‬إذا لزم األمر ‪ ،‬ما لم‬

‫‪ textwrap.TextWrapper( **  kwargs ) ‬فئة‬

‫منشئ يقبل عددا من الحجج الكلمة اختيارية‪ .‬تتوافق كل وسيطة كلمة رئيسية مع سمة مثيل ‪ ،‬على سبيل المثال‪ TextWrapper‬و‬

‫)" *"=‪wrapper = TextWrapper(initial_indent‬‬

‫بالضبط مثل‬

‫)(‪wrapper = TextWrapper‬‬

‫" *" = ‪wrapper.initial_indent‬‬

‫الكائن عدة مرات ‪ ،‬ويمكنك تغيير أي من خياراته من خالل التعيين المباشر لسمات‪ TextWrapper L‬يمكنك إعادة استخدام نفس‬
‫‪.‬المثيل بين االستخدامات‪L‬‬

‫‪:‬سمات‪ L‬سبيل المثال (والحجج الكلمة إلى منشئ) على النحو التالي‪ TextWrapper‬و‬

‫‪width‬‬

‫‪70‬أقصى طول للخطوط الملفوفة‪ .‬طالما ال توجد كلمات فردية في نص اإلدخال أطول من ‪:) ‬افتراضي(‬
‫‪.‬األحرف‪ width‬يضمن عدم وجود سطر إخراج أطول من‪ width، TextWrapper‬ذلك‬

‫‪expand_tabs‬‬

‫‪ .‬طريقة‪ ‬النص )(‪ expandtabs‬فسيتم توسيع‪ ‬كل أحرف الجدولة في‪ ‬النص‪ ‬إلى مسافات باستخدام‪ true ، ‬إذا كان‪:) True‬افتراضيًا(‬

‫‪tabsize‬‬

‫هذا صحيحً ا ‪ ،‬فسيتم توسيع‪ ‬كل أحرف الجدولة في‪ ‬النص‪ ‬إلى صفر أو مسافات أكثر ‪ ،‬اعتما ًدا ‪8 expand_tabs‬إذا كان‪:) ‬افتراضيًا(‬
‫‪.‬على العمود الحالي وحجم عالمة التبويب المحدد‬

‫الجديد في اإلصدار ‪3.3.1‬‬

‫‪replace_whitespace‬‬

‫‪Pg. 326‬‬
‫ستستبدل الطريقة كل حرف مسافة بيضاء بمسافة)(‪ ، wrap‬بعد توسيع الجدولة ولكن قبل االلتفاف ‪ true ،‬إذا كان‪:) True‬افتراضيًا(‬
‫واحدة‪  .‬تكون أحرف المسافات البيضاء التي تم استبدالها كما يلي‪ :‬عالمة تبويب ‪ ،‬وسطر جديد ‪ ،‬وعالمة تبويب عمودية ‪ ،‬وتغذية‬
‫‪ ( '\t\n\v\f\r').‬نموذجية ‪ ،‬وسطر رجوع‬

‫ملحوظة‬

‫‪ ‬‬

‫غير صحيح‪ ،‬سيتم استبدال كل حرف التبويب بمسافة واحدة‪ ،‬وهو‪ replace_whitespace‬هو زائف و‪ expand_tabs‬إذا‬
‫‪ .‬ليس‪ ‬نفس توسع عالمة التبويب‬

‫ملحوظة‬

‫‪ ‬‬

‫خاطئة ‪ ،‬فقد تظهر األسطر الجديدة في منتصف السطر وتتسبب في إخراج غريب‪ .‬لهذا السبب ‪ replace_whitespace ،‬إذا كانت‬
‫‪.‬يتم لفها بشكل منفصل )أو ما شابه)(‪ str.splitlines‬باستخدام( يجب تقسيم النص إلى فقرات‬

‫‪drop_whitespace‬‬

‫يتم إسقاط المسافة‪ L‬البيضاء في بداية ونهاية كل سطر (بعد االلتفاف ولكن قبل وضع مسافة‪ true ، L‬إذا كان )‪ True:‬افتراضيًا(‬
‫بادئة)‪  .‬ومع ذلك ‪ ،‬ال يتم إسقاط المسافة البيضاء في بداية الفقرة إذا اتبعتها مسافات غير بيضاء‪ .‬إذا احتلت المسافة البيضاء سطرً ا‬
‫‪.‬كامالً ‪ ،‬فسيتم إسقاط الخط بالكامل‬

‫‪initial_indent‬‬

‫السلسلة التي سيتم إلحاقها‪ L‬مسب ًقا بالسطر األول من اإلخراج الملفوف‪ .‬تحسب باتجاه طول السطر األول‪ .‬لم يتم وضع )‪ '':‬افتراضيًا(‬
‫‪.‬مسافة‪ L‬بادئة للسلسلة الفارغة‬

‫‪subsequent_indent‬‬

‫السلسلة التي سيتم إلحاقها مسب ًقا بجميع أسطر الملف المغلف باستثناء األول‪ .‬تحسب باتجاه طول كل سطر ما عدا )‪ '':‬افتراضيًا(‬
‫‪.‬األول‬

‫‪fix_sentence_endings‬‬

‫يحاول اكتشاف نهايات الجمل والتأكد من أن الجمل مفصولة دائمًا ‪ ، TextWrapper‬إذا كان هذا صحيحً ا‪:) False‬افتراضيًا(‬
‫بمسافتين بالضبط‪ .‬هذا مطلوب بشكل عام للنص بخط أحادي المسافة‪ .‬ومع ذلك‪ ،‬فإن خوارزمية الكشف الحكم هو الكمال‪ :‬يفترض أن‬
‫عقوبة إنهاء تتكون من حرف صغيرة تليها أحد‪'!' ،'.' ‬أو‪'?' ‬ربما تليها أحد‪'"' ‬أو‪ ،"'" ‬متبوعا بمسافة‪ .‬تتمثل إحدى مشكالت‪ L‬هذه‬
‫في‪ "Dr." ‬الخوارزمية في أنها غير قادرة على اكتشاف الفرق بين‬

‫]‪[...] Dr. Frankenstein's monster [...‬‬

‫و "بقعة"‪ .‬في‬

‫]‪[...] See Spot. See Spot run [...‬‬

‫‪.‬خطأ افتراضيًا‪fix_sentence_endings ‬‬

‫تعريف "األحرف الصغيرة" ‪ ،‬واتفاقية استخدام مسافتين بعد ‪ string.lowercase‬نظرً ا ألن خوارزمية اكتشاف الجملة تعتمد على‬
‫‪.‬فترة لفصل الجمل على نفس السطر ‪ ،‬فهي خاصة بنصوص اللغة اإلنجليزية‬

‫‪break_long_words‬‬

‫فسيتم كسر‪ ‬الكلمات األطول من‪ ‬ذلك لضمان عدم وجود سطور أطول ‪ ، width‬إذا كان هذا صحيحً ا‪:) True‬افتراضيًا(‬
‫سيتم وضع الكلمات (‪ width. ‬إذا كانت خاطئة ‪ ،‬فلن يتم كسر الكلمات الطويلة ‪ ،‬وقد تكون بعض األسطر أطول من‪ width. ‬من‬
‫)‪.‬يتم تجاوزه‪ width‬الطويلة في سطر من تلقاء نفسها لتقليل المقدار الذي‬

‫‪Pg. 327‬‬
‫‪break_on_hyphens‬‬

‫إذا كان هذا صحيحً ا ‪ ،‬فسيتم االلتفاف بشكل مفضل على المسافات‪ L‬البيضاء وبعد الواصالت مباشرة في الكلمات ‪:) True‬افتراضيًا(‬
‫المركبة ‪ ،‬كما هو معتاد في اللغة اإلنجليزية‪  .‬إذا كانت خاطئة ‪ ،‬فسيتم اعتبار المسافات البيضاء فقط أماكن جيدة محتملة لفواصل‬
‫على خطأ إذا كنت تريد كلمات غير آمنة ح ًقا‪ .‬كان السلوك االفتراضي في ‪ break_long_words‬األسطر ‪ ،‬ولكن عليك ضبطها‬
‫‪.‬اإلصدارات السابقة هو السماح دائمًا بكسر الكلمات الموصولة‬

‫‪max_lines‬‬

‫فسيحتوي اإلخراج على أقصى‪ ‬حد من‪ ‬األسطر ‪ ،‬مع‪ ‬ظهور‪ ‬عنصر نائب‪ ‬في ‪ None،‬إذا لم يكن األمر كذلك‪ :)None ‬افتراضيًا(‬
‫‪.‬نهاية اإلخراج‬

‫الجديد في اإلصدار ‪3.4.1‬‬

‫‪placeholder‬‬

‫']‪.' [...‬السلسلة التي ستظهر في نهاية النص الناتج إذا تم قطعها‪ :) L‬افتراضيًا(‬

‫الجديد في اإلصدار ‪3.4.1‬‬

‫‪:‬يوفر أيضً ا بعض الطرق العامة ‪ ،‬المشابهة‪ L‬لوظائف الراحة على مستوى الوحدة‪TextWrapper ‬‬

‫‪ ) ‬نص ‪wrap( ‬‬

‫األحرف‪ .‬جميع خيارات االلتفاف ‪ width‬التفاف الفقرة المفردة في‪ ‬النص‪( ‬سلسلة) بحيث يكون طول كل سطر على األكثر من‬
‫المثيل‪  .‬إرجاع قائمة بأسطر اإلخراج ‪ ،‬بدون أسطر جديدة نهائية‪ .‬إذا كان اإلخراج الملتف ال ‪ TextWrapper‬مأخوذة من سمات‪L‬‬
‫‪.‬يحتوي على محتوى ‪ ،‬فإن القائمة التي تم إرجاعها تكون فارغة‬

‫‪ ) ‬نص ‪fill( ‬‬

‫‪.‬التفاف الفقرة المفردة في‪ ‬النص‪ ، ‬وإرجاع سلسلة واحدة تحتوي على الفقرة الملتفة‬

‫‪ ‬قاعدة بيانات يونيكود ‪unicodedata-‬‬

‫تم ‪ Unicode. ‬التي تحدد خصائص األحرف لجميع أحرف )‪ Unicode (UCD‬توفر هذه الوحدة الوصول إلى قاعدة بيانات أحرف‬
‫‪ UCD .‬تجميع البيانات الواردة في قاعدة البيانات هذه من‪ ‬اإلصدار ‪ 13.0.0‬من‬

‫القياسي رقم ‪" ، 44‬قاعدة بيانات أحرف ‪ Unicode‬تستخدم الوحدة نفس األسماء‪ L‬والرموز كما تم تعريفها بواسطة ملحق‬
‫‪:‬تحدد الوظائف التالية‪Unicode" . ‬‬

‫‪ ) ‬االسم ‪unicodedata.lookup( ‬‬

‫ابحث عن الحرف باالسم‪  .‬إذا تم العثور على حرف يحمل االسم المحدد ‪ ،‬فقم بإرجاع الحرف المقابل‪ .‬إذا لم يتم العثور‬
‫‪.‬يتم رفعها‪ ، KeyError‬عليها‬

‫‪ .‬تم التغيير في اإلصدار ‪ :3.3‬تمت إضافة‪ ‬دعم األسماء المستعارة‪ 1 ‬والتسلسالت المسماة‪2 ‬‬

‫‪ ] ) ‬افتراضي‪unicodedata.name( chr  [ ، ‬‬

‫كسلسلة‪ .‬إذا لم يتم تعريف أي اسم ‪ ،‬فسيتم‪ ‬إرجاع‪ ‬االفتراضي‪ ، ‬أو إذا لم يتم ‪ chr ‬إرجاع االسم المخصص للحرف‬
‫‪.‬فسيتم رفعه‪ ، ValueError‬تقديمه‬

‫‪ ] ) ‬افتراضي‪unicodedata.decimal( chr  [ ، ‬‬

‫كعدد‪ ‬صحيح‪ .‬إذا لم يتم تحديد مثل هذه القيمة ‪ ،‬يتم إرجاع‪ ‬القيمة‪ ‬االفتراضية‪ ، ‬أو إذا ‪ُ  chr‬ترجع القيمة العشرية المخصصة للحرف‬
‫‪.‬يتم رفعها‪ ، ValueError‬لم‪ ‬يتم تحديدها‬

‫‪Pg. 328‬‬
‫‪ ] ) ‬افتراضي‪unicodedata.digit( chr  [ ، ‬‬

‫كعدد‪ ‬صحيح‪ .‬إذا لم يتم تحديد مثل هذه القيمة ‪ ،‬يتم إرجاع‪ ‬القيمة‪ ‬االفتراضية‪ ، ‬أو إذا لم‪ ‬يتم ‪ُ  chr‬ترجع قيمة الرقم المعينة للحرف‬
‫‪.‬يتم رفعها‪ ، ValueError‬تحديدها‬

‫‪ ] ) ‬افتراضي ‪unicodedata.numeric( chr  [ ، ‬‬

‫على‪ ‬هيئة عائم‪ .‬إذا لم يتم تحديد مثل هذه القيمة ‪ ،‬يتم إرجاع‪ ‬القيمة‪ ‬االفتراضية‪ ، ‬أو إذا ‪ُ  chr‬ترجع القيمة الرقمية المعينة إلى الحرف‬
‫‪.‬يتم رفعها‪ ، ValueError‬لم‪ ‬يتم تحديدها‬

‫‪ ) ‬مركز حقوق اإلنسان ‪unicodedata.category( ‬‬

‫‪.‬كسلسلة‪ chr ‬ترجع الفئة العامة المعينة إلى الحرف‬

‫‪ ) ‬مركز حقوق اإلنسان ‪unicodedata.bidirectional( ‬‬

‫‪.‬كسلسلة‪  .‬إذا لم يتم تحديد مثل هذه القيمة ‪ ،‬يتم إرجاع سلسلة فارغة‪ chr ‬ترجع الفئة ثنائية االتجاه المعينة إلى الحرف‬

‫‪ ) ‬مركز حقوق اإلنسان ‪unicodedata.combining( ‬‬

‫‪.‬كعدد‪ ‬صحيح‪ُ  .‬ترجع‪0 ‬إذا لم يتم تحديد فئة مدمجة ‪ُ  chr‬ترجع فئة الدمج األساسية المعينة إلى الحرف‬

‫‪ ) ‬مركز حقوق اإلنسان ‪unicodedata.east_asian_width( ‬‬

‫‪.‬كسلسلة‪ُ  chr ‬ترجع عرض شرق آسيا المخصص للحرف‬

‫‪ ) ‬مركز حقوق اإلنسان ‪unicodedata.mirrored( ‬‬

‫كعدد‪ ‬صحيح‪ُ  .‬ترجع‪1 ‬إذا تم تحديد الحرف على أنه حرف "معكوس" في نص ‪ُ  chr‬ترجع الخاصية المعكوسة‪ L‬المعينة إلى الحرف‬
‫‪.‬ثنائي االتجاه ‪0 ،‬وإال‬

‫‪ ) ‬مركز حقوق اإلنسان ‪unicodedata.decomposition( ‬‬

‫‪.‬كسلسلة‪ .‬يتم إرجاع سلسلة فارغة في حالة عدم تحديد مثل هذا التعيين‪ُ  chr ‬ترجع تعيين تحليل األحرف المعين إلى‬

‫‪ ) ‬نموذج‪ ، ‬غير‪ ‬مسجل ‪unicodedata.normalize( ‬‬

‫‪ "NFKD".‬و "‪ "NFD‬و "‪ "NFKC‬و "‪ "NFC‬القيم الصالحة‪ ‬للنموذج‪ ‬هي‪ Unicode unistr . ‬إعادة النموذج العادي‪ ‬شكل‪ ‬لسلسلة‬

‫بنا ًء على تعريف التكافؤ المتعارف عليه وتكافؤ التوافق‪ .‬في ‪ Unicode ،‬أشكال التطبيع المختلفة لسلسلة ‪ Unicode‬يحدد معيار‬
‫ضا التعبير عن الحرف ‪Unicode ،‬‬ ‫‪ U + 00C7 (LATIN‬يمكن التعبير عن عدة أحرف بطرق مختلفة‪ .‬على سبيل المثال ‪ ،‬يمكن أي ً‬
‫‪ U + 0043 (LATIN CAPITAL LETTER C) U + 0327 (CEDILLA).‬بالتسلسل )‪CAPITAL LETTER C WITH CEDILLA‬‬

‫أي ً‬
‫ضا باسم التحلل الكنسي ‪ ،‬ويترجم )‪ D (NFD‬يُعرف الشكل العادي ‪ D.‬والشكل العادي ‪ C‬لكل حرف شكلين عاديين‪ :‬النموذج العادي‬
‫ً‬ ‫ً‬ ‫اًل‬ ‫ً‬
‫‪.‬أوال تحل أساسيًا ‪ ،‬ثم يؤلف أحرفا مجمعة مسبقا مرة أخرى )‪ C (NFC‬كل حرف إلى شكله المتحلل‪ .‬يطبق النموذج العادي‬

‫يتم دعم بعض األحرف ‪ Unicode ،‬باإلضافة إلى هذين الشكلين ‪ ،‬هناك شكلين عاديين إضافيين يعتمدان على تكافؤ التوافق‪ .‬في‬
‫هي في الحقيقة نفس )‪ ، U + 2160 (ROMAN NUMERAL ONE‬التي عاد ًة ما يتم توحيدها مع أحرف أخرى‪ .‬على سبيل المثال‬
‫للتوافق مع مجموعات األحرف ‪ Unicode‬ومع ذلك ‪ ،‬فهو مدعوم في‪ U + 0049 (LATIN CAPITAL LETTER I). ‬الشيء مثل‬
‫‪ gb2312).‬مثل( الموجودة‬

‫‪ KC‬تحليل التوافق ‪ ،‬أي استبدال جميع أحرف التوافق بمكافئاتها‪ .‬يطبق النموذج العادي )‪ KD (NFKD‬سيطبق النموذج العادي‬
‫‪.‬أوالً تحلل التوافق ‪ ،‬متبو ًعا بالتركيب األساسي )‪(NFKC‬‬

‫حتى لو تم تطبيع سلسلتين يونيكود وتبدو متشابهة‪ L‬للقارئ البشري ‪ ،‬إذا كانت إحداهما تحتوي على أحرف مجمعة واألخرى ال ‪ ،‬فقد‬
‫‪.‬ال تقارنان بالتساوي‬

‫‪ ) ‬نموذج‪ ، ‬غير‪ ‬مسجل ‪unicodedata.is_normalized( ‬‬

‫‪Pg. 329‬‬
‫و "‪ "NFD‬و "‪ "NFKC‬و "‪ "NFC‬في شكل طبيعي‪ ‬شكل‪ . ‬القيم الصالحة‪ ‬للنموذج‪ ‬هي‪ Unicode unistr ‬عودة إذا كانت سلسلة‬
‫‪"NFKD".‬‬

‫الجديد في اإلصدار ‪3.8.1‬‬

‫‪:‬باإلضافة إلى ذلك ‪ ،‬تعرض الوحدة الثابت التالي‬

‫‪unicodedata.unidata_version‬‬

‫‪.‬المستخدمة‪ L‬في هذه الوحدة ‪ Unicode‬إصدار قاعدة بيانات‬

‫‪unicodedata.ucd_3_2_0‬‬

‫بدالً من ذلك ‪ ،‬للتطبيقات التي ‪ Unicode‬هذا كائن له نفس أساليب الوحدة بأكملها ‪ ،‬ولكنه يستخدم اإلصدار ‪ 3.2‬من قاعدة بيانات‬
‫‪ IDNA).‬مثل( ‪ Unicode‬تتطلب هذا اإلصدار المحدد من قاعدة بيانات‬

‫‪:‬أمثلة‬

‫>>>‬

‫‪>>> import unicodedata‬‬

‫)'‪>>> unicodedata.lookup('LEFT CURLY BRACKET‬‬

‫'{'‬

‫)'‪>>> unicodedata.name('/‬‬

‫'‪'SOLIDUS‬‬

‫)'‪>>> unicodedata.decimal('9‬‬

‫‪9‬‬

‫)'‪>>> unicodedata.decimal('a‬‬

‫‪Traceback (most recent call last):‬‬

‫>‪File "<stdin>", line 1, in <module‬‬

‫‪ValueError: not a decimal‬‬

‫‪>>> unicodedata.category('A') # 'L'etter, 'u'ppercase‬‬

‫'‪'Lu‬‬

‫‪>>> unicodedata.bidirectional('\u0660') # 'A'rabic, 'N'umber‬‬

‫'‪'AN‬‬

‫‪ ‬إعداد سلسلة اإلنترنت ‪stringprep-‬‬

‫‪: Lib / stringprep.py‬كود المصدر‬

‫عند تحديد أشياء (مثل أسماء المضيف) في اإلنترنت ‪ ،‬غالبًا ما يكون من الضروري مقارنة هذه التعريفات من أجل "المساواة"‪ .‬قد‬
‫تعتمد كيفية تنفيذ هذه المقارنة بالضبط على مجال التطبيق ‪ ،‬على سبيل المثال ما إذا كان يجب أن يكون غير حساس لحالة األحرف‬
‫‪".‬أم ال‪ .‬قد يكون من الضروري أي ً‬
‫ض ا تقييد التعريفات المحتملة ‪ ،‬للسماح فقط بالتعريفات التي تتكون من أحرف "قابلة للطباعة‬

‫‪Pg. 330‬‬
‫في بروتوكوالت اإلنترنت‪ .‬قبل تمرير الخيوط على السلك ‪ ،‬تتم معالجتها من ‪ Unicode‬إجراء "تحضير" سالسل‪ RFC 3454 ‬يحدد‬
‫مجموعة من الجداول التي يمكن دمجها في ملفات ‪ RFC‬خالل إجراء التحضير ‪ ،‬وبعد ذلك يكون لديهم شكل طبيعي معين‪ .‬يحدد‬
‫اإلجراء التي ‪stringprep ‬تعريف‪  .‬يجب أن يحدد كل ملف تعريف الجداول التي يستخدمها ‪ ،‬وما األجزاء االختيارية األخرى من‬
‫والذي يستخدم ألسماء‪ L‬النطاقات‪ nameprep، L‬ملف التعريف هو‪stringprep‬تشكل جزءًا من ملف التعريف‪ .‬أحد األمثلة على‬
‫‪.‬الدولية‬

‫نظرً ا ألن هذه الجداول ستكون كبيرة ج ًدا لتمثيلها كقواميس أو قوائم ‪ ،‬فإن‪RFC 3454 . ‬فقط الجداول من‪ stringprep‬تعرض الوحدة‬
‫‪mkstringprep.py‬داخليًا‪ .‬تم إنشاء‪ L‬رمز مصدر الوحدة نفسها باستخدام ‪ Unicode‬الوحدة النمطية تستخدم قاعدة بيانات أحرف‬
‫‪.‬األداة المساعدة‬

‫المجموعات ‪ RFC:‬نتيجة لذلك ‪ ،‬يتم عرض هذه الجداول كوظائف ‪ ،‬وليس هياكل بيانات‪ .‬يوجد نوعان من الجداول في‬
‫إذا كانت المعلمة جزءًا من المجموعة‪ True.‬يوفر "وظيفة مميزة" ‪ ،‬أي دالة ُترجع‪ ، stringprep‬والتعيينات‪ .‬بالنسبة للمجموعة‬
‫‪  ‬بالنسبة للتعيينات ‪ ،‬فإنه يوفر وظيفة التعيين‪ :‬نظرً ا للمفتاح ‪ ،‬فإنه يُرجع القيمة المرتبطة‪ .‬يوجد أدناه قائمة بجميع الوظائف المتوفرة‬
‫‪.‬في الوحدة‬

‫‪ ) ‬كود ‪stringprep.in_table_a1( ‬‬

‫‪ Unicode 3.2).‬نقاط الشفرة غير المعينة في( ‪ A.1‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_b1( ‬‬

‫‪).‬يتم تعيينه بشكل عام إلى ال شيء( ‪ B.1‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.map_table_b2( ‬‬

‫‪ NFKC).‬تعيين لطي الحالة المستخدم مع( ‪ B.2‬قم‪ ‬بإرجاع‪ ‬القيمة المعينة‪ ‬للرمز‪ ‬وف ًقا للجدول‬

‫‪ ) ‬كود ‪stringprep.map_table_b3( ‬‬

‫‪).‬تعيين لطي الحالة المستخدم بدون تسوية( ‪ B.3‬قم‪ ‬بإرجاع‪ ‬القيمة المعينة‪ ‬للكود‪ ‬وف ًقا للجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_c11( ‬‬

‫‪ ASCII).‬أحرف مسافات‪ C.1.1 (L‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_c12( ‬‬

‫‪ ASCII).‬أحرف مسافة بخالف( ‪ C.1.2‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_c11_c12( ‬‬

‫‪ C.1.2).‬و ‪ C.1.1‬أحرف المسافة ‪ ،‬اتحاد( ‪ C.1‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_c21( ‬‬

‫‪ ASCII).‬أحرف تحكم( ‪ C.2.1‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_c22( ‬‬

‫‪ ASCII).‬أحرف تحكم غير( ‪ C.2.2‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_c21_c22( ‬‬

‫‪ C.2.2).‬و ‪ C.2.1‬أحرف التحكم ‪ ،‬اتحاد( ‪ C.2‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_c3( ‬‬

‫‪).‬االستخدام الخاص( ‪ C.3‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪Pg. 331‬‬
‫‪ ) ‬كود ‪stringprep.in_table_c4( ‬‬

‫‪).‬نقاط الرموز غير المكونة من أحرف( ‪ C.4‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_c5( ‬‬

‫‪).‬الرموز البديلة( ‪ C.5‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_c6( ‬‬

‫‪).‬غير مناسب‪ L‬للنص العادي( ‪ C.6‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_c7( ‬‬

‫‪).‬غير مناسب للتمثيل الكنسي( ‪ C.7‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_c8( ‬‬

‫‪).‬تغيير خصائص العرض أو تم إهماله( ‪ C.8‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_c9( ‬‬

‫‪).‬وضع عالمات على األحرف( ‪ C.9‬حدد ما إذا كان‪ ‬الرمز‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_d1( ‬‬

‫‪ "AL").‬أو "‪ "R‬أحرف ذات خاصية ثنائية االتجاه( ‪ D.1‬حدد ما إذا كان‪ ‬الكود‪ ‬موجو ًدا في الجدول‬

‫‪ ) ‬كود ‪stringprep.in_table_d2( ‬‬

‫‪ "L").‬أحرف ذات خاصية ثنائية االتجاه( ‪ D.2‬حدد ما إذا كان‪ ‬الكود‪ ‬موجو ًدا في الجدول‬

‫‪ ‬واجهة قراءة جنو ‪readline-‬‬

‫حدة تحدد عددا من الوظائف لتسهيل إنجاز والقراءة ‪ /‬الكتابة من ملفات التاريخ من مترجم بايثون‪ .‬يمكن استخدام هذه ‪ readline‬و‬
‫الوحدة ‪ ،‬التي تدعم إكمال معرفات‪ L‬بايثون في موجه تفاعلي‪ .‬تؤثر اإلعدادات التي تم ‪ rlcompleter‬الوحدة مباشرة ‪ ،‬أو عبر‬
‫الوظيفة ‪ input() ‬إجراؤها باستخدام هذه الوحدة على سلوك كل من الموجه التفاعلي للمترجم الفوري والمطالبات التي توفرها‬
‫‪.‬المضمنة‬

‫‪ Readline Init‬في الدليل الرئيسي الخاص بك‪ .‬راجع‪ .inputrc‬عبر ملف تهيئة ‪ ،‬عاد ًة ‪ Readline‬قد يتم تكوين روابط مفاتيح‬
‫للحصول على معلومات حول التنسيق والتركيبات المسموح بها لهذا الملف ‪ ،‬وإمكانيات مكتبة ‪ GNU Readline‬في دليل‪File ‬‬
‫‪.‬بشكل عام ‪Readline‬‬

‫ملحوظة‬

‫‪ ‬‬

‫‪ macOS‬في نظام‪ GNU readline. ‬بدالً من‪ libedit‬األساسية‪ Readline L‬يمكن للمكتبة تنفيذ واجهة برمجة تطبيقات مكتبة‬
‫‪.‬تكتشف الوحدة المكتبة التي يتم استخدامها في وقت التشغيل‪، readline‬‬

‫إذا قمت بتحميل سالسل التكوين برمجيًا ‪ ،‬يمكنك التحقق من النص‪ GNU readline. ‬مختلف‪ ‬عن ملف‪ libedit‬ملف التكوين لـ‬
‫‪ libedit.‬و ‪ GNU readline‬للتمييز بين‪"libedit" readline.__doc__ ‬‬

‫فسيتم تسمية‪ ‬ملف التهيئة الموجود في الدليل ‪ macOS ،‬على ‪ editline / libeditreadline‬إذا كنت تستخدم‪ ‬مضاهاة‬
‫‪ TAB:‬ستشغل‪ ‬السادس‪ ‬كيبيندينغس واالنتهاء‪ ~/.editrc‬على سبيل المثال‪ ،‬المحتوى التالي في‪ .editrc. ‬الرئيسي‬

‫‪python:bind -v‬‬

‫‪Pg. 332‬‬
‫‪python:bind ^I rl_complete‬‬

‫‪ ‬الملف‬

‫‪:‬وتكوين المستخدم ‪ init‬تتعلق الوظائف التالية بملف‬

‫‪ ) ‬سلسلة ‪readline.parse_and_bind( ‬‬

‫‪.‬في المكتبة األساسية)(‪ rl_parse_and_bind‬ن ّفذ السطر األول المتوفر في‪ ‬وسيطة‪ ‬السلسلة‪ . ‬هذا يدعو‬

‫‪ ] ) ‬اسم الملف ‪readline.read_init_file( [ ‬‬

‫في المكتبة )(‪ rl_read_init_file‬اسم الملف االفتراضي هو اسم الملف األخير المستخدم‪ .‬هذا يدعو‪ readline. ‬قم بتنفيذ ملف تهيئة‬
‫‪.‬األساسية‪L‬‬

‫‪ ‬المخزن المؤقت للخط‬

‫‪:‬تعمل الوظائف التالية على المخزن المؤقت للخط‬

‫)(‪readline.get_line_buffer‬‬

‫‪).‬في المكتبة األساسية‪ ( rl_line_buffer ‬قم بإرجاع المحتويات الحالية لمخزن الخط‬

‫‪ ) ‬سلسلة ‪readline.insert_text( ‬‬

‫في المكتبة األساسية ‪ ،‬لكنه يتجاهل )(‪ rl_insert_text‬أدخل النص في المخزن المؤقت للسطر عند موضع المؤشر‪ .‬هذا يستدعي‬
‫‪.‬القيمة المعادة‬

‫)(‪readline.redisplay‬‬

‫في المكتبة )(‪ rl_redisplay‬قم بتغيير ما يتم عرضه على الشاشة‪ L‬ليعكس المحتويات الحالية لمخزن الخط المؤقت‪ .‬هذا يدعو‬
‫‪.‬األساسية‪L‬‬

‫‪ ‬ملف التاريخ‬

‫‪:‬تعمل الوظائف التالية على ملف محفوظات‬

‫‪ ] ) ‬اسم الملف ‪readline.read_history_file( [ ‬‬

‫هذا ‪ ~/.history. ‬وألحقه بقائمة المحفوظات‪ .‬اسم الملف االفتراضي هو ‪ readline ،‬قم بتحميل ملف محفوظات‬
‫‪.‬في المكتبة األساسية)(‪ read_history‬يدعو‬

‫‪ ] ) ‬اسم الملف ‪readline.write_history_file( [ ‬‬

‫هذا ‪ ~/.history. ‬احفظ قائمة المحفوظات في ملف محفوظات للقراءة ‪ ،‬واستبدل أي ملف موجود‪ .‬اسم الملف االفتراضي هو‬
‫‪.‬في المكتبة األساسية)(‪ write_history‬يدعو‬

‫‪ ) ‬األسماء‪ ، [  ‬اسم الملف‪readline.append_history_file( ]  ‬‬


‫ً‬
‫موجودا بالفعل‪ .‬هذا ‪ ~/.history. ‬قم‪ ‬بإلحاق‪ ‬عناصر التاريخ األخيرة بالملف‪ .‬اسم الملف االفتراضي هو‬ ‫يجب أن يكون الملف‬
‫‪.‬إلصدار من المكتبة يدعمها ‪ Python‬في المكتبة األساسية‪ .‬هذه الوظيفة موجودة فقط إذا تم تجميع)(‪ append_history‬يدعو‬

‫‪.‬الجديد في اإلصدار ‪3.5‬‬

‫)(‪readline.get_history_length‬‬

‫‪ ) ‬الطول ‪readline.set_history_length( ‬‬

‫‪Pg. 333‬‬
‫تستخدم وظيفة هذه القيمة إلى )(‪ write_history_file‬قم بتعيين أو إعادة عدد األسطر المطلوب لحفظها في ملف المحفوظات‪ .‬و‬
‫في المكتبة األساسية‪ .‬تشير القيم السالبة إلى حجم ملف )(‪ history_truncate_file‬اقتطاع ملف التاريخ‪ ،‬من خالل الدعوة‬
‫‪.‬محفوظات غير محدود‬

‫‪ ‬قائمة التاريخ‬

‫‪:‬تعمل الوظائف التالية على قائمة التاريخ العالمي‬

‫)(‪readline.clear_history‬‬

‫إلصدار ‪ Python‬إال إذا تم تجميع ‪ Python‬في المكتبة األساسية‪ .‬ال توجد وظيفة)(‪ clear_history‬امسح التاريخ الحالي‪ .‬هذا يدعو‬
‫‪.‬من المكتبة يدعمها‬

‫)(‪readline.get_current_history_length‬‬

‫الذي يُرجع الحد األقصى لعدد األسطر ‪ get_history_length()،‬هذا يختلف عن(‪. ‬إرجاع عدد العناصر الموجودة حاليًا في السجل‬
‫)‪.‬التي سيتم كتابتها إلى ملف المحفوظات‬

‫‪ ) ‬فهرس ‪readline.get_history_item( ‬‬

‫في )(‪ history_get‬إرجاع المحتويات الحالية لعنصر المحفوظات في‪ ‬الفهرس‪ . ‬يعتمد فهرس العناصر على أساس واحد‪ .‬هذا يدعو‬
‫‪.‬المكتبة األساسية‬

‫‪ ) ‬بعد ‪readline.remove_history_item( ‬‬

‫في )(‪ remove_history‬إزالة عنصر التاريخ المحدد من خالل موقعه من المحفوظات‪ .‬الموقف على أساس الصفر‪ .‬هذا يدعو‬
‫‪.‬المكتبة األساسية‬

‫‪ ) ‬نقاط البيع‪ ، ‬الخط ‪readline.replace_history_item( ‬‬

‫استبدل عنصر المحفوظات المحدد بواسطة موضعه‪ ‬بالسطر‪ . ‬الموقف على أساس الصفر‪ .‬هذا‬


‫‪.‬في المكتبة األساسية‪ replace_history_entry() ‬يدعو‬

‫‪ ) ‬خط ‪readline.add_history( ‬‬

‫‪.‬في المكتبة األساسية)(‪ add_history‬إلحاق‪ ‬سطر‪ ‬بمخزن المحفوظات المؤقت ‪ ،‬كما لو كان آخر سطر تمت كتابته‪ .‬هذا يدعو‬

‫‪ ) ‬تمكين ‪readline.set_auto_history( ‬‬

‫ل‪ ‬تمكين‪ ‬ينبغي أن يكون حجة قيمة منطقية ‪ readline. ‬عند قراءة اإلدخال عبر)(‪ add_history‬تمكين أو تعطيل المكالمات‪ L‬التلقائية‬
‫‪.‬أنه عندما صحيح‪ ،‬وتمكن تاريخ السيارات‪ ،‬وأنه عندما كاذبة‪ ،‬تعطيل تاريخ السيارات‬

‫الجديد في اإلصدار ‪3.6.1‬‬

‫‪.‬يتم تمكين السجل التلقائي افتراضيًا ‪ ،‬وال تستمر التغييرات على هذا عبر جلسات متعددة‪ CPython: ‬تفاصيل تنفيذ‬

‫‪ ‬خطافات بدء التشغيل‬

‫‪ ] ) ‬وظيفة ‪readline.set_startup_hook( [ ‬‬

‫رد نداء المكتبة األساسية‪ .‬إذا‪ ‬تم تحديد‪ ‬الوظيفة‪ ، ‬فسيتم ‪ rl_startup_hook ‬قم بتعيين أو إزالة الوظيفة التي تم استدعاؤها بواسطة‬
‫أي وظيفة مثبتة بالفعل‪ .‬يتم استدعاء الخطاف بدون أي وسيطات ‪ None‬استخدامها كوظيفة الخطاف الجديدة ؛‪ ‬إذا تم حذف أو حذف‬
‫‪.‬الموجه األول مباشر ًة ‪ readline‬قبل أن يطبع‬

‫‪ ] ) ‬وظيفة ‪readline.set_pre_input_hook( [ ‬‬

‫رد نداء المكتبة األساسية‪ .‬إذا‪ ‬تم تحديد‪ ‬الوظيفة‪ rl_pre_input_hook  ، ‬قم بتعيين أو إزالة الوظيفة التي تم استدعاؤها بواسطة‬
‫أي وظيفة مثبتة بالفعل‪ .‬يتم استدعاء الخطاف بدون ‪ None‬فسيتم استخدامها كوظيفة الخطاف الجديدة ؛‪ ‬إذا تم حذف أو حذف‬

‫‪Pg. 334‬‬
‫مباشرة قراءة أحرف اإلدخال‪ .‬هذه الوظيفة موجودة فقط إذا تم تجميع ‪ readline‬وسيطات بعد طباعة الموجه األول وقبل بدء‬
‫‪.‬إلصدار من المكتبة يدعمها ‪Python‬‬

‫‪Completion‬‬

‫ويمكنه اقتراح وإكمال كلمة ‪ Tab ،‬تتعلق الوظائف التالية بتنفيذ وظيفة مخصصة إلكمال الكلمات‪ .‬يتم تشغيل هذا عاد ًة بواسطة مفتاح‬
‫للمترجم ‪ Python‬إلكمال معرفات‪ rlcompleter‬ليتم استخدامه من قبل ‪ Readline‬يتم كتابتها تلقائيًا‪ .‬بشكل افتراضي ‪ ،‬تم إعداد‬
‫‪.‬سيتم استخدام الوحدة النمطية مع مكمل مخصص ‪ ،‬فيجب تعيين مجموعة مختلفة من محددات الكلمات‪ readline‬التفاعلي‪ .‬إذا كان‬

‫‪ ] ) ‬وظيفة ‪readline.set_completer( [ ‬‬

‫إزالة أي ‪ None‬قم بتعيين أو إزالة وظيفة المكمل‪ .‬إذا‪ ‬تم تحديد‪ ‬الوظيفة‪ ، ‬فسيتم استخدامها كوظيفة مكمل جديدة ؛‪ ‬إذا تم حذف أو‬
‫وظيفة مكمل مثبتة بالفعل‪ .‬تسمى الدالة المكملة باسم‪ ، ‬للحالة‪ ‬في‪ ، ... ، ، ، ‬حتى ُترجع قيمة غير سلسلة‪ .‬يجب أن يُرجع اإلكمال‬
‫‪ .function(text, state)012‬التالي المحتمل بدءًا من‪ ‬النص‬

‫المكتبة )(‪ rl_completion_matches‬الذي‪ ‬تم تمريره إلى ‪ entry_func‬يتم استدعاء وظيفة‪ ‬المكمل المثبتة‪ ‬عن طريق‪ ‬رد‪ ‬نداء‬


‫‪.‬رد من المكتبة األساسية‪ rl_attempted_completion_function‬األساسية‪ .‬و‪ ‬النص‪ ‬سلسلة يأتي من المعلمة األولى إلى‬

‫)(‪readline.get_completer‬‬

‫‪.‬إذا لم يتم تعيين وظيفة المكمل‪ None‬احصل على وظيفة المكمل ‪ ،‬أو‬

‫)(‪readline.get_completion_type‬‬

‫‪.‬المتغير في المكتبة األساسية كعدد صحيح‪ rl_completion_type‬احصل على نوع اإلنجاز الذي تحاول المحاولة‪ .‬هذا يعيد‬

‫)(‪readline.get_begidx‬‬

‫)(‪readline.get_endidx‬‬

‫احصل على مؤشر البداية أو النهاية لنطاق اإلكمال‪ .‬هذه المؤشرات هي‪ ‬بداية‪ ‬و‪ ‬نهاية‪ ‬الحجج تمريرها‬
‫رد من المكتبة األساسية‪ .‬قد تختلف القيم في نفس سيناريو تحرير اإلدخال بنا ًء ‪ rl_attempted_completion_function‬إلى‬
‫‪ libreadline.‬يتصرف بشكل مختلف عن ‪ libedit‬األساسي‪ .‬على سبيل المثال‪ :‬من المعروف أن ‪ readline‬على تنفيذ‬

‫‪ ) ‬سلسلة ‪readline.set_completer_delims( ‬‬

‫)(‪readline.get_completer_delims‬‬

‫قم بتعيين أو الحصول على محددات الكلمة إلكمالها‪  .‬تحدد هذه بداية الكلمة التي سيتم النظر فيها الستكمالها (نطاق اإلكمال)‪ .‬هذه‬
‫‪.‬المتغير في المكتبة األساسية‪ rl_completer_word_break_characters L‬الوظائف تصل إلى‬

‫‪ ] ) ‬وظيفة ‪readline.set_completion_display_matches_hook( [ ‬‬

‫قم بتعيين أو إزالة وظيفة عرض اإلكمال‪ .‬إذا‪ ‬تم تحديد‪ ‬الوظيفة‪ ، ‬فسيتم استخدامها كوظيفة عرض اإلكمال الجديدة ؛‪ ‬إذا تم حذفها‬
‫تتم إزالة أي وظيفة عرض مكتملة مثبتة بالفعل‪ .‬يقوم هذا بتعيين أو ‪ None،‬أو‬
‫رد االتصال في المكتبة األساسية‪ .‬يتم استدعاء وظيفة عرض اإلكمال‪ ‬مرة ‪ rl_completion_display_matches_hook‬مسح‬
‫)‪.function(substitution, [matches], longest_match_length‬واحدة في كل مرة يتم فيها عرض المباريات‬

‫‪Example‬‬

‫وظائف قراءة وكتابة سجل الوحدة النمطية لتحميل وحفظ ملف محفوظات ‪ readline‬يوضح المثال التالي كيفية استخدام‬
‫من الدليل الرئيسي للمستخدم‪ ‬تلقائيًا‪ . ‬عاد ًة ما يتم تنفيذ الكود أدناه تلقائيًا أثناء الجلسات التفاعلية من ‪ .python_history‬مسمى‬
‫‪.‬ملف‪PYTHONSTARTUP ‬المستخدم‬

‫‪import atexit‬‬

‫‪import os‬‬

‫‪Pg. 335‬‬
import readline

histfile = os.path.join(os.path.expanduser("~"), ".python_history")

try:

readline.read_history_file(histfile)

# default history len is -1 (infinite), which may grow unruly

readline.set_history_length(1000)

except FileNotFoundError:

pass

atexit.register(readline.write_history_file, histfile)

‫ يتم تشغيل هذا الرمز تلقائيًا عند تشغيل‬Python ‫الوضع التفاعلي‬ ‫في‬ (‫تكوين‬ ‫ انظر‬Readline ).

‫ عن طريق إلحاق المحفوظات الجديدة فقط‬، ‫يحقق المثال التالي نفس الهدف ولكنه يدعم الجلسات التفاعلية المتزامنة‬.

import atexit

import os

import readline

histfile = os.path.join(os.path.expanduser("~"), ".python_history")

try:

readline.read_history_file(histfile)

h_len = readline.get_current_history_length()

except FileNotFoundError:

open(histfile, 'wb').close()

h_len = 0

def save(prev_h_len, histfile):

new_h_len = readline.get_current_history_length()

readline.set_history_length(1000)

readline.append_history_file(new_h_len - prev_h_len, histfile)

atexit.register(save, h_len, histfile)

‫يوسع المثال التالي‬ code.InteractiveConsole‫ استعادة المحفوظات‬/ ‫الفئة لدعم حفظ‬.

Pg. 336
import atexit

import code

import os

import readline

class HistoryConsole(code.InteractiveConsole):

def __init__(self, locals=None, filename="<console>",

histfile=os.path.expanduser("~/.console-history")):

code.InteractiveConsole.__init__(self, locals, filename)

self.init_history(histfile)

def init_history(self, histfile):

readline.parse_and_bind("tab: complete")

if hasattr(readline, "read_history_file"):

try:

readline.read_history_file(histfile)

except FileNotFoundError:

pass

atexit.register(self.save_history, histfile)

def save_history(self, histfile):

readline.set_history_length(1000)

readline.write_history_file(histfile)

rlcompleter- ‫ وظيفة اإلكمال لقراءة‬GNU 

‫كود المصدر‬: Lib / rlcompleter.py

‫و‬ rlcompleter‫حدة تعرف وظيفة االنتهاء مناسبة ل‬ readline‫وحدة من خالل استكمال معرفات بيثون صالحة والكلمات الرئيسية‬.

‫ عندما يتم استيراد هذه الوحدة على نظام أساسي‬Unix ‫مع‬ readline‫ يتم إنشاء مثيل‬، ‫توفر الوحدة النمطية‬ Completer ‫للفئة‬
‫تلقائيًا‬ complete()‫ويتم تعيين طريقتها‬ readline‫كمكمل‬.

‫مثال‬:

>>>

Pg. 337
‫‪>>> import rlcompleter‬‬

‫‪>>> import readline‬‬

‫)"‪>>> readline.parse_and_bind("tab: complete‬‬

‫>‪>>> readline. <TAB PRESSED‬‬

‫__‪readline.__doc‬‬ ‫(‪readline.get_line_buffer( readline.read_init_file‬‬

‫__‪readline.__file‬‬ ‫(‪readline.insert_text‬‬ ‫(‪readline.set_completer‬‬

‫__‪readline.__name‬‬ ‫(‪readline.parse_and_bind‬‬

‫‪>>> readline.‬‬

‫الخيار ‪ ،‬يتم استيراد الوحدة ‪ -S‬مع ‪ Python‬تم تصميم وحدة لالستخدام مع بايثون‪ ‬طريقة تفاعلية‪ . ‬ما لم يتم تشغيل‪ rlcompleter‬و‬
‫‪ Readline ).‬انظر‪ ‬تكوين( وتكوينها تلقائيًا‬

‫ال يزال من الممكن استخدام الفئة المحددة بواسطة هذه الوحدة لألغراض ‪ readline، Completer‬على األنظمة األساسية بدون‬
‫‪.‬المخصصة‬

‫‪ ‬استكمال الكائنات‬

‫‪:‬كائنات المكمل لها الطريقة التالية‬

‫‪ ) ‬نص‪ ، ‬حالة ‪Completer.complete( ‬‬

‫‪ .‬قم بإرجاع‪ ‬حالة‪ ‬اإلكمال‪ ‬للنص‬

‫‪ __main__، builtins‬إذا تم استدعاؤه‪ ‬للنص‪ ‬الذي ال يتضمن حرف نقطة (‪ ، )'.' ‬فسيتم إكماله من األسماء المحددة حاليًا في‬
‫‪).‬الوحدة النمطية‪ keyword‬كما هو محدد بواسطة( والكلمات الرئيسية‬

‫لن يتم تقييم الوظائف ‪ ،‬ولكن يمكنه إنشاء مكالمات ( إذا تم استدعاؤه السم منقط ‪ ،‬فسيحاول تقييم أي شيء بدون آثار جانبية واضحة‬
‫الوظيفة‪ .‬يتم ضبط أي استثناء يُثار أثناء تقييم )(‪ dir‬حتى الجزء األخير ‪ ،‬والعثور على مطابقات للباقي عبر ))(__‪ __getattr‬إلى‬
‫‪.‬وإعادته‪ None‬التعبير وإسكاته‬

‫‪ Binary Data Services‬خدمات البيانات الثنائية‪ ‬‬

‫توفر الوحدات الموصوفة في هذا الفصل بعض عمليات الخدمات األساسية‪ L‬لمعالجة البيانات الثنائية‪ .‬العمليات األخرى على البيانات‬
‫‪.‬الثنائية ‪ ،‬خاصة فيما يتعلق بتنسيقات الملفات وبروتوكوالت الشبكة ‪ ،‬موصوفة في األقسام ذات الصلة‬

‫على سبيل ( ‪ ASCII‬تعمل بعض المكتبات الموضحة ضمن‪ ‬خدمات‪ L‬معالجة النصوص‪ ‬أي ً‬


‫ضا إما مع التنسيقات الثنائية المتوافقة مع‬
‫‪ ، difflib).‬على سبيل المثال( أو جميع البيانات الثنائية )‪ ، re‬المثال‬

‫في أنواع‪ ‬التسلسل الثنائي ‪ -‬بايت ‪ ،‬بايت ‪ Python ،‬باإلضافة إلى ذلك ‪ ،‬راجع الوثائق الخاصة بأنواع البيانات الثنائية المضمنة في‬
‫‪ .‬عرض الذاكرة‬

‫‪Pg. 338‬‬

You might also like