Professional Documents
Culture Documents
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. تستخدم أوصاف التحليل المعجمي وبناء الجملة تدوي ًنا نحويًا معدالً لـ
تبدأ كل قاعدة باسم (وهو االسم الذي تحدده القاعدة) و .=:: شريط عمودي ( )| يستخدم لفصل البدائل ؛ إنه أقل عامل ملزم في هذا
الترميز .النجمة ( )* تعني صفرً ا أو أكثر من التكرار للعنصر السابق ؛ وبالمثل + ،تعني عالمة الجمع ( ) تكرارً ا واح ًدا أو أكثر ،
واحدا (بمعنى آخر ،العبارة المرفقة اختيارية) .و و[+*] ربطوالعبارة الموضوعة بين قوسين مربعين ( ) تعني صفرً ا أو تكرارً اً
المشغلين بإحكام قدر اإلمكان ؛ تستخدم األقواس للتجميع .يتم وضع السالسل الحرفية بين عالمتي اقتباس .الفضاء األبيض له معنى
فقط لفصل الرموز .عادة ما يتم احتواء القواعد في سطر واحد ؛ يمكن تنسيق القواعد مع العديد من البدائل بدالً من ذلك مع كل سطر
.بعد البداية األولى بشريط عمودي
في التعريفات المعجمية (كما في المثال أعاله) ،يتم استخدام اصطالحين إضافيين :حرفان حرفيان مفصوالن بثالث نقاط يعني
عبارة بين األقواس الزاوية ( )>...< تعطي وص ًفا غير 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
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
# vim: fileencoding=<encoding-name>
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.
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:
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.
Expressions in parentheses, square brackets or curly braces can be split over more than one physical
line without using backslashes. For example:
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.
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.
def perm(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
s = l[:i] + l[i+1:]
for x in p:
r.append(l[i:i+1] + x)
(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.)
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
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.
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*">
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:
2.3.2. Soft Keywords
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.
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
shortstringchar ::= <any source character except "\" or newline or the quote>
bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
shortbyteschar ::= <any ASCII character except "\" or newline or the quote>
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:
\\ Backslash (\)
Pg. 9
Escape Sequence Meaning Notes
Note
Escape Sequence Meaning
s
Notes:
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.
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.
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.
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:
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.
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:
replacement_field ::= "{" f_expression ["="] ["!" conversion] [":" format_spec] "}"
| yield_expression
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.
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.
>>>
>>> width = 10
>>> precision = 4
Pg. 12
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
>>> f"{today=:%B %d, %Y}" # using date format specifier and debugging
'0x400'
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:
Backslashes are not allowed in format expressions and will raise an error:
>>>
'newline: 10'
Pg. 13
Formatted string literals cannot be used as docstrings, even if they do not include expressions.
>>>
...
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
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.
Pg. 14
7 2147483647 0o177 0b100110111
100_000_000_000 0b_1110_0101
Changed in version 3.6: Underscores are now allowed for grouping purposes in literals.
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.
Changed in version 3.6: Underscores are now allowed for grouping purposes in literals.
2.4.7. Imaginary literals
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:
2.5. 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.
بواسطة كائنات أو من خالل العالقات بين 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نفس الكائن لكل من و).
أو لغات أخرى ،اعتما ًدا على Javaأو Cالمكتوبة بلغة( يمكن لوحدات االمتداد Python. فيما يلي قائمة باألنواع المضمنة في
أنوا ًع ا إلى التسلسل الهرمي للنوع (على سبيل المثال Python ،تحديد أنواع إضافية .قد تضيف اإلصدارات المستقبلية من )التطبيق
األرقام المنطقية ،المصفوفات المخزنة بكفاءة من األعداد الصحيحة ،وما إلى ذلك) ،على الرغم من أن هذه اإلضافات Lغالبًا ما يتم
.توفيرها عبر المكتبة القياسية بدالً من ذلك
تحتوي بعض أوصاف األنواع أدناه على فقرة تسرد "سمات Lخاصة" .هذه هي السمات التي توفر الوصول إلى التنفيذ وليست
.مخصصة لالستخدام العام .قد يتغير تعريفهم في المستقبل
ال أحد
يتم استخدامه None. هذا النوع له قيمة واحدة .يوجد كائن واحد بهذه القيمة .يتم الوصول إلى هذا الكائن من خالل االسم المضمن
للداللة على عدم وجود قيمة في العديد من المواقف ،على سبيل المثال ،يتم إرجاعها من وظائف ال تقوم بإرجاع أي شيء بشكل
.صريح .قيمة الحقيقة خاطئة
لم تنفذ
هذا النوع له قيمة واحدة .يوجد كائن واحد بهذه القيمة .يتم الوصول إلى هذا الكائن من خالل االسم
يجب أن ُت رجع الطرق الرقمية وطرق المقارنة الثرية هذه القيمة إذا لم يتم تنفيذ العملية للمعامالت NotImplemented. Lالمضمن
المتوفرة( .سيحاول المترجم بعد ذلك العملية المنعكسة ،أو بعض اإلجراءات االحتياطية األخرى ،اعتما ًدا على عامل التشغيل ).ال
.ينبغي تقييمها في سياق منطقي
تم إهمال التقييم في سياق منطقي .بينما يتم تقييمه حاليًا على أنه صحيح ،فإنه :NotImplemented تم التغيير في اإلصدار 3.9
Python.طرح إصدار في المستقبل من TypeErrorسيتم DeprecationWarning. سيصدر ملف
القطع الناقص
هذا النوع له قيمة واحدة .يوجد كائن واحد بهذه القيمة .يتم الوصول إلى هذا الكائن من خالل االسم الحرفي... أو
.قيمة الحقيقة صحيحة Ellipsis. المضمن
numbers.Number
يتم إنشاؤها بواسطة حرفية رقمية وإعادتها كنتائج بواسطة عوامل حسابية ووظائف حسابية مضمنة .الكائنات الرقمية غير قابلة
ً
ارتباطا وثي ًقا باألرقام الرياضية ،ولكنها تخضع لقيود التمثيل للتغيير ؛ بمجرد إنشاء قيمتها ال تتغير ً
أبدا .ترتبط أرقام بايثون بالطبع
.العددي في أجهزة الكمبيوتر
Pg. 17
:لها الخصائص التالية __str__()،و)(__ __reprتمثيالت السلسلة للفئات الرقمية ،محسوبة بواسطة
.إنها حرفية رقمية صالحة والتي ،عند تمريرها إلى مُنشئ الفئة الخاصة بها ،تنتج كائ ًنا له قيمة الرقم األصلي
.ال يتم عرض األصفار البادئة ،ربما باستثناء صفر واحد قبل الفاصلة العشرية
.ال يتم عرض األصفار الالحقة ،ربما باستثناء صفر واحد بعد فاصلة عشرية
:تميز بايثون بين األعداد الصحيحة وأرقام الفاصلة العائمة واألرقام المركبة
numbers.Integral
تمثل هذه األرقام في نطاق غير محدود ،رهنا بالذاكرة (االفتراضية) المتاحة فقط .لغرض عمليات اإلزاحة والقناع ،يُفترض التمثيل
.الثنائي ،ويتم تمثيل األرقام السالبة في متغير مكمل 2مما يعطي الوهم بسلسلة ال نهائية من بتات اإلشارة تمتد إلى اليسار
هي األشياء فقط منطقية .النوع المنطقي هو نوع فرعي من 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
متواليات ثابتة
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للتغيير (وبالتالي غير قابلة للتغيير) ،فإن مصفوفات البايت توفر بخالف ذلك نفس الواجهة والوظائف مثل
.ة للتغيير
تعيين األنواع
هذه تمثل مجموعات غير مرتبة ومحدودة من األشياء الفريدة وغير القابلة للتغيير .على هذا النحو ،ال يمكن فهرستها Lبأي خط
بإرجاع عدد العناصر في مجموعة .االستخدامات len() Lمنخفض .ومع ذلك ،يمكن تكرارها مرة أخرى ،وتقوم الوظيفة المضمنة
الشائعة للمجموعات هي اختبار العضوية السريع ،وإزالة التكرارات من تسلسل ،وحساب Lالعمليات الرياضية مثل التقاطع ،
.واالتحاد ،واالختالف ،واالختالف المتماثل
بالنسبة لعناصر المجموعة ،تنطبق نفس قواعد الثبات على مفاتيح القاموس .الحظ أن األنواع الرقمية تخضع للقواعد العادية للمقارنة
.الرقمية :إذا تم مقارنة رقمين بالتساوي (على سبيل المثال 1 ،و ، )1.0 فيمكن احتواء رقم واحد فقط في مجموعة
Pg. 19
مجموعات
add().المُنشئ المدمج ويمكن تعديلها بعد ذلك بعدة طرق ،مثل set() هذه تمثل مجموعة قابلة للتغيير .يتم إنشاؤها بواسطة
مجموعات مجمدة
غير قابل للتغيير وقابل للتجزئة frozenset ، المُنشئ المدمج . نظرً ا ألن)( frozensetهذه تمثل مجموعة ثابتة .تم إنشاؤها بواسطة
.فيمكن استخدامه مرة أخرى كعنصر في مجموعة أخرى ،أو كمفتاح قاموس
التعيينات
يحدد الترميز المنخفض العنصر ]. a[kتمثل هذه مجموعات محدودة من الكائنات المفهرسة بواسطة مجموعات فهرس عشوائية
ترجع الدالة )(. lenالعبارات del؛ يمكن استخدام هذا في التعبيرات وكهدف للتخصيصات أو aمن التعيين kالمفهرس بواسطة
.المضمنة عدد العناصر في التعيين
قواميس
تمثل هذه مجموعات محدودة من الكائنات المفهرسة بقيم عشوائية تقريبًا .األنواع الوحيدة من القيم غير المقبولة كمفاتيح هي القيم التي
تحتوي على قوائم أو قواميس أو أنواع أخرى قابلة للتغيير تتم مقارنتها بالقيمة بدالً من هوية الكائن ،والسبب هو أن التنفيذ الفعال
للقواميس يتطلب أن تظل قيمة تجزئة المفتاح ثابتة .تخضع األنواع الرقمية المستخدمة للمفاتيح للقواعد العادية للمقارنة الرقمية :إذا تم
.مقارنة رقمين بالتساوي (على سبيل المثال 1 ،و )1.0 فيمكن استخدامهما Lبالتبادل لفهرسة إدخال القاموس نفسه
تحتفظ القواميس بترتيب اإلدراج ،مما يعني أنه سيتم إنتاج المفاتيح بنفس ترتيب إضافتها بالتتابع على القاموس .ال يؤدي استبدال
.مفتاح موجود إلى تغيير الترتيب ،ولكن إزالة مفتاح وإعادة إدخاله سيضيفه إلى النهاية بدالً من االحتفاظ بمكانه القديم
تم CPython 3.6 ،قبل .3.6في Pythonتم التغيير في اإلصدار :3.7لم تحتفظ القواميس بترتيب اإلدراج في إصدارات
.االحتفاظ بأمر اإلدراج ،ولكن تم اعتباره تفاصيل تنفيذ في ذلك الوقت بدالً من ضمان اللغة
:السمات Lالخاصة
يصف المعنى
قابل
____doc .حالة عدم توفرها ؛ ال ترثها الفئات الفرعية Noneسلسلة وثائق الوظيفة ،أو في
للكتابة
قابل
____name .اسم الوظيفة
للكتابة
Pg. 20
يصف المعنى
قابل
____module .إذا لم تكن متاحة Noneاسم الوحدة التي تم تحديد الوظيفة فيها ،أو
للكتابة
مجموعة تحتوي على قيم وسيطة افتراضية لتلك الوسائط التي تحتوي على قيم قابل
____defaults
.إذا لم يكن هناك وسيطات لها قيمة افتراضية Noneافتراضية ،أو للكتابة
قابل
____code .كائن الكود الذي يمثل جسم الوظيفة المترجمة
للكتابة
مرجع إلى القاموس الذي يحتوي على المتغيرات العامة للدالة -مساحة Lاالسم يقرأ
____globals
.العامة للوحدة النمطية التي تم فيها تعريف الوظيفة فقط
قابل
____dict .مساحة Lاالسم التي تدعم سمات Lالوظيفة التعسفية
للكتابة
أو مجموعة خاليا تحتوي على روابط للمتغيرات الحرة للوظيفة .انظر None يقرأ
____closure
.السمة cell_contents أدناه للحصول على معلومات حول فقط
قابل
____kwdefaults .إمالء يحتوي على قيم افتراضية لمعلمات الكلمات الرئيسية فقط
للكتابة
ضا الحصول على السمات 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
وظائف مدمجة
هي وحدة 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
____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
____annotations
قاموس يحتوي على شروح متغيرة تم جمعها Lأثناء تنفيذ جسم الفصل .للحصول على أفضل ممارسات Lالعمل
.يرجى االطالع على أفضل ممارسات Lالتعليقات التوضيحية __annotations__،مع
حاالت الطبقة
يتم إنشاء مثيل فئة عن طريق استدعاء كائن فئة (انظر أعاله) .مثيل فئة له مساحة اسم مطبقة كقاموس وهو المكان األول الذي يتم
فيه البحث في مراجع السمات .عندما ال يتم العثور على سمة هناك ،وكان لفئة المثيل سمة بهذا االسم ،يستمر البحث بسمات
__ __selfالفئة .إذا تم العثور على سمة فئة هي كائن دالة مع ّر ف من قبل المستخدم ،يتم تحويلها إلى كائن أسلوب مثيل الذي تكون
ضا تحويل كائنات الطريقة الثابتة وطريقة الصنف ؛ انظر أعاله تحت "الفئات" .راجع قسم تنفيذالسمة الخاصة به هي المثيل .يتم أي ً
الواصفات لمعرفة طريقة أخرى قد تختلف فيها سمات Lالفصل المسترجع عبر مثيالته عن الكائنات المخزنة بالفعل في
.طريقة ،يتم استدعاؤها لتلبية البحث)(__ __getattrإذا لم يتم العثور على سمة للفئة ،وكان لفئة الكائن__dict__. الفصل
تقوم عمليات حذف وتخصيصات السمات Lبتحديث قاموس المثيل ،وليس قاموس الفصل مطل ًقا .إذا كانت الفئة تحتوي
.فسيتم استدعاؤها بدالً من تحديث قاموس المثيل مباشر ًة __delattr__()،أو)(__ __setattrعلى طريقة
يمكن أن تتظاهر مثيالت الفئة بأنها أرقام أو تسلسالت أو تعيينات إذا كانت لديها طرق بأسماء خاصة معينة .انظر قسم أسماء الطرق
.الخاصة
المدمج في وظيفة 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بيثون
إذا كان غير Noneهو سلسلة وثائق الوظيفة ،أو co_constsإذا كان كائن التعليمات البرمجية يمثل دالة ،فإن العنصر األول في
.معرف
كائنات اإلطار
.ويتم تمريرها أي ً
ضا إلى وظائف التتبع المسجلة ) ،انظر أدناه( tracebackتمثل كائنات اإلطار إطارات التنفيذ .قد تحدث في كائنات
إذا كان هذا هو إطار المكدس Noneهي إلطار المكدس السابق (باتجاه المتصل) ،أو: f_backسمات خاصة للقراءة فقط
هو القاموس المستخدم للبحث عن المتغيرات f_locals هو كائن الكود الذي يتم تنفيذه في هذا اإلطار ؛ f_codeالسفلي ؛
يعطي تعليمات دقيقة f_lastiيستخدم لألسماء المضمنة (الجوهرية) ؛ f_builtinsيستخدم للمتغيرات العالمية ؛ f_globalsالمحلية ؛
(.هذا فهرس في سلسلة بايت كود كائن التعليمات البرمجية)
فهي دالة يتم استدعاؤها ألحداث مختلفة أثناء تنفيذ التعليمات البرمجية None،إذا لم يكن األمر كذلك: f_traceسمات Lخاصة للكتابة
( f_trace_linesيستخدمها مصحح األخطاء) .عاد ًة ما يتم تشغيل حدث لكل سطر مصدر جديد -يمكن تعطيل هذا من خالل الضبط
False.على
Pg. 25
الحظ أن هذا قد يؤدي True. ل f_trace_opcodesتطبيقات قد تسمح األحداث لكل شفرة تشغيل إلى أن يطلب من خالل وضع
.إلى سلوك مترجم غير محدد إذا تهربت االستثناءات التي أثيرت بواسطة وظيفة التتبع من الوظيفة التي يتم تتبعها
هو رقم السطر الحالي لإلطار -الكتابة إلى هذا من داخل دالة التتبع تنتقل إلى السطر المحدد (فقط لإلطار السفلي) .يمكن f_lineno
ضا باسم( Jumpلمصحح األخطاء تنفيذ أمر f_lineno.عن طريق الكتابة إلى ) Set Next Statementالمعروف أي ً
)(frame.clear
ً
مولدا ،يتم االنتهاء تمسح هذه الطريقة جميع اإلشارات إلى المتغيرات المحلية التي يحتفظ بها اإلطار .أي ً
ضا ،إذا كان اإلطار يخص
من المولد .يساعد هذا في كسر الدورات المرجعية التي تتضمن كائنات اإلطار (على سبيل المثال عند اصطياد استثناء وتخزين التتبع
.الخاص به الستخدامه الح ًقا)
ضمنيًا عند حدوث استثناء ،ويمكن أيضً ا إنشاؤه بشكل 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بكائن اإلطار الخاص به إذا حدث االستثناء في
إذا لم يكن Noneهي المستوى التالي في تتبع المكدس( Lباتجاه اإلطار الذي حدث فيه االستثناء) ،أو: tb_nextسمة الكتابة الخاصة
تال
.هناك مستوى ٍ
ويمكن Python ، tb_nextبشكل صريح من كود Tracebackتم التغيير في اإلصدار :3.7يمكن اآلن إنشاء مثيل لكائنات
.تحديث سمة المثيالت الموجودة
.الوظيفة المضمنة)( sliceللطرق .يتم إنشاؤها أيضً ا بواسطةُ __getitem__() تستخدم كائنات الشرائح لتمثيل الشرائح
إذا تم حذفها None.هي قيمة الخطوة ؛ كل منها . stepهو الحد األعلى stopهي الحد األدنى ؛: startسمات خاصة للقراءة فقط
.يمكن أن يكون لهذه السمات أي نوع
) ذاتي ، طول slice.indices(
Pg. 26
تأخذ هذه الطريقة طول وسيطة عدد صحيح واحد وتحسب المعلومات حول الشريحة التي سيصفها كائن الشريحة إذا تم تطبيقها على
سلسلة من عناصر الطول . تقوم بإرجاع مجموعة مكونة من ثالثة أعداد صحيحة ؛ على التوالي وهذه هي البداية و توقف المؤشرات
.و خطوة أو خطوة طول شريحة .يتم التعامل مع الفهارس المفقودة أو الخارجة عن الحدود بطريقة تتفق مع الشرائح العادية
يمكن للفئة تنفيذ عمليات معينة يتم استدعاؤها بواسطة بناء جملة خاص (مثل العمليات الحسابية أو االشتراك والتقسيم إلى شرائح)
في التحميل الزائد للمشغل ، مما يسمح للفئات بتحديد سلوكها فيما 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.
هي طريقة ثابتة (ذات غالف خاص لذلك ال تحتاج إلى التصريح عنها على )(__ cls . __newتم استدعاؤه إلنشاء مثيل جديد للفئة
هذا النحو) تأخذ الفئة التي تم طلب مثيل لها كوسيطة أولى لها .الوسيطات المتبقية هي تلك التي تم تمريرها إلى تعبير مُنشئ الكائن
cls ).عاد ًة مثيل( يجب أن تكون قيمة اإلرجاع هي مثيل الكائن الجديد)(__(. __newاستدعاء الفئة)
ً
جديدا للفئة عن طريق استدعاء طريقة الطبقة الفائقة باستخدام الوسيطات المناسبة ثم )(__ُ __newتنشئ التطبيقات النموذجية مثياًل
ً
)].super().__new__(cls[, ...تعديل المثيل الذي تم إنشاؤه حديثا حسب الضرورة قبل إعادته
فسيتم استدعاء طريقة المثيل الجديد مثل ، حيث )(__ cls ، __initتم استدعاءه أثناء بناء الكائن وأعاد مثياًل لـ)(__ __newإذا
)].__init__(self[, ...هي المثيل الجديد والوسيطات المتبقية هي نفسها التي تم تمريرها إلى مُنشئ الكائن self تكون
لتخصيص ) tupleأو strأو intمثل( الغرض األساسي منه هو السماح للفئات الفرعية لألنواع غير القابلة للتغيير)(____new
.إنشاء المثيل .يتم أيضً ا تجاوزه بشكل شائع في الفئات الوصفية المخصصة من أجل تخصيص إنشاء الفصل
Pg. 27
ولكن قبل إعادته إلى المتصل .الوسيطات هي تلك التي تم تمريرها إلى __new__()) ،بواسطة( يتم استدعاؤه بعد إنشاء المثيل
إن وجدت ،يجب أن __init__()،طريقة ،فإن طريقة الفئة المشتقة __init__() تعبير مُنشئ الفئة .إذا كان للفئة األساسية
ً
صراحة لضمان التهيئة الصحيحة لجزء الفئة األساسية من المثيل ؛ على سبيل المثال : super().__init__([args...]).تستدعيها
) ذاتي 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.__bytes__(
، format_spec ) ذاتي object.__format__(
األسلوب ،إلنتاج "تنسيق" تمثيل )( str.formatالمدمج في وظيفة ،وبالتبعية ،وتقييم سلسلة حرفية تنسيق و)( formatودعا من قبل
الحجة هي سلسلة تحتوي على وصف لخيارات التنسيق المطلوب .يرجع format_spec سلسلة كائن .و
إال أن معظم الفئات إما ستفوض التنسيق إلى أحد __format__()،إلى النوع الذي يتم تطبيقه format_spec تفسير وسيطة
.األنواع المضمنة ،أو تستخدم بنية خيار تنسيق مماثلة
.راجع اللغة المصغرة لمواصفات التنسيق للحصول على وصف لبناء جملة التنسيق القياسي
تمرير أي سلسلة غير TypeError ifبحد ذاتها برفع سلسلة __format__ objectتم التغيير في اإلصدار :3.4تقوم طريقة
.فارغة
) النفس ، اآلخر 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):
ملحوظة
عاد ًة ما يكون 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احتاج الفصل الذي يتخطى إلى االحتفاظ بالتنفيذ)(__ __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.أنظر أيضا
) ذاتي object.__bool__(
عندما ال يتم تعريف هذه True. أو False؛ يجب أن يعود)( boolدعا إلى تنفيذ اختبار قيمة الحقيقة والعملية المدمجةL
يتم استدعاؤها ،إذا تم تعريفها ،ويعتبر الكائن صحيحً ا إذا كانت نتيجته غير صفرية .إذا لم تحدد الفئة )(__ ، __lenالطريقة
.فإن جميع مثيالتها تعتبر صحيحة __bool__()،وال)(__ __lenال
.لمثيالت الفئة ) 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المثال
) النفس ، االسم object.__delattr__(
.del obj.nameولكن لحذف السمة بدالً من التنازل .يجب تنفيذ هذا فقط إذا كان له معنى بالنسبة للكائن)(__ __setattrمثل
) ذاتي object.__dir__(
.يحول التسلسل المرتجع إلى قائمة ويفرزها)(. dirيتم استدعاؤها على الكائن .يجب إرجاع التسلسل)( dirيتم استدعاؤها عندما
ظيفة على __ __getattrيمكن أن تستخدم أيضا لتخصيص الوصول إلى سمات Lالوحدة .و__ __dirو__ __getattrأسماء خاصة
إذا لم يتم العثور على AttributeError. مستوى الوحدة ،ينبغي قبول وسيطة واحدة وهو اسم سمة وإرجاع القيمة المحسوبة أو تثير
يتم البحث في __ __getattrثم object.__getattribute__()،السمة على كائن وحدة من خالل البحث العادي ،أي
.إذا تم العثور عليها ،يتم استدعاؤها باسم السمة ويتم إرجاع النتيجة AttributeError. قبل رفع أحد__ __dictوحدة
ظيفة يجب أن يقبل بدون وسائط ،وتعود سلسلة من السالسل التي تمثل أسماء الوصول إليها على حدة .في حالة __ __dirو
.البحث القياسي في الوحدة النمطية)( dirوجودها ،تتجاوز هذه الوظيفة
سمة كائن __ __classللحصول على تخصيص أكثر دقة لسلوك الوحدة (سمات اإلعداد ،الخصائص ،إلخ) ،يمكن للمرء تعيين
:على سبيل المثال types.ModuleType. الوحدة النمطية إلى فئة فرعية من
import sys
class VerboseModule(ModuleType):
def __repr__(self):
)'print(f'Setting {attr}...
)super().__setattr__(attr, value
sys.modules[__name__].__class__ = VerboseModule
ملحوظة
Pg. 32
إال على عمليات البحث التي يتم إجراؤها باستخدام بناء __ __classاإلعداد__ __getattrال يؤثر تحديد الوحدة النمطية ووحدة
سواء عن طريق رمز داخل الوحدة ( جملة الوصول إلى السمة -وال يتأثر الوصول المباشر إلى وحدات الكرة األرضية للوحدة
).للوحدة النمطية globalsالنمطية ،أو عبر مرجع إلى قاموس
أنظر أيضا
تنفيذ3.3.2.2.
تنطبق الطرق التالية فقط عند ظهور مثيل من الفئة التي تحتوي على الطريقة (ما يسمى بفئة واصف ) في فئة المالك( يجب أن يكون
الواصف إما في قاموس فئة المالك أو في قاموس الفصل ألحد الوالدين) .في األمثلة أدناه ،تشير "السمة" إلى السمة التي يكون اسمهاL
__dict__.هو مفتاح الخاصية في فئة المالك
تم استدعاؤها للحصول على سمة فئة المالك (وصول سمة الفئة) أو مثيل من تلك الفئة (الوصول إلى سمة
عندما يتم Noneالمثيل) .وسيطة المالك االختيارية هي فئة المالك ،بينما المثيل هو المثيل الذي تم الوصول إلى السمة من خالله ،أو
.الوصول إلى السمة من خالل المالك
) ذاتي ، مثال ، قيمة object.__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).الدعوة أبسط وأقل شيوعا عند استدعاء رمز المستخدم مباشرة طريقة اصف
ربط المثيل
فئة ملزمة
سوبر ملزم
على سبيل المثال ،االرتباطات ،تعتمد أسبقية استدعاء الواصف على طرق التوصيف المحددة .واصف يمكن أن تحدد أي مزيج
فسيؤدي الوصول إلى السمة إلى إرجاع كائن __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__ للمتغيرات المعلنة وتمنع اإلنشاء التلقائي لـ
.سوف سمة من الحاالت تكون في متناول دائما __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__ . يمكن تعيين أي قابل للتكرار بدون سلسلة إلى
.يتم تعيين معنى خاص للقيم المقابلة لكل مفتاح
يمكن استخدام الوراثة المتعددة مع فئات رئيسية متعددة ذات فترات زمنية محددة ،ولكن يُسمح ألحد الوالدين فقط بامتالك
سمات Lتم إنشاؤها بواسطة الفتحات (يجب أن تحتوي القواعد األخرى على تخطيطات خانات فارغة) -رفع
TypeError.االنتهاكاتL
إذا تم استخدام مكرر لـ__ الفواصل الزمنية__ ،فسيتم إنشاء واصف لكل من قيم المكرر . ومع ذلك ،
.ستكون مكررً ا فار ًغا __slots__ فإن السمة
في تلك الفئة .بهذه الطريقة ،من الممكن كتابة الفئات التي تغير __init_subclass__ عندما ترث فئة من فئة أخرى ،يتم استدعاء
ً
ارتباطا وثي ًق ا بمصممي الفصل ،ولكن حيث يؤثر مصممي الفصل فقط على الفئة المحددة التي سلوك الفئات الفرعية .يرتبط هذا
.تطبيقهم عليها ، ينطبق فقط على الفئات الفرعية المستقبلية للفئة التي تحدد الطريقة__ __init_subclassيتم
object.__init_subclass__( cls ) طريقة الفصل
هي الفئة الفرعية الجديدة .إذا تم تعريفها على أنها cls يتم استدعاء هذه الطريقة كلما تم تصنيف الفئة الحاوية إلى فئة فرعية .ثم
.طريقة مثيل عادية ،يتم تحويل هذه الطريقة ضمنيًا إلى طريقة فئة
للتوافق مع الفئات األخرى __init_subclass__. يتم تمرير وسيطات الكلمات الرئيسية التي يتم منحها لفئة جديدة إلى فئة األصل
يجب على المرء أن يأخذ وسيطات الكلمات الرئيسية المطلوبة ويمرر األخرى إلى الفئة األساسية __init_subclass__، ،باستخدام
:كما في
class Philosopher:
)super().__init_subclass__(**kwargs
cls.default_name = default_name
pass
ال يؤدي التطبيق االفتراضي إلى أي شيء ،ولكنه يتسبب في حدوث خطأ إذا تم استدعاؤه مع أي __object.__init_subclass
.وسيطات
Pg. 35
ملحوظة
التطبيقات .يمكن __ __init_subclassبواسطة بقية آالت النوع ،وال يتم تمريره إلى metaclass يتم استهالك تلميحmetaclass
type(cls).الفعلي (بدالً من التلميح الصريح) كـ metaclassالوصول إلى
)(__ __set_nameيمسح متغيرات الفئة ويجعل عمليات االسترجاعات لمن لديهم)(__ ، type.__newعندما يتم إنشاء فئة
.خطاف
) ذاتي ، مالك ، اسم object.__set_name__(
class A:
يمكن )(__ ، __set_nameفلن يتم استدعاؤها تلقائيًا .إذا لزم األمر)(__ ، __set_nameإذا تم تعيين متغير الفئة بعد إنشاء Lالفئة
:االتصال مباشرة
class A:
pass
)(c = C
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 حل إدخاالت3.3.3.2.
البحث عن طريقة عليها .إذا تم __ __mro_entriesفسيتم type،إذا كانت القاعدة التي تظهر في تعريف الفئة ليست مثيالً لـ
العثور عليها ،يتم استدعاؤها مع مجموعة القواعد األصلية .يجب أن ُت رجع هذه الطريقة مجموعة من الفئات التي سيتم استخدامها
.فارغا ،وفي مثل هذه الحالة يتم تجاهل القاعدة األصلية tupleبدالً من هذه القاعدة .قد يكون
ً
أنظر أيضا
استخدام ذلك ؛)( typeصريح ،فسيتم metaclassإذا لم يتم إعطاء قواعد وال يوجد
metaclass.ثم يتم استخدامه مباشرة كما type()،صريح وأنه ال مثيل metaclassإذا تم إعطاء
.األكثر اشتقا ًقا metaclassصريح ،أو تم تعريف القواعد ،فسيتم استخدام metaclassتم إعطاء مثيل لـ كـ)( typeإذا
لجميع الفئات )) type(clsأي( المحدد بوضوح (إن وجد) والفئات الوصفية metaclassاألكثر اشتقا ًقا من metaclassيتم تحديد
مشتق هو نوع فرعي من كل هذه الفئات الوصفية المرشحة .إذا لم تستوف أي من الفئات metaclassاألساسية المحددة .أكثر
TypeError.الوصفية المرشحة هذا المعيار ،فسيفشل تعريف الفئة مع
سمة ،فسيتم اس__ __prepareيحتوي على metaclassالمناسب ،يتم إعداد مساحة اسم الفئة .إذا كان metaclassبمجرد تحديد
تدعاؤه كـ( حيث تأتي وسيطات الكلمات Lاألساسية اإلضافية ،إن وجدت ،من تعريف الفئة) .و ينبغي تنفيذ طريقة باعتباره . يتم
تمرير مساحة االسم التي تم إرجاعها إلى ، ولكن عند إنشاء كائن الفئة النهائية ،يتم نسخ مساحة Lاالسم إلى
.namespace = metaclass.__prepare__(name, bases, **kwds)__prepare__classmethod()__preparجديد
e____new__dict
.سمة ،فسيتم تهيئة مساحة اسم الفئة كتعيين مرتب فارغ__ __prepareال يحتوي على أي metaclassإذا كان
أنظر أيضا
Pg. 37
يتم تنفيذ جسم الفصل (تقريبًا) بتنسيق . االختالف الرئيسي من االستدعاء العادي هو أن النطاق المعجمي يسمح لجسم الفصل (بما في
ذلك أي طرق) لإلشارة إلى األسماء Lمن النطاقين الحالي والخارجي عندما يحدث تعريف الفئة داخل
)(.exec(body, globals(), namespace)execدالة
ومع ذلك ،حتى عندما يحدث تعريف الفئة داخل الوظيفة ،فإن الطرق المحددة داخل الفئة ال تزال غير قادرة على رؤية األسماء
__ __classالمعرفة في نطاق الفئة .يجب الوصول إلى متغيرات الفئة من خالل المعلمة األولى لطرق المثيل أو الفئة ،أو من خالل
.المرجع المعجمي الضمني الموضح في القسم التالي
بمجرد ملء مساحة 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حتى تتم تهيئة الفصل بشكل صحيح .سيؤدي عدم القيام بذلك إلى إصدار
طريقة ؛)(__ __set_nameيجمع هذا األسلوب كل السمات Lالموجودة في مساحة اسم الفئة التي تحدد__1. type.__new
يتم استدعاء هذه الطرق مع تعريف الفئة واالسم المخصص لتلك السمة المعينة ؛__2. __set_name
.يسمى هوك على األصل الفوري للفئة جديدة من أجل طريقة قرارها)(__ __init_subclassو 3.
بعد إنشاء كائن الفئة ،يتم تمريره إلى مصممي الفئة المضمنين في تعريف الفئة (إن وجد) ويتم ربط الكائن الناتج في مساحة Lاالسم
.المحلية كفئة محددة
يتم نسخ الكائن المقدم كمعامل مساحة االسم إلى تعيين مرتب جديد ويتم type.__new__،عندما يتم إنشاء فئة جديدة بواسطة
.سمة لكائن الفئة__ __dictتجاهل الكائن األصلي .يتم تغليف النسخة الجديدة في وكيل للقراءة فقط ،والذي يصبح
أنظر أيضا
مرجع اإلغالق الضمني__ __classيصف
استخدامات الفوقية3.3.3.7.
االستخدامات المحتملة للفئات الوصفية ال حدود لها .تتضمن بعض األفكار التي تم استكشافها Lالتعداد ،والتسجيل ،والتحقق من
.الواجهة ،والتفويض التلقائي ،وإنشاء الخاصية التلقائي ،والوكالء ،واألطر ،والقفل /المزامنة التلقائية للموارد
كـ "فئات ) (ABCهذه الطرق للسماح بإضافة أصناف قاعدة مجردة metaclass abc.ABCMetaعلى وجه الخصوص ،يطبق
.أساسية افتراضية" إلى أي فئة أو نوع (بما في ذلك األنواع المضمنة) ،بما في ذلك أبجديات أخرى
) ذاتي ، مثال class.__instancecheck__(
Pg. 38
إرجاع صحيح إذا كان يجب اعتبار المثيل مثياًل (مباشرً ا أو غير مباشر) للفئة . إذا تم تعريفه ،فإنه يستدعي
) .isinstance(instance, classالتنفيذ
إرجاع صحيح إذا كان يجب اعتبار الفئة الفرعية فئة فرعية( مباشرة أو غير مباشرة) من الفئة . إذا تم تعريفه ،فإنه يستدعي
) .issubclass(subclass, classالتنفيذ
فئة .ال يمكن تعريفها كطرق للفصل في الفصل الفعلي .هذا يتوافق مع ) (metaclassالحظ أنه يتم البحث عن هذه الطرق في نوع
.البحث عن العمليات الخاصة التي يتم استدعاؤها في الحاالت ،فقط في هذه الحالة يكون المثيل بحد ذاته فئة
أنظر أيضا
عن طريق تحديد طريقة )]List[intعلى سبيل المثال( PEP 484 يمكن للمرء تنفيذ بناء جملة الفئة العامة كما هو محدد بواسطة
:خاصة
.قم بإرجاع كائن يمثل تخصص فئة عامة حسب وسيطات النوع الموجودة في المفتاح
يتم البحث عن هذه الطريقة في كائن الفئة نفسه ،وعند تعريفها في جسم الفئة ،تكون هذه الطريقة ضمنيًا طريقة فئة .مالحظة ،هذه
.اآللية محجوزة بشكل أساسي لالستخدام مع تلميحات Lالكتابة الثابتة ،وال ينصح باستخدامات أخرى
أنظر أيضا
يتم استدعاؤه عند "استدعاء" المثيل كوظيفة ؛ إذا تم تعريف هذه الطريقة ،يتم ترجمتها تقريبًا
) .x(arg1, arg2, ...)type(x).__call__(x, arg1, ...إلى
يمكن تعريف الطرق التالية لتنفيذ كائنات الحاوية .عاد ًة ما تكون الحاويات عبارة عن تسلسالت (مثل القوائم أو المجموعات) أو
تعيينات (مثل القواميس) ،ولكنها يمكن أن تمثل حاويات أخرى أيضًاُ .تستخدم المجموعة األولى من الطرق إما لمحاكاة تسلسل أو
هو 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لو
a[1:2] = b
يترجم إلى
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__(
) ذاتي 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__(
) النفس ، اآلخر object.__lshift__(
) النفس ، اآلخر object.__rshift__(
) النفس ، اآلخر object.__and__(
) النفس ، اآلخر object.__xor__(
) النفس ، اآلخر object.__or__(
NotImplemented.إذا كانت إحدى هذه الطرق ال تدعم العملية مع الوسائط المقدمة ،فيجب أن تعود
) النفس ، اآلخر object.__radd__(
) النفس ، اآلخر object.__rsub__(
) النفس ، اآلخر object.__rmul__(
) النفس ، اآلخر object.__rmatmul__(
) النفس ، اآلخر object.__rtruediv__(
) النفس ، اآلخر object.__rfloordiv__(
) النفس ، اآلخر object.__rmod__(
) النفس ، اآلخر object.__rdivmod__(
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حالة إرجاع
ملحوظة
إذا كان نوع المعامل األيمن فئة فرعية من نوع المعامل األيسر وتوفر تلك الفئة الفرعية تطبي ًقا مختل ًفا للطريقة المنعكسة Lللعملية ،
.فسيتم استدعاء هذه الطريقة قبل طريقة المعامل األيسر غير المنعكسة .يسمح هذا السلوك للفئات الفرعية بتجاوز عمليات أسالفهمL
) النفس ، اآلخر object.__iadd__(
) النفس ، اآلخر object.__isub__(
) النفس ، اآلخر object.__imul__(
) النفس ، اآلخر object.__imatmul__(
) النفس ، اآلخر object.__itruediv__(
) النفس ، اآلخر object.__ifloordiv__(
) النفس ، اآلخر object.__imod__(
) النفس ، اآلخر object.__ilshift__(
) النفس ، اآلخر object.__irshift__(
) النفس ، اآلخر object.__iand__(
) النفس ، اآلخر object.__ixor__(
) النفس ، اآلخر object.__ior__(
) ذاتي object.__neg__(
Pg. 43
) ذاتي object.__pos__(
) ذاتي object.__abs__(
) ذاتي object.__invert__(
) ذاتي object.__complex__(
) ذاتي object.__int__(
) ذاتي object.__float__(
) ذاتي object.__index__(
كما هو الحال في ( الكائن الرقمية لكائن صحيح losslesslyوكلما بيثون يحتاج إلى تحويل operator.index()،ودعا إلى تنفيذ
يشير وجود هذه الطريقة إلى أن الكائن الرقمي هو نوع عدد صحيح .يجب). ظائف oct() و)( bin()، hexتشريح ،أو في المدمج في
.إرجاع عدد صحيح
) ذاتي object.__trunc__(
) ذاتي object.__floor__(
) ذاتي object.__ceil__(
البيان .يتعامل مدير السياق مع اإلدخال والخروج withمدير السياق هو كائن الذي يحدد السياق وقت التشغيل التي ستنشأ عند تنفيذA
( العبارة withمن سياق وقت التشغيل المطلوب لتنفيذ كتلة التعليمات البرمجية .عاد ًة ما يتم استدعاء مديري السياق باستخدام
ضا استخدامها عن طريق استدعاء أساليبهم مباشرة The with statement ) ،الموصوفة في القسم .ولكن يمكن أي ً
تشمل االستخدامات النموذجية لمديري السياق حفظ واستعادة أنواع مختلفة من الحالة العالمية ،وتأمين الموارد وإلغاء قفلها ،وإغالق
.الملفات المفتوحة ،وما إلى ذلك
) ذاتي object.__enter__(
asسوف بيان ربط قيمة هذه الطريقة في العودة إلى الهدف (ق) المحددة في withأدخل سياق وقت التشغيل المرتبط بهذا الكائن .و
.الفقرة من البيان ،إن وجدت
object.__exit__( self ، exc_type ، exc_value ، traceback )
قم بإنهاء سياق وقت التشغيل المرتبط بهذا الكائن .تصف المعلمات Lاالستثناء الذي تسبب في إنهاء السياق .إذا تم الخروج من السياق
None.دون استثناء ،فستكون جميع الوسائط الثالثة
Pg. 44
إذا تم توفير استثناء ،ورغبت الطريقة في منع االستثناء (أي منعه من االنتشار) ،فيجب أن ترجع قيمة حقيقية .خالف ذلك ،ستتم
.معالجة االستثناء بشكل طبيعي عند الخروج من هذه الطريقة
.األساليب ال يجب أن تعيد إنشاء االستثناء الذي تم تمريره ؛ هذه هي مسؤولية المتصل)(__ __exitالحظ أن
أنظر أيضا
عند استخدام اسم فئة في نمط ما ،ال يُسمح بالمتغيرات الموضعية في النمط افتراضيًا ،أي عادة ما تكون غير صالحة بدون دعم
خاص في النموذج . لتتمكن من استخدام هذا النوع من األنماط ،يحتاج الفصل إلى
__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
.بيان بايثون matchمواصفات
بالنسبة للفئات المخصصة ،فإن االستدعاءات الضمنية للطرق الخاصة مضمونة فقط للعمل بشكل صحيح إذا تم تحديدها على نوع
:كائن ،وليس في قاموس مثيل الكائن .هذا السلوك هو سبب قيام الشفرة التالية بإثارة استثناء
>>>
... pass
...
)(>>> c = C
)>>> len(c
Pg. 45
يتم تنفيذ ذلك من خالل )(__ __reprو)(__ __hashاألساس المنطقي وراء هذه األكاذيب السلوك مع عدد من الطرق الخاصة مثل
كافة Lالكائنات ،بما في ذلك كائنات النوع .إذا استخدم البحث الضمني لهذه الطرق عملية البحث التقليدية ،فإنها ستفشل عند استدعائها
:في كائن النوع نفسه
>>>
True
يُشار أحيا ًن ا إلى المحاولة غير الصحيحة الستدعاء طريقة غير منضمة لفئة بهذه الطريقة باسم `` ارتباك الطبقة الفوقية '' ،ويتم
:تجنبها عن طريق تجاوز المثيل عند البحث عن طرق خاصة
>>>
True
True
باإلضافة إلى تجاوز أي سمات Lمثيل من أجل الصحة ،فإن البحث الضمني الخاص بطريقة عامة يتخطى
:الطريقة حتى الخاصة بالفئة الوصفية للكائن)(__ __getattributeأيضًا
>>>
...
...
)(>>> c = C
Pg. 46
)(__>>> c.__len # Explicit lookup via instance
10
10
10
اآللية بهذه الطريقة مجااًل كبيرً ا لتحسينات السرعة داخل المترجم الفوري ،على حساب بعض )(__ __getattributeيوفر تجاوز
المرونة في التعامل مع األساليب الخاصة ( يجب تعيين الطريقة الخاصة على كائن الفئة نفسه حتى يتم استدعاؤها باستمرار من قبل
.المترجم الفوري)
3.4. Coroutines
كائنات منتظرة3.4.1.
ملحوظة
) ذاتي object.__await__(
تنفذ هذه الطريقة لتكون ، asyncio.Futureيجب إرجاع مكرر . يجب أن تستخدم لتنفيذ األشياء المنتظرة . على سبيل المثال
.التعبير awaitمتوافقة مع
أنظر أيضا
Coroutine كائنات3.4.2.
أيضً ا على الطرق المدرجة أدناه ،والتي تشبه تلك الخاصة بالمولدات (انظر طرق المولد التكراري .) ومع Coroutinesتحتوي
.التكرار بشكل مباشر coroutinesذلك ،على عكس المولدات ،ال تدعم
Pg. 47
) القيمة coroutine.send(
إذا لم __await__(). وهذا هو ما يعادل دفع مكرر إرجاعها من قبل None،إذا القيمة هي coroutine. بدء أو استئناف تنفيذ
قيمة ( النتيجة coroutine. طريقة المكرر التي تسببت في تعليق)( sendفإن هذه الطريقة تفوض إلى None،تكن القيمة كذلك
.قيمة اإلرجاع ،الموصوفة أعاله)(__ __awaitهي نفسها عند التكرار على )أو استثناء آخر StopIteration،اإلرجاع
إذا كان coroutine ،طريقة المكرر التي تسببت في توقف)( throwتفوض هذه الطريقة coroutine. يرفع االستثناء المحدد في
)أو استثناء آخر StopIteration،قيمة اإلرجاع( لديها مثل هذه الطريقة .خالف ذلك ،يتم رفع االستثناء عند نقطة التعليق .النتيجة
فإنه coroutine ،قيمة اإلرجاع ،الموصوفة أعاله .إذا لم يتم اكتشاف االستثناء في)(__ __awaitهي نفسها عند التكرار على
.ينتشر مرة أخرى إلى المتصل
)(coroutine.close
طريقة المكرر close() فإن هذه الطريقة تفوض أوالً إلى coroutine ،يتسبب الكوروتين في تنظيف نفسه والخروج .إذا تم تعليق
عند نقطة التعليق ،مما يجعل GeneratorExitإذا كان لديها مثل هذه الطريقة .ثم يرتفع coroutine ،التي تسببت في توقف
.على أنه انتهى من التنفيذ ،حتى لو لم يبدأ مطل ًقا coroutineالكوروتين ينظف نفسه على الفور .أخيرً ا ،تم وضع عالمة على
.تلقائيًا باستخدام العملية المذكورة أعاله عندما تكون على وشك التدمير Coroutineيتم إغالق كائنات
) ذاتي object.__aiter__(
) ذاتي object.__anext__(
.خطأ عند انتهاء التكرار StopAsyncIterationيجب أن ُترجع قيمة منتظرة تؤدي إلى قيمة تالية للمكرر . يجب أن يظهر
class Reader:
...
def __aiter__(self):
return self
raise StopAsyncIteration
return val
Pg. 48
.الجديد في اإلصدار 3.5
الممكن أن يعيد أمرً ا منتظرً ا من شأنه أن يحل __ __aiterكان من Python 3.7 ،تم التغيير في اإلصدار :3.7قبل استخدام
.إلى مكرر غير متزامن
.خطأ TypeErrorيجب إرجاع كائن مكرر غير متزامن .إرجاع أي شيء آخر سينتج عنه__ Python 3.7 ، __aiterبدءًا من
.األساليب__ __aexitو__ __aenterو مدير سياق غير متزامن هو مدير السياق أن يكون قادرا على وقف إعدام في تقريرها
) ذاتي object.__aenter__(
object.__aexit__( self ، exc_type ، exc_value ، traceback )
class AsyncContextManager:
الحواشي
1
ومن غير الممكن في بعض الحاالت لتغيير نوع الكائن ،في ظل ظروف خاضعة للرقابة معينة .على الرغم من أنها ليست فكرة جيدة
.بشكل عام ،حيث يمكن أن تؤدي إلى سلوك غريب للغاية إذا تم التعامل معها بشكل غير صحيح
2
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
؛ إنها تفاصيل تنفيذ بدقة .يجب على المستخدمين __ __builtinsيجب على المستخدمين عدم لمس CPython: تفاصيل تنفيذ
.الوحدة النمطية وتعديل سماتها Lبشكل مناسب builtinsLعلى importالراغبين في تجاوز القيم في مساحة Lاالسم المبنية
في __ __builtinsتم العثور بالفعل على مساحة Lاالسم المبنية المرتبطة بتنفيذ كتلة التعليمات البرمجية من خالل البحث عن االسم
مساحة االسم العالمية الخاصة به ؛ يجب أن يكون هذا قامو ًس ا أو وحدة نمطية (في الحالة األخيرة يتم استخدام قاموس الوحدة) .بشكل
؛ عندما يكون في builtinsهي الوحدة النمطية المدمجة__ ، __builtinsالوحدة النمطية__ __mainافتراضي ،عندما تكون في
.الوحدة نفسها builtinsهو اسم مستعار لقاموس__ ، __builtinsأي وحدة أخرى
:يحدث تحليل االسم للمتغيرات المجانية في وقت التشغيل ،وليس في وقت الترجمة .هذا يعني أن الكود التالي سيطبع 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. رسائل االستثناء ليست جزءًا من
.إنذار وال ينبغي االعتماد عليها بواسطة الكود الذي سيعمل تحت إصدارات متعددة من المترجم
¶ نظام االستيراد5.
البيان هو الطريقة importفي وحدة واحدة الوصول إلى الكود في وحدة أخرى من خالل عملية استيراده . و Pythonيكتسب كود
األكثر شيوعا الستدعاء استيراد اآلالت ،ولكنها ليست الطريقة الوحيدة .يمكن أيضً ا استخدام وظائف مثل
.الستدعاء آالت االستيراد)(__ __importمدمجة)( importlib.import_moduleووظائف
بيان يجمع بين اثنين من العمليات؛ يبحث عن الوحدة النمطية المسماة ،ثم يقوم بربط نتائج هذا البحث باسم في النطاق importفي
للوظيفة ،مع الوسيطات )(__ __importيتم تعريف عملية البحث الخاصة بالبيان على أنها استدعاء. importالمحلي
البيان للحصول على importراجع import. يتم استخدام قيمة اإلرجاع ألداء عملية ربط االسم للعبارة)(__. __importالمناسبة
.التفاصيل الدقيقة لعملية ربط االسم هذه
بحث الوحدة فقط ،وإذا وجدت ،عملية إنشاء Lالوحدة .بينما قد تحدث بعض اآلثار الجانبية __import__()،استدعاء مباشر إلجراء
البيان فقط ينفذ importفإن sys.modules) ،بما في ذلك( مثل استيراد الحزم األصلية ،وتحديث ذاكرات التخزين المؤقت المختلفة
.عملية ربط االسم
عن الوحدة النمطية وإذا وجدت ،فإنها تنشئ كائن وحدة نمطية 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
Namespace حزم5.2.2.
تعد حزمة مساحة االسم مركبًا من أجزاء مختلفة ، حيث يساهم كل جزء بحزمة فرعية في الحزمة الرئيسية .قد تتواجد األجزاء في
ض ا العثور على األجزاء في ملفات مضغوطة أو على الشبكة أو في أي مكان آخر تبحث فيهمواقع مختلفة على نظام الملفات .يمكن أي ً
Pg. 53
مباشرة مع الكائنات الموجودة في نظام الملفات وقد ال تتوافق معها ؛ قد Namespaceأثناء االستيراد .قد تتوافق حزم Python
.تكون وحدات افتراضية ليس لها تمثيل ملموس
صا يقوم تلقائيًا __path__ قائمة عادية Namespaceال تستخدم حزم لسماتها .بدالً من ذلك ،يستخدمون نوعً ا متكررً ا مخص ً
sys.pathأو( بإجراء بحث جديد عن أجزاء الحزمة في محاولة االستيراد التالية داخل تلك الحزمة إذا تغير مسار الحزمة األصلية
).لحزمة المستوى األعلى
العثور على أدلة متعددة أثناء بحث parentملف .في الواقع ،قد يتم parent/__init__.pyمع حزم مساحة االسم ،ال يوجد
قد ال يكون موجو ًدا فعليًا parent/oneاالستيراد ،حيث يتم توفير كل منها بواسطة جزء مختلف .وبالتالي
عندما يتم استيرادها أو parentحزمة مساحة اسم لحزمة المستوى األعلى Pythonفي هذه الحالة ،ستنشئ parent/two. بجوار
.إحدى حزمها الفرعية
5.3. Searching
إلى اسم مؤهل بالكامل للوحدة (أو الحزمة ،ولكن ألغراض هذه المناقشة ، Lفإن االختالف غير Pythonلبدء البحث ،تحتاج
للبيان ،أو من المعلمات import Lجوهري) التي يتم استيرادها .قد يأتي هذا االسم من وسيطات مختلفة
.وظائف)(__ __importأو)( importlib.import_moduleإلى
سيتم استخدام هذا االسم في مراحل مختلفة من بحث االستيراد ،وقد يكون المسار المنقط إلى وحدة فرعية ،على سبيل
في حالة فشل أي foo.bar.baz. وأخيرً ا foo.bar،ثم foo،أوالً االستيراد Pythonفي هذه الحالة ،تحاول foo.bar.baz. المثال
a.يتم رفع ، ModuleNotFoundErrorمن الواردات الوسيطة
يعمل هذا التعيين كذاكرة تخزين مؤقت لجميع الوحدات 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().
5.4. Loading
فيما يلي عرض . فستستخدمها آلية االستيراد (والمحمل الذي يحتوي عليه) عند تحميل الوحدة، إذا تم العثور على مواصفات الوحدة
تقريبي لما يحدث أثناء جزء التحميل من االستيراد:
module = None
module = spec.loader.create_module(spec)
if module is None:
module = ModuleType(spec.name)
_init_module_attrs(spec, module)
if spec.loader is None:
# unsupported
raise ImportError
# namespace package
sys.modules[spec.name] = module
module = spec.loader.load_module(spec.name)
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
) ،على عكس الوحدة النمطية المضمنة أو االمتداد الذي يتم تحميله ديناميكيًا( Pythonإذا كانت الوحدة النمطية هي وحدة
( module.__dict__).فيجب على المُحمل تنفيذ رمز الوحدة في مساحة االسم العام للوحدة
سيتم )( exec_moduleعلى الرغم من أنه ImportError،إذا لم يتمكن المُحمل من تنفيذ الوحدة ،فيجب أن يرفع
.نشر أي استثناء آخر يتم طرحه أثناء ذلك
ستعيد الطريقة فقط )( ، find_specفي كثير من الحاالت ،يمكن أن يكون الباحث والمحمل هو نفس الكائن ؛ في مثل هذه الحاالت
self.المواصفات مع ضبط أداة التحميل على
Pg. 57
طريقة .يأ)( create_moduleقد تشترك برامج تحميل الوحدة النمطية في إنشاء كائن الوحدة النمطية أثناء التحميل عن طريق تنفيذ
ال )(. create_moduleخذ وسيطة واحدة ،مواصفات الوحدة النمطية ،ويعيد كائن الوحدة النمطية الجديد الستخدامه أثناء التحميل
.فإن آلية االستيراد ستنشئ الوحدة الجديدة نفسها None،يحتاج إلى تعيين أي سمات على كائن الوحدة النمطية .إذا عادت الطريقة
ويفترض آلية استيراد كافة المسؤوليات )( 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، ،إذا فشل التحميل ،ويجب على محمل إزالة أي وحدات وإدراجها
.وفقط إذا محمل نفسها وقد حملت وحدة (ق) صراحة
5.4.2. Submodules
العبارات import-from،أو ، importواجهات برمجة التطبيقات importlibمثل( عندما يتم تحميل وحدة فرعية باستخدام أي آلية
يتم وضع ارتباط في مساحة اسم الوحدة الرئيسية لكائن الوحدة الفرعية .على سبيل المثال ،إذا __import__()) ،أو المضمنة
مرتبطة بالوحدة fooسيكون لها سمة spam.foo، spamبعد االستيراد foo،تحتوي على وحدة فرعية spamكانت الحزمة
:الفرعية .لنفترض أن لديك بنية الدليل التالية
spam/
__init__.py
foo.py
bar.py
>>>
Pg. 58
>>> import spam
>>> spam.foo
>>> spam.bar
المألوف ،قد يبدو هذا مفاج ًئا ،لكنه في الواقع ميزة أساسية لنظام االستيراد .االحتفاظ الثابت Pythonبالنظر إلى قواعد ربط اسم
فيجب أن يظهر ) ،كما تفعل بعد االستيراد أعاله(]' sys.modules['spam.fooو]' sys.modules['spamهو أنه إذا كان لديك
.كسمة Lلألول fooاألخير
مواصفات الوحدة5.4.3.
تستخدم آالت االستيراد مجموعة متنوعة من المعلومات حول كل وحدة أثناء االستيراد ،خاصة قبل التحميل .معظم المعلومات
.مشتركة لجميع الوحدات .الغرض من مواصفات الوحدة النمطية هو تغليف هذه المعلومات المتعلقة باالستيراد على أساس كل وحدة
يسمح استخدام المواصفات أثناء االستيراد بنقل الحالة بين مكونات نظام االستيراد ،على سبيل المثال بين الباحث الذي ينشئ
مواصفات الوحدة والمحمل الذي ينفذها .واألهم من ذلك ،أنه يسمح آلالت االستيراد بأداء عمليات التحميل المعياري ،بينما بدون
.مواصفات الوحدة ،يتحمل اللودر هذه المسؤولية
للحصول على تفاصيل حول ModuleSpecفي كائن الوحدة النمطية .انظر__ __specيتم الكشف عن مواصفات الوحدة كسمةL
.محتويات مواصفات الوحدة
.تمأل آلية االستيراد هذه السمات Lعلى كل كائن وحدة أثناء التحميل ،بنا ًء على مواصفات الوحدة ،قبل أن يقوم المُحمل بتنفيذ الوحدة
____name
يجب أن يتم تعيين السمة إلى اسم مؤهل بشكل كامل من وحدة .يستخدم هذا االسم لتعريف الوحدة بشكل فريد في __ __nameو
.نظام االستيراد
____loader
يجب أن يتم تعيين السمة إلى كائن محمل أن استيراد اآلالت المستخدمة Lعند تحميل وحدة .هذا في الغالب للتأمل __loader__ ،و
.ولكن يمكن استخدامه لوظائف إضافية خاصة بمحمل ،على سبيل المثال الحصول على البيانات المرتبطة بمحمل
____package
عندما __name__. يجب تعيين سمة الوحدة . يجب أن تكون قيمتها سلسلة ،ولكن يمكن أن تكون نفس قيمة لها____package
عندما ال تكون الوحدة عبارة عن __name__. يجب تعيين قيمتها على__ ، __packageتكون الوحدة عبارة عن حزمة
يجب تعيينها على السلسلة الفارغة للوحدات النمطية ذات المستوى األعلى ،أو للوحدات الفرعية ،على ، __package__ حزمة
.لمزيد من التفاصيلPEP 366 اسم الحزمة األصلية .ارى
حساب الواردات النسبية الصريحة للوحدات النمطية الرئيسية ،على النحو المحدد في__ __nameيتم استخدام هذه السمة بدالً من
. 366__spec__.parent.من المتوقع أن يكون لها نفس القيمة مثل
____spec
Pg. 59
يجب أن يتم تعيين السمة إلى المواصفات وحدة الذي تم استخدامه عند استيراد وحدة .اإلعداد __ __specو
مناسب ينطبق بالتساوي على الوحدات التي تمت تهيئتها أثناء بدء تشغيل المترجم الفوري . االستثناء الوحيد __spec__ بشكل
.يتم تعيينه إلى ال شيء في بعض الحاالت__ __specحيث __main__،هو
____path
فيجب تعيين سمة كائن الوحدة النمطية . يجب __ ، __pathإذا كانت الوحدة النمطية عبارة عن حزمة (إما عادية أو مساحة االسم)
ً
فارغا ،فيجب __ __pathلم يكن لها أهمية أخرى .إذا__ __pathأن تكون القيمة قابلة للتكرار ،ولكن قد تكون فارغة إذا لم يكن
.ترد أدناه__ __pathأن ينتج سالسل عند تكرارها .مزيد من التفاصيل حول دالالت
____file
____cached
ضبطه إذا لم __ __fileهو اختياري .إذا تم تعيينها ،يجب أن تكون قيمة هذه السمة سلسلة .قد يختار نظام االستيراد عدم____file
.يكن له معنى داللي (على سبيل المثال ،وحدة محملة من قاعدة بيانات)
السمة التي تمثل المسار إلى أي إصدار مترجم من الكود __ __cachedتم تعيينه ،فقد يكون من المناسب Lأي ً
ضا تعيين__ __fileإذا
(على سبيل المثال ،ملف مترجم بالبايت) .ال يلزم وجود الملف لتعيين هذه السمة ؛ يمكن أن يشير المسار ببساطة إلى مكان وجود
PEP 3147 ).انظر( الملف المترجم
عدم التعيين .ومع ذلك ،فإن هذا السيناريو غير نمطي تمامًا .في النهاية __file__ ،وقت__ __cachedمن المناسب أيضً ا تحديد
لذلك إذا كان بإمكان أداة التحميل التحميل من وحدة تخزين مؤقت ولكن ال __cached__. و /أو__ __fileالمحمل هو ما يستخدم
.يتم تحميلها من ملف ،فقد يكون هذا السيناريو غير النمطي مناسبًا
__ وحدة __.مسار5.4.5.
توفير ُ sys.pathتستخدم سمة الحزمة أثناء استيراد حزمها الفرعية .داخل آلية االستيراد ،تعمل بشكل مشابه تمامًا مثل____path
sys.path.عادة ما يكون أكثر تقيي ًدا من__ ، __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إذا كانت الوحدة
.كجزء من وحدة نسخ الوحدة
تم إيقافه ويتم استخدام المواصفات وحدة اآلن من استيراد اآلالت لتوليد loader.module_repr() تغير في اإلصدار :3.4استخدام
.حدة repr
طريقة أ)( module_reprعن طريق استدعاء reprسيتم إنشاء الوحدة النمطية Python 3.3 ،للتوافق مع اإلصدارات السابقة مع
.داة التحميل ، إذا تم تحديدها ،قبل تجربة أي من األسلوبين الموصوفين أعاله .ومع ذلك ،تم إهمال الطريقة
الملف .pyملف ،فإنه يتحقق مما إذا كانت ذاكرة التخزين المؤقت محدثة مع .pycبتحميل رمز بايت مؤقت من Pythonقبل أن يقوم
بذلك عن طريق تخزين الطابع الزمني األخير الذي تم تعديله وحجمه في ملف ذاكرة Pythonالمصدر . بشكل افتراضي ،تقوم
التخزين المؤقت عند كتابته .في وقت التشغيل ،يقوم نظام االستيراد بالتحقق من صحة ملف ذاكرة التخزين المؤقت عن طريق
.التحقق من البيانات الوصفية المخزنة في ملف ذاكرة التخزين المؤقت مقابل البيانات الوصفية للمصدر
أيضً ا ملفات ذاكرة التخزين المؤقت "المستندة إلى التجزئة" ،والتي تخزن تجزئة لمحتويات الملف المصدر بدالً من Pythonتدعم
.pycالملفات المستندة إلى التجزئة : محددة وغير محددة .بالنسبة إلى .pycالبيانات الوصفية الخاصة به .هناك نوعان مختلفان من
من صحة ملف ذاكرة التخزين المؤقت عن طريق تجزئة الملف المصدر ومقارنة Pythonالملفات المستندة إلى التجزئة ، تتحقق
التجزئة الناتجة مع التجزئة في ملف ذاكرة التخزين المؤقت .إذا تم العثور على ملف ذاكرة تخزين مؤقت تم التحقق منه على أساس
بإعادة إنشائه ويكتب ملف ذاكرة تخزين مؤقت جديد تم التحقق منه على أساس Pythonالتجزئة غير صالح ،يقوم
ببساطة أن ملف ذاكرة التخزين Pythonللملفات القائمة على التجزئة التي لم يتم التحقق منها ، تفترض .pycالتجزئة .بالنسبة
--check-hash-قد يتم تجاوز سلوك التحقق من صحة الملفات المستندة إلى التجزئة بالعالمة. .pycالمؤقت صالح إذا كان موجو ًدا
based-pycs .
تدعم فقط اإلبطال المستند Pythonالملفات المستندة إلى التجزئة . في السابق ،كانت .pycتم التغيير في اإلصدار :3.7تمت إضافة
.إلى الطابع الزمني لذاكرة التخزين المؤقت للرمز البايت
مع العديد من مكتشفات المسارات الوصفية االفتراضية .واحد من هؤالء ،يسمى الباحث المستند 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،الواقع ،إذا تمت إزالة الباحث المستند إلى المسار من
التي تم تحديد موقعها بإدخال Pythonيكون الباحث المستند إلى المسار مسؤوالً عن إيجاد وتحميل وحدات وحزم
.مسار سلسلة . معظم أسماء مدخالت Lالمسار مواقع في نظام الملفات ،لكن ال يجب أن تقتصر على هذا
البروتوكول الموصوف ساب ًقا ،ومع ذلك فإنه )( find_specبصفته مكتشف مسار التعريف ،يقوم الباحث المستند إلى المسار بتنفيذ
.يعرض خطافات Lإضافية يمكن استخدامها لتخصيص كيفية العثور على الوحدات النمطية وتحميلها من مسار االستيراد
متغير 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بواسطة
من أجل دعم واردات الوحدات النمطية والحزم المُهيأة وأيضً ا للمساهمة بأجزاء في حزم مساحة االسم ،يجب على مكتشفات Lإدخال
.الطريقة)( find_specالمسار تنفيذ
بإرجاع)(. find_specتأخذ وسيطتين :االسم المؤهل بالكامل للوحدة التي يتم استيرادها ،والوحدة الهدف (االختيارية))(find_spec
.مواصفات كاملة المأهولة للوحدة .ستحتوي هذه المواصفات دائمًا على مجموعة "محمل" (مع استثناء واحد)
لإلشارة إلى آلية االستيراد أن المواصفات تمثل جزءًا من مساحة االسم ، يقوم مكتشف إدخال المسار بتعيين
.إلى قائمة تحتوي على الجزء ""subodule_search_locations
ال تزال األساليب محترمة من 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دائما
واستبدالها sys.meta_path،تتمثل اآللية األكثر موثوقية الستبدال نظام االستيراد بالكامل في حذف المحتويات االفتراضية لـ
.بالكامل بخطاف مسار تعريف مخصص
Pg. 63
إذا كان من المقبول تغيير سلوك عبارات االستيراد فقط دون التأثير على واجهات برمجة التطبيقات األخرى التي تصل إلى نظام
فقد يكون استبدال الوظيفة المضمنة كافيًا .يمكن أيضً ا استخدام هذه التقنية على مستوى الوحدة النمطية )(__ ، __importاالستيراد
.لتغيير سلوك بيانات االستيراد فقط داخل تلك الوحدة
لمنع استيراد بعض الوحدات بشكل انتقائي من الخطاف في وقت مبكر على مسار التعريف (بدالً من تعطيل نظام االستيراد القياسي
يشير األخير إلى أن البحث None. بدالً من إرجاعه)( find_specمباشر ًة من ModuleNotFoundErrorتمامًا) ،يكفي رفعه
.عن مسار التعريف يجب أن يستمر ،بينما يؤدي رفع استثناء إلى إنهائه على الفور
تستخدم الواردات النسبية النقاط البادئة .تشير النقطة البادئة المفردة إلى استيراد نسبي ،بدءًا من الحزمة الحالية .تشير نقطتان أو
أكثر من النقاط البادئة إلى استيراد نسبي ألصل (عناصر) الحزمة الحالية ،مستوى واحد لكل نقطة بعد األول .على سبيل المثال ،
:بالنظر إلى تخطيط الحزمة التالي
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
:ما يلي عبارة عن عمليات استيراد نسبية صالحة subpackage1/__init__.py،أو subpackage1/moduleX.pyفي أيٍ من
قد تستخدم عمليات االستيراد المطلقة إما بناء الجملة أو بناء الجملة ،لكن الواردات النسبية قد تستخدم النموذج الثاني فقط ؛ والسبب
><:import <>from <> import في ذلك
import XXX.YYY.ZZZ
يتم تهيئة الوحدة __ ، __mainالوحدة هي حالة خاصة بالنسبة للنظام استيراد بايثون .كما هو مذكور في مكان آخر__ __mainو
ومع ذلك ،على عكس هذين ،فهي ال تتأهل بشكل صارم كوحدة builtins. و sysمباشرة عند بدء تشغيل المترجم الفوري ،مثل
Pg. 64
تتم بها التهيئة تعتمد على العالمات Lوالخيارات األخرى التي يتم من خاللها __ __mainنمطية مدمجة .وذلك ألن الطريقة التي
.استدعاء المترجم
__. __specيتم تعيينه على مواصفات الوحدة النمطية للوحدة أو الحزمة المقابلة__ ، __specبالخيار Python -mعند بدء تشغيل
.إدخال آخر sys.pathتحميل الوحدة كجزء من تنفيذ دليل أو ملف مضغوط أو__ __mainيتم ملؤها أيضً ا عند
ال يتوافق مباشر ًة__ __mainحيث أن الكود المستخدم لملء None،يتم تعيين إلى ، __main__.__spec__ في الحاالت المتبقية
:مع وحدة نمطية قابلة لالستيراد
اختيار-c
في الحالة األخيرة ،حتى إذا كان من الممكن استيراد الملف من الناحية 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
تطورت آلية االستيراد بشكل كبير منذ أيام بايثون األولى .ال تزال المواصفات األصلية للحزم متاحة للقراءة ،على الرغم من تغيير
.بعض التفاصيل منذ كتابة هذا المستند
find_module().البروتوكول كبديل لـ)(find_loaderأيضًا PEP 420 قدم Python 3.3. حزم مساحة االسم لـ PEP 420 قدم
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أو حرفية .يتم أي ً
ضا تصنيف األشكال الموجودة بين أقواس أو
:أقواس أو أقواس من الناحية التركيبية على أنها ذرات .صيغة الذرات هي
| generator_expression|yield_atom
المعرفات (األسماء)6.2.1.
Pg. 66
المعرف الذي يحدث على شكل ذرة هو اسم .انظر قسم المعرفات والكلمات األساسية Lللتعريف المعجمي وقسم التسمية والربط لتوثيق
.التسمية والربط
ً
مرتبطا بجسم ما ،فإن تقييم الذرة ينتج هذا الكائن .عندما يكون االسم غير ملزم ،فإن محاولة تقييمه عندما يكون االسم
.استثناءً NameError تثير
تشويه االسم الخاص :عندما يبدأ المعرف الذي يحدث نصيًا في تعريف فئة بحرفين أو أكثر من أحرف الشرطة السفلية وال ينتهي
بشرطة سفلية أو أكثر ،فإنه يعتبر اسمًا خاصًا لتلك الفئة .يتم تحويل األسماء Lالخاصة إلى نموذج أطول قبل إنشاء رمز لها .يُدرج
التحويل اسم الفئة ،مع إزالة الشرطات السفلية البادئة وإدراج شرطة سفلية واحدة أمام االسم .على سبيل المثال ،سيتم
هذا التحول مستقل عن السياق النحوي الذي _Ham__spam. إلى Hamيحدث في فئة مسماة __spamLتحويل المعرف الذي
يستخدم فيه المعرف .إذا كان االسم المحول طويالً للغاية (أطول من 255حر ًفا) ،فقد يحدث اقتطاع محدد للتنفيذ .إذا كان اسم الفئة
.يتكون فقط من شرطات سفلية ،فلن يتم إجراء أي تحويل
6.2.2. Literals
:: = stringliteral| bytesliteralحرفي
ينتج عن تقييم حرفي كائن من النوع المحدد (سلسلة ،بايت ،عدد صحيح ،رقم النقطة العائمة ،رقم مركب) بالقيمة المحددة .يمكن
.للحصول على التفاصيل Literals تقريب القيمة في حالة الفاصلة العائمة والحرفية التخيلية (المعقدة) .انظر قسم
تتوافق جميع القيم الحرفية مع أنواع البيانات غير القابلة للتغيير ،وبالتالي فإن هوية الكائن أقل أهمية من قيمته .قد تحصل التقييمات
المتعددة للقيم الحرفية بنفس القيمة (إما نفس التكرار في نص البرنامج أو حدث مختلف) على نفس الكائن أو كائن مختلف بنفس
.القيمة
ينتج عن قائمة Lالتعبير بين قوسين ما ينتج عن قائمة التعبيرات هذه :إذا كانت القائمة تحتوي على فاصلة واحدة على األقل ،فستنتج
.مجموعة ؛ وإال فإنه ينتج التعبير المفرد الذي يتكون من قائمة التعبير
غير قابلة للتغيير ،تنطبق نفس القواعد المطبقة على العناصر tupleينتج عن زوج فارغ من األقواس كائن بنية فارغ .نظرً ا ألن
.الحرفية (على سبيل المثال ،قد ينتج عن تواجدان للمجموعة الفارغة نفس الكائن أو قد ال ينتج عنهما)
الفارغ ،حيث يلزم وجود أقواس tuple - الحظ أن المجموعات ال تتكون من األقواس ،بل باستخدام عامل الفاصلة .االستثناء هو
حيث يؤدي السماح بـ "ال شيء" غير المحصور في التعبيرات إلى االلتباسات والسماح لألخطاء المطبعية الشائعة بالمرور بدون
.تحديد
:صيغة خاصة تسمى "شاشات Lالعرض" ،كل منها بنكهتين Pythonإلنشاء قائمة ،توفر مجموعة أو قاموس
:: = assignment_expression comp_forالفهم
Pg. 67
comp_iter :: = comp_for|comp_if
جمل .في هذه الحالة ،عناصر حاويات جديدة 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أيضا
يعرض القائمة6.2.5.
:عرض القائمة هو ربما سلسلة فارغة من التعبيرات الموضوعة بين أقواس مربعة
ينتج عن عرض القائمة كائن قائمة Lجديد ،يتم تحديد المحتويات إما بقائمة من التعبيرات أو الفهم .عندما يتم توفير قائمة من التعبيرات
مفصولة بفواصل ،يتم تقييم عناصرها من اليسار إلى اليمين ووضعها في كائن القائمة بهذا الترتيب .عندما يتم توفير الفهم ،يتم
.إنشاء القائمة من العناصر الناتجة عن الفهم
تعيين العروض6.2.6.
يتم اإلشارة إلى مجموعة العرض من خالل األقواس المتعرجة ويمكن تمييزها عن شاشات عرض القاموس بسبب عدم وجود
:عالمات النقطتين التي تفصل بين المفاتيح والقيم
ينتج عن عرض المجموعة كائن مجموعة جديد قابل للتغيير ،يتم تحديد المحتويات إما عن طريق سلسلة من التعبيرات أو
الفهم .عندما يتم توفير قائمة من التعبيرات مفصولة بفواصل ،يتم تقييم عناصرها من اليسار إلى اليمين وإضافتها إلى الكائن
.المحدد .عندما يتم توفير الفهم ،يتم إنشاء المجموعة من العناصر الناتجة عن الفهم
.ال يمكن إنشاء مجموعة فارغة باستخدام}{ ؛ هذا الحرفي يبني قاموس فارغ
يعرض القاموس6.2.7.
:عرض القاموس هو ربما سلسلة فارغة من أزواج المفاتيح /المسند محاطة بأقواس معقوفة
Pg. 68
key_datum :: = expression":" expression| "**"or_expr
إذا تم تقديم تسلسل مفصول بفواصل ألزواج المفاتيح /المسند ،فسيتم تقييمها من اليسار إلى اليمين لتحديد إدخاالت القاموس :يتم
استخدام كل كائن مفتاح كمفتاح في القاموس لتخزين البيانات المقابلة .هذا يعني أنه يمكنك تحديد نفس المفتاح عدة مرات في قائمة
.المفاتيح /البيانات ،وستكون قيمة القاموس النهائية لهذا المفتاح هي آخر قيمة معطاة
تشير النجمة المزدوجة إلى تفريغ القاموس . يجب أن يكون المعامل انها ل رسم الخرائط . تتم إضافة كل عنصر تعيين إلى **
القاموس الجديد .تحل القيم الالحقة محل القيم التي تم تعيينها بالفعل بواسطة أزواج المفاتيح /البيانات السابقة وعمليات تفريغ
.القاموس السابقة
" "ifو " "forيحتاج الفهم الدكتاتوري ،على النقيض من الفهم الشامل والقائم ،إلى تعبيرين مفصولين بنقطتين متبوعين بعبارات
.المعتادة .عند تشغيل عملية الفهم ،يتم إدخال عناصر القيمة والمفتاح الناتج في القاموس الجديد بترتيب إنتاجهما
تم سرد القيود المفروضة على أنواع قيم المفاتيح مسب ًقا في القسم التدرج الهرمي للنوع القياسي( . للتلخيص ،يجب أن يكون نوع
المفتاح قاباًل للتجزئة ، مما يستبعد جميع الكائنات القابلة للتغيير ).لم يتم اكتشاف التعارضات بين المفاتيح المكررة ؛ يسود المرجع
.األخير (نصيًا في أقصى اليمين في الشاشة) المخزن لقيمة مفتاح معينة
في Python 3.8. لم يكن ترتيب تقييم المفتاح والقيمة محد ًدا بشكل جيد قبل Python 3.8 ،تم التغيير في اإلصدار :3.8قبل
.تم تقييم القيمة قبل المفتاح .بدءًا من ، 3.8يتم تقييم المفتاح قبل القيمة ،على النحو الذي اقترحهCPython ، 572
تعبيرات المولد6.2.8.
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غير متزامن جديد ،وهو مكرر غير متزامن (انظر التكرارات غير المتزامنة)
بدءًا من coroutines. يمكن أن تظهر تعبيرات المولد غير المتزامن فقط في Python 3.7 ،تم التغيير في اإلصدار :3.7قبل
، 3.7.async defيمكن ألي وظيفة استخدام تعبيرات المولد غير المتزامن
تعبيرات الخضوع6.2.9.
Pg. 69
العائد_الذرة ")":: = "(" yield_expression
يتم استخدام تعبير العائد عند تحديد وظيفة المولد أو وظيفة المولد غير المتزامن وبالتالي ال يمكن استخدامها إال في جسم تعريف
الوظيفة .يؤدي استخدام تعبير العائد في جسم الوظيفة إلى أن تكون هذه الوظيفة مول ًدا ،كما يؤدي استخدامها في جسم الوظيفة إلى أن
:async defبمثابة مولد غير متزامن .على سبيل المثال coroutineتكون وظيفة
yield 123
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 -
.وبناء جملة المولدات ،مما يجعلها قابلة لالستخدام ككروتينات بسيطة ) (APIاقتراح تحسين واجهة برمجة التطبيقات
coroutine.عن طريق إضافة قدرات المولد إلى وظائف PEP 492 االقتراح الذي توسع
.يصف هذا القسم الفرعي طرق مولد المولد .يمكن استخدامها للتحكم في تنفيذ وظيفة المولد
.استثناءً ValueErrorالحظ أن استدعاء أي من طرق المولد أدناه عندما يكون المولد قيد التنفيذ بالفعل يثير
)(__generator.__next
بطريقة ما ،يتم تقييم تعبير)(__ __nextيبدأ تنفيذ وظيفة المولد أو يستأنفها عند آخر تعبير ناتج تم تنفيذه .عند استئناف وظيفة المولد
ويتم ، expression_listثم يستمر التنفيذ إلى تعبير العائد التالي ،حيث يتم تعليق المولد مرة أخرى None. العائد الحالي دائمًا إلى
.فسيتم رفع استثناء ، StopIteration المتصل إلى المتصل .إذا خرج المولد دون إعطاء قيمة أخرى)(__ __nextإرجاع قيمة
.الوظيفة المضمنة)( nextحلقة ،أو عن طريق forعادة ما تسمى هذه الطريقة ضمنيًا ،على سبيل المثال عن طريق
) القيمة generator.send(
األسلوب بإرجاع القيمة )( sendيستأنف التنفيذ و "يرسل" قيمة إلى وظيفة المولد .و قيمة حجة تصبح نتيجة للتعبير العائد الحالي .و
يتم استدعاؤها لبدء )( sendإذا مخارج مولد دون الرضوخ قيمة أخرى .عندما StopIterationالتالية التي تجنى من المولد ،أو يثير
.كوسيطة ،ألنه ال يوجد تعبير محصول يمكن أن يتلقى القيمة Noneالمولد ،يجب استدعائها
عند النقطة التي تم فيها إيقاف المولد مؤق ًتا ،وإرجاع القيمة التالية الناتجة عن وظيفة المولد .إذا خرج typeرفع استثناء من النوع
فسيتم رفع استثناء .إذا لم تلتقط وظيفة المولد االستثناء الذي تم تمريره ،أو قامت ، StopIteration Lالمولد دون إعطاء قيمة أخرى
.بإثارة استثناء مختلف ،فإن هذا االستثناء ينتشر إلى المستدعي
)(generator.close
النقطة التي توقفت عندها وظيفة المولد مؤق ًتا .إذا خرجت وظيفة المولد بعد ذلك بأمان ،أو كانت مغلقة بالفعل GeneratorExitيرفع
فإن العودة قريبة إلى المتصل بها .إذا كان المولد ينتج ) ،من خالل عدم التقاط االستثناء( ، GeneratorExitأو ترفع
ال يفعل شي ًئا إذا كان المولد قد)(. closeإذا أثار المولد أي استثناء آخر ،فسيتم نشره إلى المتصل a. يتم رفع ، RuntimeErrorقيمة
.خرج بالفعل بسبب استثناء أو خروج عادي
6.2.9.2. Examples
>>>
... )"print("Execution starts when 'next()' is called for the first time.
Pg. 71
... try:
... try:
... finally:
...
))>>> print(next(generator
1
))>>> print(next(generator
None
))>>> print(generator.send(2
2
)TypeError('spam',
)(>>> generator.close
Python."yield fromبناء الجملة للتفويض إلى مولد فرعي في "ما الجديد في PEP 380:للحصول على أمثلة الستخدام ، راجع
.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 ، مرجعي لطريقة
.يصف هذا القسم الفرعي طرق مولد المولد غير المتزامن ،والتي ُتستخدم للتحكم في تنفيذ وظيفة المولد
agen.__anext__( ) كوروتين
إرجاع أمر منتظر والذي عند بدء التشغيل لتنفيذ المولد غير المتزامن أو استئنافه عند آخر تعبير ناتج تم تنفيذه .عندما يتم استئناف
في المنتظر المرتجع ،والذي عند Noneبأسلوب ما ،يتم تقييم تعبير العائد الحالي دائمًا __anext__() وظيفة المولد غير المتزامن
االستثناء المرفوعة بواسطة StopIterationتعبير العائد هي قيمة expression_listالتشغيل سيستمر إلى تعبير العائد التالي .قيمة
المكتمل .إذا خرج المولد غير المتزامن دون إعطاء قيمة أخرى ،فإن المنتظر بدالً من ذلك coroutine
.استثناء ،مما يشير إلى أن التكرار غير المتزامن قد اكتمل StopAsyncIterationيثير
) القيمة agen.asend( كوروتين
طريقة المولد ،فإن هذا "يرسل")( sendإرجاع أمر منتظر والذي عند التشغيل يستأنف تنفيذ المولد غير المتزامن .كما هو الحال مع
قيمة إلى وظيفة المولد غير المتزامن ،وتصبح وسيطة القيمة نتيجة تعبير العائد الحالي .سيعيد المولد المنتظر الذي يتم إرجاعه
إذا StopAsyncIterationأو يرتفع StopIteration،الطريقة القيمة التالية التي ينتجها المولد كقيمة مرفوعة)( asendبواسطة
يتم استدعاؤها لبدء المولد غير المتزامن ،يجب )( asendخرج المولد غير المتزامن دون إعطاء قيمة أخرى .عندما
.كوسيطة ،ألنه ال يوجد تعبير محصول يمكنه تلقي القيمة Noneاستدعائها
عند النقطة التي تم فيها إيقاف المولد غير المتزامن مؤق ًتا ،ويعيد القيمة التالية الناتجة عن typeيُرجع أمرً ا منتظرً ا يثير استثنا ًء للنوع
خرج المولد غير المتزامن دون إعطاء قيمة StopAsyncIterationإذا StopIteration. وظيفة المولد كقيمة االستثناء المرتفع
أخرى ،فسيتم رفع استثناء بواسطة المنتظر .إذا لم تلتقط وظيفة المولد االستثناء الذي تم تمريره ،أو أثارت استثناءًا مختل ًفا ،فعند
.تشغيل المنتظر ينتشر هذا االستثناء إلى المتصل المنتظر
agen.aclose( ) كوروتين
في وظيفة المولد غير المتزامن عند النقطة التي تم إيقافها Lفيها a GeneratorExitيُرجع أمرً ا منتظرً ا عندما يؤدي التشغيل إلى إلقاء
من خالل عدم اصطياد ( GeneratorExitمؤق ًتا .إذا خرجت وظيفة المولد غير المتزامن بأمان ،أو كانت مغلقة بالفعل ،أو ترفع
استثناءً .أي طلبات انتظار أخرى يتم إرجاعها من خالل StopIterationفإن الوظيفة المنتظرة المرتجعة ستثير ) ،االستثناء
أعطى المولد غير المتزامن RuntimeErrorاستثناءً .إذا StopAsyncIterationاالستدعاءات الالحقة للمولد غير المتزامن ستثير
بواسطة المنتظر .إذا أثار المولد غير المتزامن أي استثناء آخر ،فسيتم نشره للمستدعي المنتظر .إذا كان المولد a قيمة ،يتم رفع
.ستعيد انتظارً ا ال يفعل شي ًئا)( acloseغير المتزامن قد خرج بالفعل بسبب استثناء أو خروج عادي ،فإن المكالمات األخرى إلى
Pg. 73
6.3. Primaries
:تمثل االنتخابات التمهيدية أكثر عمليات اللغة تقيي ًدا بإحكام .تركيبها هو
مراجع السمات6.3.1.
attributeref :: = primary"."identifier
يجب أن يتم تقييم األساسي إلى كائن من نوع يدعم مراجع السمات ،وهو ما تفعله معظم الكائنات .ثم يُطلب من هذا الكائن إنتاج
الطريقة .إذا لم تكن هذه السمة )(__ __getattrالسمة التي يكون اسمها هو المعرف .يمكن تخصيص هذا اإلنتاج من خالل تجاوز
خالف ذلك ،يتم تحديد نوع الكائن وقيمته بواسطة الكائن .قد تؤدي التقييمات المتعددة AttributeError. متاحة ،يظهر االستثناء
.لنفس مرجع السمة إلى كائنات مختلفة
6.3.2. Subscriptions
:عاد ًة ما يؤدي االشتراك في تسلسل (سلسلة أو مجموعة أو قائمة) أو كائن تعيين (قاموس) إلى تحديد عنصر من المجموعة
يجب أن يتم تقييم األساسي إلى كائن يدعم االشتراك (قوائم أو قواميس على سبيل المثال) .يمكن أن تدعم الكائنات المعرفة من قبل
.طريقة)(__ __getitemالمستخدم االشتراك عن طريق تحديد
إذا كان األساسي عبارة عن تعيين ،فيجب أن تقيّم قائمة التعبيرات كائ ًن ا تكون قيمته أحد مفاتيح التعيين ،ويحدد االشتراك القيمة في
التعيين التي تتوافق مع هذا المفتاح( .قائمة التعبيرات عبارة عن مجموعة إال إذا كانت تحتوي على عنصر واحد بالضبط).
.إذا كان األساسي عبارة عن تسلسل ،فيجب تقييم قائمة التعبيرات إلى عدد صحيح أو شريحة (كما تمت مناقشته في القسم التالي)
ال تنص الصيغة الرسمية على أي حكم خاص للمؤشرات السلبية في المتتاليات ؛ ومع ذلك ،فإن جميع التسلسالت المضمنة
يحدد العنصر ] x[-1بحيث( طريقة تفسر المؤشرات السالبة عن طريق إضافة طول التسلسل إلى الفهرس __getitem__() توفر
عددا صحيحً ا غير سالب أقل من عدد العناصر في التسلسل ،ويحدد االشتراك العنصر x). األخير منيجب أن تكون القيمة الناتجة ً
طريقة ال )(__ __getitemالذي يكون فهرسه هو تلك القيمة (العد من الصفر) .نظرً ا ألن دعم المؤشرات السلبية والتقطيع يحدث في
.كائن ، فإن الفئات الفرعية التي تتجاوز هذه الطريقة ستحتاج إلى إضافة هذا الدعم بشكل صريح
.عناصر السلسلة هي أحرف .الحرف ليس نوع بيانات منفصل ولكنه سلسلة من حرف واحد بالضبط
يؤدي االشتراك في فئات أو أنواع معينة إلى إنشاء اسم مستعار عام . في هذه الحالة ،يمكن للفئات المعرفة من قبل المستخدم Lدعم
.الفصل)(__ __class_getitemاالشتراك من خالل توفير أسلوب
6.3.3. Slicings
يحدد التقطيع مجموعة من العناصر في كائن تسلسل (على سبيل المثال ،سلسلة أو مجموعة أو قائمة) .يمكن استخدام الشرائح
:العبارات .بناء الجملة للتقطيع delكتعبيرات أو كأهداف في التعيين أو
slice_item :: = expression|proper_slice
Lower_bound :: = expression
Pg. 74
top_bound :: = expression
يوجد غموض في البنية الرسمية هنا :أي شيء يشبه قائمة التعبير يبدو أيضً ا كقائمة شرائح ،لذلك يمكن تفسير أي اشتراك على أنه
تقسيم .بدالً من زيادة تعقيد البنية ،يتم توضيح ذلك من خالل تحديد أنه في هذه الحالة ،يكون للتفسير كاشتراك أولوية على التفسير
.كتقسيم (هذا هو الحال إذا كانت قائمة Lالشرائح ال تحتوي على شريحة مناسبة)
بمفتاح تم إنشاؤه من قائمة )طريقة االشتراك العادي)(__ __getitemباستخدام نفس( دالالت التقطيع هي كما يلي .األساسي مفهرس
الشرائح ،على النحو التالي .إذا كانت قائمة الشرائح تحتوي على فاصلة واحدة على األقل ،فإن المفتاح هو مجموعة تحتوي على
تحويل عناصر الشرائح ؛ خالف ذلك ،فإن تحويل عنصر الشريحة المنفردة هو المفتاح .إن تحويل عنصر شريحة يمثل تعبيرً ا هو
سمات stepو start، stopهذا التعبير .تحويل شريحة المناسبة هو كائن شريحة (انظر القسم نوع التسلسل الهرمي القياسية ) التي
.عن التعبيرات في عداد المفقودين Noneهي قيم تعبيرات معينة كنسبة ملزمة أقل ،الحد األعلى واسعة ،على التوالي ،واالستعاضة
6.3.4. Calls
:استدعاء يستدعي كائ ًنا قابالً لالستدعاء (على سبيل المثال ،دالة ) مع سلسلة من الوسائط ربما تكون فارغة
]["،" keywords_arguments
| keywords_arguments
.قد توجد فاصلة الحقة اختيارية بعد الوسائط الموضعية والكلمات 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الرئيسية
>>>
...
21
12
الجملة في نفس المكالمة ،لذلك ال ينشأ هذا االلتباس *expressionمن غير المعتاد استخدام كل من وسيطات الكلمات الرئيسية وبناء
.عمليًا
فيجب تقييم التعيين ، حيث يتم التعامل مع محتوياته ، expressionظهر بناء الجملة في استدعاء الوظيفة **expressionإذا
كوسائط إضافية للكلمات Lاألساسية .إذا كانت الكلمة األساسية موجودة بالفعل (كوسيطة صريحة للكلمة الرئيسية ،أو من عملية تفريغ
.استثناء TypeErrorأخرى) ،فسيتم طرح
ال يمكن استخدامها كخانات وسيطة موضعية أو كأسماء **identifierأو *identifierتستخدم المعلمات الرسمية بناء الجملة
.وسيطات كلمات رئيسية
Pg. 76
unpackingsقد الحجج الموضعية متابعة **unpackings،تغير في اإلصدار :3.5المكالمات وظيفة تقبل أي عدد من* و
.القاموس ( .)** تم اقتراحه في األصل بواسطة unpackings 448والحجج الكلمة قد اتبع iterable ( *)،
ما لم تثير استثناءً .تعتمد كيفية حساب هذه القيمة على نوع الكائن القابل None،تقوم المكالمة Lدائمًا بإرجاع بعض القيمة ،ربما
.لالستدعاء
-اذا كانت
يتم تنفيذ كتلة التعليمات البرمجية للوظيفة ،وتمريرها إلى قائمة الوسائط .أول شيء ستفعله كتلة الكود هو ربط المعلمات Lالرسمية
عبارة ،فإن هذا يحدد قيمة returnبالوسيطات ؛ هذا موضح في قسم تعريفات الوظائف . عندما تقوم كتلة التعليمات البرمجية بتنفيذ
.اإلرجاع الستدعاء الوظيفة
:كائن فئة
يتم استدعاء الوظيفة المقابلة المعرفة من قبل المستخدم ،مع قائمة وسيطات أطول من قائمة وسيطات االستدعاء :المثيل يصبح
.الوسيطة األولى
:مثيل فئة
انتظر التعبير6.4.
مشغل الطاقة6.5.
المشغل ذو القدرة يربط بقوة أكبر من المشغلين األحاديين على يساره ؛ يرتبط بشكل أقل إحكا ًما Lمن المشغلين األحاديين على
:يمينه .الصيغة هي
وبالتالي ،في تسلسل غير محصور للقوة والمشغلين األحاديين ،يتم تقييم المشغلين من اليمين إلى اليسار (هذا ال يقيد ترتيب تقييم
.المعامالت)2**1- :ينتج عنه1-
الوظيفة المضمنة ،عندما يتم استدعاؤه بواسطة وسيطين :إنه يعطي حجته اليسرى مرفوعة إلى )( powعامل القوة له نفس دالالت
.قوة حجته اليمنى .يتم تحويل الوسائط الرقمية أوالً إلى نوع شائع ،وتكون النتيجة من هذا النوع
يكون للنتيجة نفس نوع المعامالت Lما لم تكن الوسيطة الثانية سالبة ؛ في هذه الحالة ،يتم تحويل جميع int ،بالنسبة لمعامالتL
.الوسائط إلى عدد عشري ويتم تسليم نتيجة عائمة .على سبيل المثال 2**10 ،يعود ،100 لكنه2-**10 يعود0.01
في (. عدد complex ينتج عن رفع رقم سالب إلى قوة كسرية ZeroDivisionError. رفع0.0 إلى قوة سالبة يؤدي إلى أ
) ValueError.اإلصدارات السابقة أثار أ
Pg. 77
العمليات الحسابية األحادية والعمليات األحادية6.6.
:جميع العمليات الحسابية األحادية والعمليات الحسابية األحادية لها نفس األولوية
.بالطريقة الخاصة)(__ __negينتج عن عامل التشغيل أحادي( ناقص) نفي الوسيطة الرقمية الخاصة به ؛ يمكن تجاوز العملية-
.بالطريقة الخاصة)(__ __posينتج عامل التشغيل أحادي( زائد) الوسيطة الرقمية الخاصة به دون تغيير ؛ يمكن تجاوز العملية+
إنه ينطبق -(x+1). يتم تعريف انعكاس Lالبت على أنه. xينتج عن العامل األحادي( المقلوب) انعكاس Lالبت في وسيطته الصحيحة~
.الطريقة الخاصة)(__ __invertفقط على األرقام المتكاملة أو على الكائنات المخصصة التي تتجاوز
.فسيتم طرح استثناء ، TypeErrorفي جميع الحاالت الثالث ،إذا كانت الوسيطة ال تحتوي على النوع المناسب
m_expr"٪"u_expr
.الستخدامه في ضرب المصفوفة .ال توجد أنواع بايثون مضمنة تقوم بتنفيذ هذا المشغل ) (atتم تصميم@ عامل التشغيل
و(/ تقسيم) و(// تقسيم الكلمة) مشغلي تسفر حاصل حججهم .يتم أوالً تحويل الوسيطات الرقمية إلى نوع شائع .ينتج عن تقسيم
عددا عشريًا ،بينما ينتج عن تقسيم األعداد الصحيحة عد ًدا صحيحً ا ؛ والنتيجة هي القسمة الرياضية مع تطبيق
األعداد الصحيحة ً
.االستثناء ZeroDivisionError وظيفة "األرضية" على النتيجة .القسمة على الصفر تثير
و(% مودولو) عامل ينتج ما تبقى من تقسيم الحجة األولى والثانية .يتم أوالً تحويل الوسيطات الرقمية إلى نوع شائع .حجة الصفر
االستثناء .قد تكون الوسيطات عبارة عن أرقام فاصلة عائمة ،على سبيل المثال 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 . :
والوظيفة لألرقام المركبة .بدالً من ذلك ،قم بالتحويل إلى رقم فاصلة divmod() لم يتم تحديد عامل تقسيم الطوابق ومشغل النموذج
.الوظيفة إذا كان ذلك مناسبًا)( absعائمة باستخدام
Pg. 78
و(+ إضافة) عامل ينتج مجموع حججها .يجب أن تكون الوسيطات إما أرقامًا أو أن تكون كالهما متواليات من نفس النوع .في الحالة
.األولى ،يتم تحويل األرقام إلى نوع شائع ثم يتم جمعها Lمعًا .في الحالة األخيرة ،يتم تسلسل التسلسالت
.و(- الطرح) عامل ينتج اختالف حججها .يتم أوالً تحويل الوسيطات الرقمية إلى نوع شائع
عمليات التحول6.8
هذه العوامل تقبل األعداد الصحيحة كوسيطات .يقومون بتحويل الوسيطة األولى إلى اليسار أو اليمين بعدد البتات المعطاة بواسطة
.الوسيطة الثانية
بت على n يتم تعريف إزاحة اليسار بمقدار pow(2,n). بت على أنها قسمة Lاألرضية على n يتم تعريف اإلزاحة الصحيحة بمقدار
pow(2,n).أنها عملية ضرب بـ
:لكل عملية من العمليات الثالث التي تتم باستخدام البتات مستوى أولوية مختلف
الوسائط الخاصة بها ،التي يجب أن تكون صحيحة أو واحد منهم يجب أن يكون كائن ANDفي& المشغل ينتج المختصة بالبت
.طرق خاصة)(__ __randأو)(__ __andمخصص تجاوز
من الحجج ،والتي يجب أن تكون صحيحة أو واحد منهم يجب أن يكون كائن ) ORحصري( أحادي المعامل XORفي^ المشغل غلة
.طرق خاصة)(__ __rxorأو)(__ __xorمخصص تجاوز
في| المشغل ينتج المختصة بالبت (ضمنا) أو الوسائط الخاصة بها ،التي يجب أن تكون صحيحة أو واحد منهم يجب أن يكون كائن
.طرق خاصة)(__ __rorأو)(__ __orمخصص تجاوز
6.10. Comparisons
لها نفس األولوية ،وهي أقل من أي عملية حسابية أو تحويلية أو عملية Pythonفإن جميع عمليات المقارنة في C ،على عكس لغة
:a < b < cفإن التعبيرات مثل لها التفسير التقليدي في الرياضيات C ،أحادي االتجاه .أي ً
ضا على عكس
"= !" | "=<" | "= >" | "==" | ">" | "<" = 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
يعرّ فون عوامل مقارنة الطلبات على أنها تعني اختبارات المجموعات الفرعية والمجموعات الفائقة .ال تحدد هذه العالقات إجمالي
الطلبات (على سبيل المثال ،المجموعتان}1,2{ وغير }2,3{ متساويتين ،وال مجموعات فرعية من بعضها البعض ،وال
على ( مجموعات شاملة من بعضها البعض) .وفقا لذلك ،ومجموعات ليست الحجج المناسبة للوظائف التي تعتمد على إجمالي الطلب
).المنتجات غير معرفة النتائج إعطاء قائمة مجموعات كمدخالت)( sortedو ، min()، max()،سبيل المثال
.معظم األنواع المضمنة األخرى ليس لها طرق مقارنة مطبقة ،لذا فهي ترث سلوك المقارنة االفتراضي
:يجب أن تتبع الفئات التي يحددها المستخدم والتي تخصص سلوك المقارنة بعض قواعد التناسق ،إن أمكن
:يجب أن تكون مقارنة المساواة انعكاسية .بمعنى آخر ،يجب أن تقارن الكائنات المتطابقة بالتساوي
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و
.على أنها غير قابلة للتجزئة
.ال تفرض بايثون قواعد التناسق هذه .في الواقع ،تعتبر قيم ليست رقمًا مثااًل على عدم اتباع هذه القواعد
ً
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هذا االستثناء)
مقارنات الهوية6.10.3.
و اختبار لهوية الكائن :صحيح إذا وفقط إذا س و ص هي نفس الكائن .يتم تحديد هوية الكائن باستخدام الوظيفة .ينتج قيمة isالمشغلين
is notx is yid()x is not yالحقيقة العكسية4 .
عمليات منطقية6.11.
في سياق العمليات المنطقية ،وأيضً ا عند استخدام التعبيرات بواسطة عبارات تدفق التحكم ،يتم تفسير القيم التالية على أنها
بما في ذلك السالسل ،والمجموعات ( ،والصفر الرقمي لجميع األنواع ،والسالسل والحاويات الفارغة: False، Noneخاطئة
يتم تفسير جميع القيم األخرى على أنها صحيحة .يمكن للكائنات المعرفة من frozensets). والقوائم ،والقواميس ،والمجموعات و
.طريقة)(__ __boolقبل المستخدم تخصيص قيمة الحقيقة الخاصة بها من خالل توفير
.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.
بينما يُرجع أيضًا a identifier،إلى expressionتعبير اإلسناد (يُسمى أحيا ًنا "تعبير مسمى" أو "فظ") يعين الحرف
expression.قيمة
)do_something(matching
)process(chunk
التعبيرات الشرطية6.13.
Python.التعبيرات الشرطية (تسمى أحيا ًن ا "عامل التشغيل الثالثي") لها أدنى أولوية لجميع عمليات
وإرجاع y ويتم إرجاع قيمتها ؛ وإال ،يتم تقييم x صحيحة ،يتم تقييم C إذا كانت x . بدالً من ، C يقوم التعبير أوالً بتقييم الشرط
.x if C else yقيمته
6.14. Lambdas
تستخدم تعبيرات المدا (تسمى أحيا ًنا نماذج المدا) إلنشاء دوال مجهولة المصدر .ينتج عن التعبير كائن دالة .يتصرف الكائن غير
:lambda parameters: expressionالمسمى ككائن دالة معرف بـ
def <lambda>(parameters):
return expression
ال lambdaانظر قسم تعريفات الوظائف للحصول على صيغة قوائم المعلمات .الحظ أن الداالت التي تم إنشاؤها باستخدام تعبيرات
.يمكن أن تحتوي على عبارات أو تعليقات توضيحية
قوائم التعبيرات6.15.
باستثناء عندما يكون جزء من قائمة أو عرض مجموعة ،فإن قائمة التعبير التي تحتوي على فاصلة واحدة على األقل ينتج عنها
.مجموعة .طول المجموعة هو عدد التعبيرات في القائمة .يتم تقييم التعبيرات من اليسار إلى اليمين
Pg. 83
تشير عالمة النجمة إلى التفريغ المتكرر . يجب أن يكون معاملها Lمتكررً ا . يتم توسيع العنصر المكرر إلى سلسلة من العناصر * ،
.والتي يتم تضمينها في المجموعة الجديدة ،أو القائمة ،أو المجموعة ،في موقع التفريغ
ضا باسم مفرد ) ؛ إنه اختياري في جميع الحاالت األخرى .ال يُنشئ الفاصلة الالحقة مطلوبة فقط إلنشاء مجموعة واحدة ( ُتعرف أي ً
تعبير واحد بدون فاصلة الحقة ص ًفا ،بل ينتج عنه قيمة هذا التعبير( .إلنشاء مجموعة فارغة ،استخدم زوجً ا فار ًغا من
األقواس))( .:
أمر التقييم6.16.
.تقيم بايثون التعبيرات من اليسار إلى اليمين .الحظ أنه أثناء تقييم الواجب ،يتم تقييم الجانب األيمن قبل الجانب األيسر
:في السطور التالية ،سيتم تقييم التعبيرات بالترتيب الحسابي للواحق الخاصة بها
الحظ أن المقارنات ،واختبارات العضوية ،واختبارات الهوية ،جميعها لها نفس األسبقية ولها ميزة تسلسل من اليسار إلى اليمين
.كما هو موضح في قسم المقارنات
(expressions...), تعبير ملزم أو بين قوسين ،عرض القائمة ،عرض القاموس ،عرض
}[expressions...], {key: value...}, {expressions... المجموعة
** األس5
Pg. 84
المشغل أو العامل وصف
>><<, التحوالت
not x ال
and ANDمنطقية
or ORمنطقي
الحواشي
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
ُ :ت ستخدم عبارات التخصيص من أجل (إعادة) ربط األسماء بالقيم ولتعديل سمات أو عناصر كائنات قابلة للتغيير
| attributeref
| subscription
| slicing
| "*"target
يقوم بيان التخصيص بتقييم قائمة التعبيرات (تذكر أن هذا يمكن أن يكون تعبيرً ا واح ًدا أو قائمة مفصولة بفاصلة ،حيث ينتج األخير
.عن مجموعة) ويقوم بتعيين الكائن الناتج الفردي لكل من قوائم الهدف ،من اليسار إلى اليمين
ً
اعتمادا على شكل الهدف (القائمة) .عندما يكون الهدف جزءًا من كائن قابل للتغيير (مرجع يتم تعريف التخصيص بشكل تكراري
سمة أو اشتراك أو تقسيم) ،يجب أن يقوم الكائن القابل للتغيير في النهاية بتنفيذ التخصيص واتخاذ قرار بشأن صالحيته ،وقد يثير
استثنا ًء إذا كان التعيين غير مقبول .يتم تقديم القواعد التي تمت مالحظتها من قبل األنواع المختلفة واالستثناءات التي أثيرت مع
.تعريف أنواع الكائنات (انظر القسم التسلسل الهرمي للنوع القياسي)
.يتم تحديد تخصيص كائن لقائمة هدف ،اختياريًا بين أقواس أو أقواس مربعة ،بشكل متكرر على النحو التالي
.إذا كانت قائمة الهدف هد ًفا واح ًدا بدون فاصلة الحقة ،اختياريًا بين قوسين ،يتم تعيين الكائن إلى ذلك الهدف
آخر :يجب أن يكون الكائن متكررً ا بنفس عدد العناصر حيث توجد أهداف في قائمة الهدف ،ويتم تعيين العناصر ،من
.اليسار إلى اليمين ،إلى األهداف المقابلة
o إذا كانت قائمة Lالهدف تحتوي على هدف واحد مسبوق بعالمة النجمة ،يسمى الهدف "المميز بنجمة" :يجب أن
يكون الكائن قاباًل للتكرار مع عدد من العناصر على األقل حيث توجد أهداف في قائمة الهدف ،مطروحً ا منها
واح ًدا .يتم تعيين العناصر األولى من العنصر القابل للتكرار ،من اليسار إلى اليمين ،إلى األهداف قبل الهدف
المميز بنجمة .يتم تعيين العناصر النهائية من القابل للتكرار لألهداف بعد الهدف المميز بنجمة .يتم بعد ذلك
.تعيين قائمة بالعناصر المتبقية في الملف القابل للتكرار إلى الهدف المميز بنجمة (يمكن أن تكون القائمة فارغة)
o آخر :يجب أن يكون الكائن متكررً ا بنفس عدد العناصر حيث توجد أهداف في قائمة الهدف ،ويتم تعيين
.العناصر ،من اليسار إلى اليمين ،إلى األهداف المقابلة
Pg. 87
.يتم تعريف إحالة كائن إلى هدف واحد بشكل متكرر على النحو التالي
o في كتلة التعليمات البرمجية الحالية :يرتبط االسم بالكائن في nonlocal أو globalإذا لم يظهر االسم في عبارة
.مساحة االسم المحلية الحالية
o nonlocal،خالف ذلك :يرتبط االسم بالكائن في مساحة االسم العامة أو مساحة Lاالسم الخارجية التي تحددها
.على التوالي
مقيدا بالفعل .قد يتسبب هذا في وصول عدد المراجع للكائن المرتبط مسب ًقا باالسم إلى الصفر ،مما يتسبب في
يرتد االسم إذا كان ً
.إلغاء تخصيص الكائن واستدعاء المدمر (إذا كان لديه واحد)
إذا كان الهدف مرجع سمة :يتم تقييم التعبير األساسي في المرجع .يجب أن تسفر عن كائن بسمات Lقابلة للتخصيص ؛ إذا لم
يتم رفعه .ثم يُطلب من هذا الكائن تعيين الكائن المعين إلى السمة المحددة ؛ إذا لم يتمكن ، TypeErrorيكن األمر كذلك
AttributeError).عادة ولكن ليس بالضرورة( من أداء المهمة ،فإنه يثير استثناء
فيمكن لتعبير الجانب ، a.xمالحظة :إذا كان الكائن عبارة عن مثيل لفئة وكان مرجع السمة يحدث على جانبي عامل التعيين
يتم دائمًا تعيين هدف الجانب األيسر . a.xاأليمن الوصول إما إلى سمة مثيل أو (في حالة عدم وجود سمة مثيل) إلى سمة فئة
ال يشير تواجدان لـ نفس السمة بالضرورة :إذا كان تعبير الجانب األيمن يشير ، a.xكسمة Lمثيل ،ويتم إنشاؤه إذا لزم األمر .وبالتالي
:إلى سمة فئة ،فإن الجانب األيسر ينشئ سمة مثيل جديدة كهدف للتخصيص
class Cls:
)(inst = Cls
property().ال ينطبق هذا الوصف بالضرورة على سمات Lالواصف ،مثل الخصائص التي تم إنشاؤها باستخدام
إذا كان الهدف عبارة عن اشتراك :يتم تقييم التعبير األساسي في المرجع .يجب أن ينتج إما كائن تسلسل قابل للتغيير (مثل
.قائمة) أو كائن تعيين (مثل القاموس) .بعد ذلك ،يتم تقييم التعبير المنخفض
إذا كان العنصر األساسي عبارة عن كائن تسلسل قابل للتغيير (مثل قائمة) ،فيجب أن ينتج عن الرمز المنخفض عد ًدا صحيحً ا .إذا
عددا صحيحً ا غير سالب أقل من طول التسلسل ،ويطلب كانت سالبة ،تتم إضافة طول المتسلسلة إليها .يجب أن تكون القيمة الناتجة ً
فسيتم رفعه (ال ، IndexErrorمن التسلسل تعيين الكائن المخصص لعنصره باستخدام هذا الفهرس .إذا كان الفهرس خارج النطاق
.يمكن أن يؤدي التعيين إلى تسلسل منخفض إلى إضافة عناصر جديدة إلى القائمة)
إذا كان العنصر األساسي عبارة عن كائن تعيين (مثل القاموس) ،فيجب أن يحتوي الرمز المنخفض على نوع متوافق مع نوع مفتاح
التعيين ،ثم يُطلب من التعيين إنشاء زوج مفتاح /مرجع يقوم بتعيين الرمز المنخفض إلى الكائن المعين .يمكن لهذا إما استبدال زوج
.مفتاح /قيمة موجود بنفس قيمة المفتاح ،أو إدراج زوج مفتاح /قيمة جديد (في حالة عدم وجود مفتاح بنفس القيمة)
.يتم استدعاء الطريقة بالوسيطات المناسبة)(__ ، __setitemبالنسبة للكائنات المعرفة من قبل المستخدم
إذا كان الهدف عبارة عن شرائح :يتم تقييم التعبير األساسي في المرجع .يجب أن ينتج عنه كائن تسلسل قابل للتغيير (مثل
قائمة) .يجب أن يكون الكائن المخصص كائن تسلسل من نفس النوع .بعد ذلك ،يتم تقييم تعابير الحد األدنى واألعلى ،إذا
كانت موجودة ؛ القيم االفتراضية هي صفر وطول التسلسل .يجب أن يتم تقييم الحدود إلى أعداد صحيحة .إذا كان أي من
الحدين سالبًا ،فسيتم إضافة طول التسلسل إليه .يتم قص الحدود الناتجة لتقع بين الصفر وطول التسلسل ،شامالً .أخيرً ا ،
يُطلب من كائن التسلسل استبدال الشريحة بعناصر التسلسل المعين .قد يختلف طول الشريحة عن طول التسلسل المخصص
،.وبالتالي تغيير طول التسلسل المستهدف ،إذا كان التسلسل الهدف يسمح بذلك
في التنفيذ الحالي ،يتم اعتبار بناء جملة األهداف هو نفسه كما في التعبيرات ،ويتم رفض البنية غير CPython: تفاصيل تنفيذ
.الصالحة أثناء مرحلة إنشاء الكود ،مما يتسبب في ظهور رسائل خطأ أقل تفصيالً
Pg. 88
على الرغم من أن تعريف التخصيص يشير إلى أن التداخل بين الجانب األيسر والجانب األيمن هو "متزامن" (على سبيل
المثال تبديل متغيرين) ،تحدث التداخالت داخل مجموعة المتغيرات المخصصة إلى اليسار ،مما يؤدي في بعض األحيان في
] :a, b = b, a[0, 2حيرة .على سبيل المثال ،يقوم البرنامج التالي بطباعة
i=0
)print(x
أنظر أيضا
.بالميزة *targetالمواصفات الخاصة
:التخصيص المعزز هو الجمع ،في بيان واحد ،من عملية ثنائية وبيان تخصيص
) | ( = augmented_assignment_stmt ::
augop "= **" | "= :: = "+ =" | "- =" | "* =" | "@ =" | "/ =" | "// =" | "٪
"= |" | "= ^" | "= &" | "= <<" | "= >>" |
تقوم المهمة Lالمتزايدة بتقييم الهدف (الذي ،على عكس عبارات التخصيص العادية ،ال يمكن أن يكون تفري ًغا) وقائمة التعبير ،وتنفذ
.العملية الثنائية الخاصة بنوع المهمة Lفي المعاملين ،وتعين النتيجة إلى الهدف األصلي .يتم تقييم الهدف مرة واحدة فقط
يمكن إعادة كتابة تعبير التعيين المعزز لتحقيق تأثير مماثل ،ولكن ليس متساويًا تمامًا .في اإلصدار المعزز ،يتم تقييمه مرة واحدة
فقط .أيضً ا ،عندما يكون ذلك ممك ًنا ، Lيتم تنفيذ العملية الفعلية في نفس المكان ، مما يعني أنه بدالً من إنشاء كائن جديد وتعيين ذلك
.x += 1x = x + 1xللهدف ،يتم تعديل الكائن القديم بدالً من ذلك
على عكس المهام العادية ،تقوم المهام Lالمعززة بتقييم الجانب األيسر قبل تقييم الجانب األيمن .على سبيل المثال ،البحث أوالً ، ثم
] .a[i] += f(x)a[i]f(x)a[iيقوم بتقييم اإلضافة وتنفيذها ،وأخيرً ا ،يكتب النتيجة مرة أخرى
باستثناء التخصيص إلى مجموعات وأهداف متعددة في عبارة واحدة ،تتم معالجة المهمة التي يتم إجراؤها بواسطة عبارات التعيين
المُزايدة بنفس طريقة التخصيصات العادية .وبالمثل ،مع استثناء من الممكن في مكان السلوك ،وهذه العملية الثنائية التي يقوم بها
.االحالة المعزز هو نفس العمليات الثنائية العادية
.بالنسبة لألهداف التي تكون مراجع السمات ، Lينطبق نفس التحذير حول سمات الفئة والمثيل كما هو الحال بالنسبة للتعيينات العادية
:إسناد التعليق التوضيحي هو الجمع ،في بيان واحد ،من تعليق توضيحي متغير أو سمة وبيان تخصيص اختياري
Pg. 89
بالنسبة لألسماء Lالبسيطة كأهداف تعيين ،إذا كانت في نطاق فئة أو وحدة نمطية ،يتم تقييم التعليقات التوضيحية وتخزينها في فئة
عبارة عن تعيين قاموس من أسماء المتغيرات (مشوهة إذا كانت خاصة) للتعليقات __annotations__ خاصة أو سمة وحدة نمطية
التوضيحية التي تم تقييمها .هذه السمة قابلة للكتابة ويتم إنشاؤها تلقائيًا في بداية فئة أو تنفيذ جسم الوحدة النمطية ،إذا تم العثور على
.التعليقات التوضيحية بشكل ثابت
.بالنسبة للتعبيرات كأهداف تعيين ،يتم تقييم التعليقات التوضيحية إذا كانت في نطاق فئة أو وحدة نمطية ،ولكن لم يتم تخزينها
إذا تم التعليق على اسم في نطاق دالة ،فسيكون هذا االسم محليًا لهذا النطاق .ال يتم تقييم التعليقات التوضيحية مطل ًقا وتخزينها في
.نطاقات Lالوظائف
إذا كان الجانب األيمن موجو ًد ا ،فإن التعيين المشروح يؤدي المهمة الفعلية قبل تقييم التعليقات التوضيحية (عند االقتضاء) .إذا لم يكن
)(__ __setattrأو)(__ __setitemالجانب األيمن موجو ًد ا لهدف تعبير ،فسيقوم المترجم الفوري بتقييم الهدف باستثناء األخير
.المكالمةL
أنظر أيضا
االقتراح الذي أضاف بناء الجملة للتعليق على أنواع المتغيرات (بما في ذلك متغيرات الفئة ومتغيرات الحالة) ،بدالً من التعبير عنها
.من خالل التعليقات
الوحدة النمطية لتوفير بناء جملة قياسي لشروح النوع التي يمكن استخدامها في أدوات التحليل الثابت و typingاالقتراح الذي أضاف
IDEs.
تم التغيير في اإلصدار :3.8تتيح التخصيصات المشروحة اآلن نفس التعبيرات في الجانب األيمن مثل التعيينات العادية .في
.السابق ،تسببت بعض التعبيرات (مثل تعبيرات المجموعة غير المقوسة) في حدوث خطأ في بناء الجملة
بيان assertفي7.3.
if __debug__:
if __debug__:
تشير إلى المتغيرات المدمج في مع تلك األسماء .في تنفيذ الحالي AssertionError ،و__ __debugتفترض هذه المعادالت التي
ال يصدر -O). خيار سطر األوامر( عندما يطلب األمثل، Falseظل الظروف العادية Trueغير__ __debugالمتغير المدمج في
منشئ الكود الحالي أي رمز لبيان التأكيد عند طلب التحسين في وقت الترجمة .الحظ أنه من غير الضروري تضمين التعليمات
.البرمجية المصدر للتعبير الذي فشل في رسالة الخطأ ؛ سيتم عرضه كجزء من تتبع المكدس
.غير قانونية .يتم تحديد قيمة المتغير الداخلي عندما يبدأ المترجم__ __debugالتخصيصات إلى
بيان passفي7.4.
Pg. 90
هي عملية الغية -عندما يتم تنفيذها ،ال يحدث شيء .يكون مفي ًد ا كعنصر نائب عندما تكون العبارة مطلوبة من الناحية pass
:التركيبية ،ولكن ال يلزم تنفيذ أي تعليمات برمجية ،على سبيل المثال
بيان delفي7.5
del_stmt :: = "del"target_list
جدا للطريقة التي يتم بها تعريف التخصيص .بدالً من تهجئتها بتفاصيل كاملة ،إليك بعض
يتم تعريف الحذف تكراريًا بشكل مشابه ً
.التلميحاتL
.يؤدي حذف قائمة األهداف إلى حذف كل هدف بشكل متكرر ،من اليسار إلى اليمين
في globalيؤدي حذف االسم إلى إزالة ارتباط هذا االسم من مساحة االسم المحلية أو العالمية ،اعتما ًدا على ما إذا كان االسم يظهر
.فسيظهر استثناء ، NameErrorجملة في نفس كتلة التعليمات البرمجية .إذا كان االسم غير منضم
يتم تمرير حذف مراجع السمات Lواالشتراكات والتقطيع إلى الكائن األساسي المعني ؛ يعد حذف التقطيع بشكل عام مكاف ًئا لتخصيص
.شريحة فارغة من النوع الصحيح (ولكن حتى هذا يتم تحديده بواسطة الكائن المقطوع)
تم التغيير في اإلصدار :3.2في السابق كان من غير القانوني حذف اسم من مساحة Lاالسم المحلية إذا حدث كمتغير مجاني في كتلة
.متداخلة
بيان returnفي7.6.
.قد تحدث فقط متداخلة نحويًا في تعريف دالة ،وليس ضمن تعريف فئة متداخلةreturn
.يتم تنفيذ بند قبل ان يغادر حقا وظيفة finallyشرط أن finallyالبيان مع tryتسيطر على ممرات للخروج من returnعندما
إلى رفعه .يتم استخدام القيمة التي تم StopIterationيشير البيان إلى أن المولد قد اكتمل وسيؤدي ، returnفي وظيفة المولد
.سمة StopIteration.valueوتصبح StopIterationإرجاعها (إن وجدت) كوسيطة لبناء
تشير العبارة الفارغة إلى أن المولد غير المتزامن قد اكتمل ، returnفي وظيفة المولد غير المتزامن
.العبارة غير الفارغة هي خطأ في بناء الجملة في وظيفة منشئ غير متزامن. return إلى رفعه StopAsyncIterationوسيؤدي
بيان yieldفي7.7
:: = yield_expressionالعائد_ستمت
بيان ما يعادل غويا إلى التعبير العائد . يمكن استخدام بيان العائد لحذف األقواس التي قد تكون مطلوبة في بيان تعبير العائد yieldو
المكافئ .على سبيل المثال ،بيانات العائد
>yield <expr
)>(yield <expr
Pg. 91
)>(yield from <expr
ُتستخدم عبارات وعبارات المحصول فقط عند تحديد وظيفة المولد ، وال ُتستخدم إال في جسم وظيفة المولد .يعد استخدام العائد في
.تعريف دالة كافيًا لجعل هذا التعريف ينشئ وظيفة مولد بدالً من وظيفة عادية
بيان raiseفي7.8
إذا كانت BaseException. تقييم التعبير األول على أنه كائن استثناء .يجب أن يكون إما فئة فرعية أو مثيالً لـ raiseوإال ،يتم
.فئة ،فسيتم الحصول على مثيل االستثناء عند الحاجة من خالل إنشاء مثيل للفئة بدون وسيطات
والتي يمكن الكتابة عليها .يمكنك __traceback__،تلقائيًا عند ظهور استثناء وإرفاقه كسمة tracebackعادة ما يتم إنشاء كائن
التي ُترجع نفس ( طريقة االستثناء)( with_tracebackالخاص بك في خطوة واحدة باستخدام tracebackإنشاء استثناء وتعيين
:مثل ) ،الخاص به على وسيطته tracebackمثيل االستثناء ،مع تعيين
يستخدم بند لتسلسل استثناء :إذا ما أعطيت ،والثاني التعبير يجب أن تكون الطبقة استثناء آخر أو مثيل .إذا كان التعبير الثاني fromو
السمة (وهي قابلة للكتابة) .إذا كان التعبير عبارة __ __causeعبارة عن مثيل استثناء ،فسيتم إرفاقه باالستثناء الذي ظهر على أنه
السمة .إذا لم __ __causeعن فئة استثناء ،فسيتم إنشاء مثيل للفئة وسيتم إرفاق مثيل االستثناء الناتج باالستثناء الذي ظهر على أنه
:تتم معالجة االستثناء الذي تم طرحه ،فستتم طباعة كال االستثناءين
>>>
>>> try:
...
The above exception was the direct cause of the following exception:
Pg. 92
تعمل آلية مماثلة ضمنيًا في حالة ظهور استثناء داخل معالج استثناء أو finally يتم بعد ذلك إرفاق االستثناء السابق كسمة:جملة
استثناء جديدة __context__:
>>>
>>> try:
... print(1 / 0)
... except:
...
>>>
>>> try:
... print(1 / 0)
... except:
...
كما توجد معلومات حول معالجة االستثناءات في، "استثناءات " يمكن العثور على معلومات إضافية حول االستثناءات في قسم
"بيان المحاولة "قسم .
7.9. في breakبيان
Pg. 93
"استراحة" = break_stmt ::
.حلقة ،ولكنها غير متداخلة في تعريف دالة أو فئة داخل تلك الحلقة whileأو forقد تحدث فقط متداخلة نحويًا في حلقةbreak
.إذا كانت الحلقة تحتوي على واحدة else إنها تنهي أقرب حلقة مغلقة ،متخطية الجملة االختيارية
.فإن هدف التحكم في الحلقة يحتفظ بقيمته الحالية break،تم إنهاء حلقة بواسطة forإذا
.يتم تنفيذ بند قبل ان يغادر حقا الحلقة finallyشرط أن finallyالبيان مع tryتسيطر على ممرات للخروج من breakعندما
بيان continueفي7.10.
حلقة ،ولكنها غير متداخلة في تعريف دالة أو فئة داخل تلك الحلقة while.أو forقد تحدث فقط متداخلة نحويًا في حلقةcontinue
.وتستمر مع الدورة التالية ألقرب حلقة مغلقة
يتم تنفيذ هذه الجملة قبل البدء الفعلي ، finallyجملة finallyعبارة تحتوي على tryتمرير عنصر التحكم خارج continueعندما يتم
.في دورة الحلقة التالية
بيان importفي7.11.
عندما تحتوي العبارة على عبارات متعددة (مفصولة بفواصل) ،يتم تنفيذ الخطوتين بشكل منفصل لكل بند ،تمامًا كما لو تم فصل
.الجمل في عبارات استيراد فردية
يتم وصف تفاصيل الخطوة األولى ،البحث عن الوحدات النمطية وتحميلها بمزيد من التفصيل في القسم الخاص بنظام االستيراد،
والذي يصف أي ً
ض ا األنواع المختلفة للحزم والوحدات النمطية التي يمكن استيرادها ،باإلضافة إلى جميع الخطافات Lالتي يمكن
استخدامها تخصيص نظام االستيراد .الحظ أن حاالت الفشل في هذه الخطوة قد تشير إما إلى أنه ال يمكن تحديد موقع الوحدة النمطية
،.أو حدوث خطأ أثناء تهيئة الوحدة ،والذي يتضمن تنفيذ رمز الوحدة النمطية
:إذا تم استرداد الوحدة المطلوبة بنجاح ،فسيتم إتاحتها في مساحة Lاالسم المحلية بإحدى الطرق الثالث
ً
.مرتبطا مباشرة بالوحدة المستوردة asفسيكون االسم التالي as،إذا كان اسم الوحدة متبوعًا
إذا لم يتم تحديد أي اسم آخر ،وكانت الوحدة النمطية التي يتم استيرادها هي وحدة نمطية ذات مستوى أعلى ،فسيتم ربط
اسم الوحدة في مساحة االسم المحلية كمرجع إلى الوحدة النمطية المستوردة
Pg. 94
إذا لم تكن الوحدة النمطية التي يتم استيرادها وحدة نمطية ذات مستوى أعلى ،فسيتم ربط اسم حزمة المستوى األعلى التي
تحتوي على الوحدة في مساحة Lاالسم المحلية كمرجع إلى حزمة المستوى األعلى .يجب الوصول إلى الوحدة التي تم
استيرادها باستخدام اسمها المؤهل الكامل بدالً من الوصول إليها مباشرة
الفقرة ،وتحميلها وتهيئتها إذا لزم األمر ؛ fromالعثور على الوحدة المحددة في 1.
تحقق مما إذا كانت الوحدة التي تم استيرادها لها سمة بهذا االسم 1.
إذا لم يكن كذلك ،فحاول استيراد وحدة فرعية بهذا االسم ثم تحقق من الوحدة المستوردة مرة أخرى لتلك السمة 2.
الجملة إذا كان asخال ًف ا لذلك ،يتم تخزين مرجع لتلك القيمة في مساحة االسم المحلية ،باستخدام االسم في 4.
ً
موجودا ،وإال باستخدام اسم السمة
:أمثلة
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 ::
يجب أن تظهر العبارة المستقبلية بالقرب من الجزء العلوي من الوحدة النمطية .األسطر الوحيدة التي يمكن أن تظهر قبل البيان
:المستقبلي هي
،تعليقات
أسطر فارغة و
جميع الميزات التاريخية مكنت من بيان المستقبل ال تزال تعترف بها بيثون .3قائمة
absolute_import، division، generators، generator_stop، unicode_literals، print_function، nestedتضم
.كلها زائدة عن الحاجة ألنها مم ّكنة دائ ًما ،ويتم االحتفاظ بها فقط للتوافق مع اإلصدارات السابقة with_statement. و_scopes
يتم التعرف على البيان المستقبلي ومعالجته بشكل خاص في وقت الترجمة :غالبًا ما يتم تنفيذ التغييرات في دالالت التركيبات
األساسية عن طريق إنشاء رمز مختلف .قد يكون األمر كذلك أن تقدم ميزة جديدة بناء جملة غير متوافق جديد (مثل كلمة محجوزة
.جديدة) ،وفي هذه الحالة قد يحتاج المترجم إلى تحليل الوحدة بشكل مختلف .ال يمكن تأجيل مثل هذه القرارات حتى وقت التشغيل
بالنسبة ألي إصدار معين ،يعرف المترجم أسماء الميزات التي تم تعريفها ،ويثير خطأ وقت الترجمة إذا احتوى البيان المستقبلي
.على ميزة غير معروفة له
موصوفة __future__،دالالت وقت التشغيل المباشر هي نفسها المستخدمة Lفي أي عبارة استيراد :هناك وحدة نمطية قياسية
.الح ًق ا ،وسيتم استيرادها بالطريقة المعتادة في وقت تنفيذ البيان المستقبلي
.تعتمد دالالت وقت التشغيل المثيرة لالهتمام على الميزة المحددة التي تم تمكينها بواسطة بيان المستقبل
.هذا ليس بيانا في المستقبل .إنه بيان استيراد عادي بدون قيود دالالت خاصة أو نحوية
تحتوي على بيان Mالتي تحدث في وحدة نمطية compile() و)( execالتعليمات البرمجية المترجمة دعوات إلى المدمج في وظائف
المستقبل ،افتراضيا ،استخدم بناء الجملة جديد أو دالالت المرتبطة بيان المستقبل .يمكن التحكم في ذلك بواسطة وسيطات اختيارية
.راجع توثيق تلك الوظيفة للحصول على التفاصيل compile()-لـ
بالخيار ،وتم -iالبيان المستقبلي المكتوب في موجه المترجم التفاعلي ساري المفعول لبقية جلسة المترجم الفوري .إذا بدأ المترجم
تمرير اسم البرنامج النصي لتنفيذه ،ويتضمن البرنامج النصي بيا ًنا مستقبليًا ،فسيكون ساري المفعول في الجلسة التفاعلية التي تبدأ
.بعد تنفيذ البرنامج النصي
Pg. 96
أنظر أيضا
بيان globalفي7.12.
بيان هو اإلعالن الذي يحمل لكتلة القانون الحالي بأكمله .وهذا يعني أنه يجب تفسير المعرفات المدرجة على أنها globalفي
على الرغم من أن المتغيرات المجانية قد تشير إلى global،جلوبالس .سيكون من المستحيل التخصيص إلى متغير عالمي بدونه
.دون اإلعالن عن كونها عالمية globals
.العبارة نصًا globalيجب عدم استخدام األسماء Lالمدرجة في بيان في نفس كتلة التعليمات البرمجية التي تسبق هذهglobal
جمل ،أو exceptعبارات أو withيجب أال يتم تعريف األسماء Lالمدرجة في بيان على أنها معلمات رسمية ،أو كأهداف فيglobal
.أو تعريف الوظيفة ، أو البيان ،أو التعليق التوضيحي المتغير import،أو التعريف ، class قائمة الهدف forفي
ال يفرض التنفيذ الحالي بعض هذه القيود ،ولكن يجب أال تسيء البرامج إساءة استخدام هذه الحرية CPython: ،تفاصيل تنفيذ
.حيث قد تفرضها عمليات التنفيذ المستقبلية أو تغير معنى البرنامج بصمت
البيان .عل globalهي توجيه إلى المحلل اللغوي .إنه ينطبق فقط على الكود الذي تم تحليله في نفس وقت: global مالحظة المبرمج
للدالة المضمنة على كتلة التعليمات )( execالعبارة المضمنة في سلسلة أو كائن رمز يتم توفيره globalى وجه الخصوص ،ال تؤثر
بعبارات في الكود الذي يحتوي globalالبرمجية التي تحتوي على استدعاء الوظيفة ،وال يتأثر الكود الموجود في مثل هذه السلسلة
compile().و)( evalعلى استدعاء الوظيفة .األمر نفسه ينطبق على وظائف
بيان nonlocalفي7.13.
يسبب بيان معرفات 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_stmtمجمع_ستمت
| while_stmt
| for_stmt
| try_stmt
| with_stmt
| match_stmt
| funcdef
| classdef
| async_with_stmt
| async_for_stmt
|async_funcdef
الحظ أيضً ا أن عبارات المتابعة االختيارية تبدأ DEDENT. بحرف ربما متبوعً ا بامتداد NEWLINEالحظ أن العبارات تنتهي دائمًا
من خالل Pythonيتم حل مشكلة التعلق في ( elseدائ ًم ا بكلمة رئيسية ال يمكن أن تبدأ عبارة ،وبالتالي ال توجد أي غموض
).عبارات متداخلة لتكون مسافة Lبادئة ifطلب
.يؤدي تنسيق القواعد النحوية في األقسام التالية إلى وضع كل عبارة في سطر منفصل للتوضيح
بيان ifفي8.1
بيان whileفي8.2
Pg. 98
while_stmt :: = "while" assignment_expression":" suite
هذا يختبر التعبير بشكل متكرر ،وإذا كان صحيحً ا ،يتم تنفيذ المجموعة األولى ؛ إذا كان التعبير خاط ًئا (والتي قد تكون المرة األولى
.يتم تنفيذ مجموعة الجملة ،إن وجدت ،وتنتهي الحلقة else،التي يتم اختبارها فيها)
بيان تنفيذها في الجناح األول يتخطى. A continue جناح شرط ل elseبيان تنفيذها في الجناح األول إنهاء حلقة دون تنفيذA break
.بقية جناح ويعود الى اختبار التعبير
بيان forفي8.3
:العبارة للتكرار على عناصر تسلسل (مثل سلسلة أو مجموعة أو قائمة) أو كائن آخر قابل للتكرارُ forتستخدم
ثم يتم expression_list. يتم تقييم قائمة التعبير مرة واحدة ؛ يجب أن ينتج عنه كائن قابل للتكرار .يتم إنشاء مكرر لنتيجة ملف
تنفيذ المجموعة مرة واحدة لكل عنصر يوفره المكرر ،بالترتيب الذي يتم إرجاعه بواسطة المكرر .يتم تعيين كل عنصر بدوره إلى
قائمة الهدف باستخدام القواعد القياسية للتخصيصات (انظر عبارات التخصيص ، ) ثم يتم تنفيذ المجموعة .عندما يتم استنفاد
elseيتم تنفيذ المجموعة في ) ،استثناءً StopIterationوهو ما يحدث فورً ا عندما يكون التسلسل فار ًغا أو يثير المكرر( العناصر
.الجملة ،إن وجدت ،وتنتهي الحلقة
بيان تنفيذها في الجناح األول يتخطى. A continue جناح شرط ل elseبيان تنفيذها في الجناح األول إنهاء حلقة دون تنفيذA break
.الشرط إذا كان هناك أي بند المقبل elseبقية جناح ويستمر مع البند التالي ،أو مع
بتخصيصات للمتغيرات في قائمة الهدف .يؤدي هذا إلى استبدال جميع التعيينات السابقة لتلك المتغيرات بما في for-loopتقوم حلقة
for-loop:ذلك تلك التي تم إجراؤها في مجموعة
for i in range(10):
)print(i
ال يتم حذف األسماء الموجودة في قائمة Lالهدف عند انتهاء الحلقة ،ولكن إذا كان التسلسل فار ًغا ،فلن يتم تعيينها على اإلطالق
بإرجاع مكرر من األعداد الصحيحة المناسبة لمحاكاة تأثير باسكال ؛ على سبيل )( rangeبواسطة الحلقة .تلميح :تقوم الدالة المضمنة
] .for i := a to b dolist(range(3))[0, 1, 2المثال ،إرجاع القائمة
ملحوظة
هناك دقة عندما يتم تعديل التسلسل بواسطة الحلقة (يمكن أن يحدث هذا فقط للتسلسالت Lالقابلة للتغيير ،مثل القوائم) .يتم استخدام
عداد داخلي لتتبع العنصر الذي سيتم استخدامه بعد ذلك ،ويتم زيادة هذا في كل تكرار .عندما يصل هذا العداد إلى طول التسلسل ،
تنتهي الحلقة .هذا يعني أنه إذا حذفت المجموعة العنصر الحالي (أو العنصر السابق) من التسلسل ،فسيتم تخطي العنصر التالي
(نظرً ا ألنه يحصل على فهرس العنصر الحالي الذي تمت معالجته بالفعل) .وبالمثل ،إذا قامت Lالمجموعة بإدراج عنصر في التسلسل
قبل العنصر الحالي ،فسيتم التعامل مع العنصر الحالي مرة أخرى في المرة التالية من خالل الحلقة .يمكن أن يؤدي هذا إلى أخطاء
،سيئة يمكن تجنبها عن طريق عمل نسخة مؤقتة باستخدام شريحة من التسلسل بأكمله ،على سبيل المثال
for x in a[:]:
Pg. 99
بيان tryفي8.4
try_stmt :: = try1_stmt|try2_stmt
الجملة ،ال يتم تنفيذ أي معالج 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
>>> try:
... except:
... ))(print(sys.exc_info
... try:
... except:
... ))(print(sys.exc_info
... ))(print(sys.exc_info
...
))(>>> print(sys.exc_info
أعدم breakأو return، continueجناح ،أثيرت يست استثناء ،وليس tryيتم تنفيذ الشرط إذا ترك تدفق سيطرة elseاختياري
.البنود السابقة except ال يتم التعامل مع االستثناءات الواردة في الجملة من خالل. elseبيان
البنود .إذا حدث استثناء في elseو exceptيتم تنفيذ بند ،بما في ذلك أي tryموجو ًدا ،فإنه يحدد معالج "تنظيف" .و finallyإذا كان
يتم تنفيذ الشرط .إذا كان هناك استثناء محفوظ ،فسيتم إعادة finallyأي من الجمل ولم تتم معالجته ،فسيتم حفظ االستثناء مؤق ًتا .و
أثارت الجملة استثنا ًء آخر ،فسيتم تعيين االستثناء المحفوظ كسياق االستثناء الجديد .إذا finallyالجملة .إذا finallyإظهاره في نهاية
:بيان ،يتم تجاهل استثناء المحفوظة continueأو return، break تنفيذ بند و finallyكان
>>>
... try:
... 1/0
... finally:
...
Pg. 101
)(>>> f
42
يتم تنفيذ الشرط أيضا "على finallyبيان ،و try... finally جناح من tryيتم تنفيذ بيان في continueأو return، breakعندما
".طريقة للخروج
تنفيذها دائمًا ،فإن returnالجملة يتم finallyعبارة تم تنفيذها .نظرً ا ألن return يتم تحديد قيمة اإلرجاع للدالة من خالل آخر
:الجملة ستكون دائمًا آخر جملة يتم تنفيذها finallyالجملة المنفذة في
>>>
... try:
... finally:
...
)(>>> foo
''finally
raiseيمكن العثور على معلومات إضافية حول االستثناءات في قسم االستثناءات ، ويمكن العثور على معلومات حول استخدام
.العبارة إلنشاء استثناءات في القسم بيان الزيادة
الفقرة نظرً ا لوجود مشكلة في finallyكانت العبارة غير قانونية في Python 3.8 ، continueتم التغيير في اإلصدار :3.8قبل
.التنفيذ
بيان withفي8.5
يستخدم بيان لاللتفاف على تنفيذ كتلة مع األساليب التي يعرفها مدير السياق (انظر القسم مع مدراء بيان السياق .) وهذا withو
.أنماط االستخدام لتكون مغلفة إلعادة استخدامها مريحة try... except... finally يسمح مشترك
.للحصول على مدير سياق ) with_itemالتعبير الوارد في( يتم تقييم تعبير السياق 1.
ملحوظة
Pg. 102
سوف دائما يتم استدعاؤها .وبالتالي __exit__() ،إرجاع األسلوب دون خطأ ،ثم __enter__() تضمن البيان أنه إذا كان withو
إذا حدث خطأ أثناء التخصيص لقائمة الهدف ،فسيتم التعامل معه بنفس طريقة التعامل مع الخطأ الذي يحدث داخل المجموعة .انظر
.الخطوة 6أدناه
تم استدعاء طريقة مدير السياق . إذا تسبب أحد االستثناءات في خروج المجموعة ،فسيتم تمرير نوعها )(__7. __exit
.يتم توفير ثالث حجج ، Noneخالف ذلك __exit__(). كوسيطات إلى tracebackوقيمتها و
الطريقة خاطئة ،تتم إعادة االستثناء .إذا كانت )(__ __exitإذا تم الخروج من المجموعة بسبب استثناء ،وكانت القيمة المعادة من
.العبارة withقيمة اإلرجاع صحيحة ،يتم منع االستثناء ،ويستمر التنفيذ مع العبارة التي تلي
يتم تجاهل قيمة اإلرجاع من ، ويستمر التنفيذ في الموقع )(__ ، __exitإذا تم الخروج من المجموعة ألي سبب بخالف االستثناء
.الطبيعي لنوع المخرج الذي تم اتخاذه
:الكود التالي
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
raise
finally:
:عبارات متداخلة withمع وجود أكثر من عنصر واحد ،تتم معالجة مديري السياق كما لو كانت عدة
Pg. 103
SUITE
:يعادل لغويًا
SUITE
:يمكنك أي ً
ض ا كتابة مديري سياق متعدد العناصر في سطور متعددة إذا كانت العناصر محاطة بأقواس .على سبيل المثال
( with
A() as a,
B() as b,
):
SUITE
.تم التغيير في اإلصدار :3.10دعم استخدام أقواس التجميع لكسر العبارة في أسطر متعددة
أنظر أيضا
بيان matchفي8.6
| named_expression
ملحوظة
.يستخدم هذا القسم عالمات االقتباس المفردة لإلشارة إلى الكلمات الرئيسية الناعمة
تتم مطابقة النمط (الذي قد يحتوي على أنماط فرعية) match). تالي( وقيمة موضوع ) caseيلي( تأخذ مطابقة النمط ً
نمطا كمدخل
:مع قيمة الموضوع .النتائج هي
.ربط محتمل للقيم المتطابقة باسم .تتم مناقشة Lالمتطلبات المسبقة لذلك أدناه
أنظر أيضا
Pg. 104
مطابقة األنماط الهيكلية :المواصفات PEP 634 -
8.6.1. Overview
يتم تقييم تعبير الموضوع والحصول على قيمة الموضوع الناتجة .إذا احتوى تعبير الموضوع على فاصلة 1. subject_expr
، .يتم إنشاء مجموعة باستخدام القواعد القياسية
ليتطابق مع قيمة الموضوع .القواعد المحددة للنجاح أو الفشل موضحة أدناه .يمكن a تتم محاولة كل نمط في2. case_block
أن تربط محاولة المطابقة أيضً ا بعض أو كل األسماء المستقلة داخل النمط .تختلف قواعد ربط النمط الدقيقة حسب Lنوع
النمط وهي محددة أدناه .روابط االسم التي تم إجراؤها أثناء مطابقة النمط الناجحة تتجاوز الكتلة المنفذة ويمكن
.استخدامها بعد بيان المطابقة
ملحوظة
أثناء تطابق النمط الفاشل ،قد تنجح بعض األنماط الفرعية .ال تعتمد على االرتباطات التي يتم إجراؤها لمباراة فاشلة .على العكس
من ذلك ،ال تعتمد على المتغيرات التي تظل دون تغيير بعد مطابقة فاشلة .يعتمد السلوك الدقيق على التنفيذ وقد يختلف .هذا قرار
.مقصود تم اتخاذه للسماح بالتطبيقات المختلفة إلضافة تحسينات
.إذا نجح النمط ،يتم تقييم الحارس المقابل (إن وجد) .في هذه الحالة ،يتم ضمان حدوث جميع عمليات ربط األسماء3. L
o .إذا لم تكن هناك كتل حالة أخرى ،يتم إكمال بيان المباراة
ملحوظة
اعتماد ا على التنفيذ ،قد يقوم المترجم بتخزين القيم مؤق ًتا أو استخدام
ً يجب أال يعتمد المستخدمون بشكل عام على نمط يتم تقييمه .
.تحسينات أخرى تتخطى التقييمات Lالمتكررة
>>>
... case (100, 200) if flag: # Successful match, but guard fails
Pg. 105
... )'!print('Case 4, I match anything
...
Case 3, y: 200
8.6.2. Guards
متبوعًا : ifحتى يتم تنفيذ التعليمات البرمجية داخل الكتلة .يأخذ الشكل case) caseالذي يعد جزءًا من( A guardيجب أن ينجح
.بتعبير
.ويتم فحص الكتلة التالية caseفلن يتم تقييمه ، guardالكتلة .إذا فشل النمط caseتحقق من نجاح النمط في 1.
o .تقييم الشرط على أنه صحيح ،يتم تحديد كتلة الحالة guardإذا تم
o .تقييم الشرط على أنه خطأ ،فلن يتم تحديد كتلة الحالة guardإذا تم
يسمح للحراس بالتعرض آلثار جانبية ألنها تعبيرات .يجب أن ينتقل تقييم الحراسة من أول كتلة حالة إلى أخرى ،واحدة تلو األخرى
،مع تخطي كتل الحالة التي ال ينجح نمطها (أنماطها) كلها( .أي ،تقييم الحارس يجب أن يتم بالترتيب) .يجب أن يتوقف تقييم
.الحراسة بمجرد تحديد مجموعة حالة
كتلة الحالة التي ال يمكن دحضها هي كتلة حالة تطابق جميع .قد يحتوي بيان المطابقة على مجموعة حالة واحدة على األكثر ال يمكن
.دحضها ،ويجب أن تكون أخيرً ا
تعتبر كتلة العلبة غير قابلة للدحض إذا لم يكن بها حراسة وكان نمطها غير قابل للدحض .يعتبر النمط غير قابل للدحض إذا استطعنا
:أن نثبت من تركيبه وحده أنه سينجح دائمًا .فقط األنماط التالية ال يمكن دحضها
أو األنماط التي تحتوي على نمط واحد على األقل ال يمكن دحضه
التقاط األنماط
أنماط البدل
أنماط ال يمكن دحضها بين قوسين
8.6.4. Patterns
ملحوظة
Pg. 106
:هي patternsصيغة المستوى األعلى لـ
:: = | literal_patternمغلق_باترن
| capture_pattern
| wildcard_pattern
| value_pattern
| group_pattern
| sequence_pattern
| mapping_pattern
|class_pattern
لمستند Raymond Hettingerاعتمادات لـ( ستتضمن األوصاف أدناه وص ًف ا "بعبارات بسيطة" لما يفعله النمط ألغراض التوضيح
الحظ أن هذه األوصاف هي ألغراض التوضيح فقط وقد ال تعكس التنفيذ األساسي .عالوة على ذلك ،فهي ال). ألهم معظم األوصاف
.تغطي جميع النماذج الصالحة
أنماط 8.6.4.1. OR
.قد يكون النمط الفرعي األخير فقط غير قابل للدحض ، ويجب أن يربط كل نمط فرعي نفس مجموعة األسماء 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وينجح
األنماط الحرفية8.6.4.3.
literal_pattern :: = signed_number
Pg. 107
| strings
"ال أحد" |
"حقيقي" |
"خاطئة" |
في قواعد لغة بايثون القياسية . يتم دعم السالسل الثالثية بين عالمات NUMBERوالرمز المميز stringsيتم تعريف القاعدة
.االقتباس .يتم دعم السالسل األولية وسالسل البايت .القيم الحرفية للسلسلة المنسقة غير مدعومة
أشكال و هي للتعبير عن األعداد المركبة . تتطلب رقمًا حقيقيًا على اليسار ورقمًا وهميًا على اليمين .على سبيل
.signed_number '+' NUMBERsigned_number '-' NUMBER3 + 4jالمثال
أنماط القبض8.6.4.4.
الشرطة السفلية المفردة_ ليست نمط التقاط (هذا ما '_'! يعبر عنه) .بدالً من ذلك يتم التعامل معها Lعلى أنها
wildcard_pattern.ملف
في نمط معين ،ال يمكن ربط االسم المحدد إال مرة واحدة .على سبيل المثال غير صالح بينما مسموح
.case x, x: ...case [x] | x: ...به
؛ يصبح االسم متغيرً ا PEP 572 تنجح أنماط االلتقاط دائمًا .يتبع االرتباط قواعد تحديد النطاق التي وضعها عامل تعبير اإلسناد في
.عبارةقابلة للتطبيقnonlocalأوglobalمحليًا في أقرب نطاق وظيفي يحتوي على ما لم يكن هناك تطبيق
أنماط البدل8.6.4.5.
:ينجح نمط أحرف البدل دائمًا (يتطابق مع أي شيء) وال يربط أي اسم .بناء الجملة
تعبيرات matchهي كلمة رئيسية ناعمة داخل أي نمط ،ولكن فقط ضمن األنماط .إنه معرف ،كالعادة ،حتى داخل_
.والكتل ، guards ، caseالموضوع
أنماط القيمة8.6.4.6.
:: = attrنمط_قيمة
القياسية . ينجح النمط إذا كانت القيمة التي تم العثور عليها Pythonيتم البحث عن االسم المنقط في النموذج باستخدام قواعد دقة اسم
.تقارن بقيمة الموضوع (باستخدام== عامل المساواة)
Pg. 108
ملحوظة
إذا حدثت نفس القيمة عدة مرات في نفس عبارة المطابقة ،فقد يقوم المترجم بتخزين القيمة األولى الموجودة مؤق ًتا وإعادة استخدامها
ً
ارتباطا صارمًا بتنفيذ معين لعبارة مطابقة معينة .بدالً من تكرار البحث نفسه .ترتبط ذاكرة التخزين المؤقت هذه
أنماط المجموعة8.6.4.7.
يسمح نمط المجموعة للمستخدمين بإضافة أقواس حول األنماط للتأكيد على التجميع المقصود .خالف ذلك ،فإنه ال يحتوي على بناء
:جملة إضافي .بناء الجملة
أنماط التسلسل8.6.4.8.
.يحتوي نمط التسلسل على عدة أنماط فرعية ليتم مطابقتها مع عناصر التسلسل .بناء الجملة مشابه لتفريغ قائمة أو مجموعة
.ال يوجد فرق إذا تم استخدام األقواس أو األقواس المربعة ألنماط التسلسل (على سبيل المثال)...( مقابل)]...[
ملحوظة
النمط الفردي المحاط بأقواس بدون فاصلة الحقة (على سبيل المثال ) هو نمط مجموعة . في حين أن النمط الفردي المحاط بأقواس
مربعة (على سبيل المثال ) ال يزال نمط تسلسل]4 | 3[)4 | 3(.
ً
واحدا على األكثر في نمط تسلسلي .قد يحدث النمط الفرعي النجمي في أي موضع .في حالة عدم قد يكون النمط الفرعي النجمي
.وجود نمط فرعي نجمي ،يكون نمط التسلسل هو نمط تسلسل ثابت الطول ؛ وإال فهو نمط تسلسل متغير الطول
:ما يلي هو التدفق المنطقي لمطابقة نمط تسلسل مقابل قيمة موضوع
.إذا لم تكن قيمة الموضوع عبارة عن تسلسل ، 2 يفشل نمط التسلسل 1.
.تعتمد الخطوات الالحقة على ما إذا كان نمط التسلسل ثاب ًتا أم متغير الطول 3.
إذا كان طول تسلسل الموضوع ال يساوي عدد األنماط الفرعية ،يفشل نمط التسلسل 1.
2. يتم مطابقة األنماط الفرعية في نمط التسلسل مع العناصر المقابلة لها في تسلسل الموضوع من اليسار إلى
اليمين .تتوقف المطابقة بمجرد فشل النمط الفرعي .إذا نجحت جميع األنماط الفرعية في مطابقة العنصر المقابل
.لها ،ينجح نمط التسلسل
Pg. 109
:خالف ذلك ،إذا كان نمط التسلسل متغير الطول
.إذا كان طول تسلسل الموضوع أقل من عدد األنماط الفرعية غير النجمية ،يفشل نمط التسلسل 3.
4. تتم مطابقة األنماط الفرعية غير النجمية البادئة مع العناصر المقابلة لها كما هو الحال بالنسبة للتسلسالت ذات
.الطول الثابت
5. إذا نجحت الخطوة السابقة ،فإن النمط الفرعي النجمة يطابق قائمة مكونة من عناصر الموضوع المتبقية ،
.باستثناء العناصر المتبقية المقابلة لألنماط الفرعية غير النجمية التي تتبع النمط الفرعي النجمة
6. تتم مطابقة األنماط الفرعية غير النجمية المتبقية مع عناصر الموضوع المقابلة لها ،كما هو الحال بالنسبة
.للتسلسل ذي الطول الثابت
ملحوظة
قد يتم تخزين هذا الطول مؤق ًتا بواسطة ). البروتوكول)(__ __lenأي عبر()( lenيتم الحصول على طول تسلسل الموضوع عبر
.المترجم بطريقة مماثلة ألنماط القيمة
>len(subject) == <N
:يحتوي نمط التعيين على واحد أو أكثر من أنماط القيمة الرئيسية .بناء الجملة مشابه لبناء القاموس .بناء الجملة
|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 in <subject
.وما إلى ذلك بالنسبة لزوج المفتاح /النمط المقابل ...
أنماط الطبقة8.6.4.10.
:يمثل نمط الفصل فئة وحججها الموضعية والكلمات الرئيسية (إن وجدت) .بناء الجملة
| keyword_patterns
:ما يلي هو التدفق المنطقي لمطابقة نمط فئة مقابل قيمة موضوع
.يفشل نمط الفئة isinstance()) ،تم اختباره عبر( name_or_attrإذا لم تكن قيمة الموضوع مثيالً لـ 2.
3. في حالة عدم وجود وسيطات للنمط ،ينجح النمط .بخالف ذلك ،تعتمد الخطوات الالحقة على ما إذا كانت الكلمات
.األساسية Lأو أنماط الوسيطة الموضعية موجودة
بالنسبة لعدد من األنواع المضمنة (المحددة أدناه) ،يتم قبول نمط فرعي موضعي واحد يتطابق مع الموضوع بأكمله ؛ بالنسبة لهذه
ضا مع األنواع األخرى .األنواع ،تعمل أنماط الكلمات الرئيسية أي ً
:في حالة وجود أنماط الكلمات الرئيسية فقط ،تتم معالجتها على النحو التالي ،واح ًدا تلو اآلخر
o .فإن االستثناء ينفجر AttributeError،إذا كان هذا يثير استثنا ًء بخالف ذلك
o وإال ،فإن النمط الفرعي المرتبط بنمط الكلمة الرئيسية يطابق قيمة سمة الموضوع .إذا فشل هذا ،فإن نمط
.الفصل يفشل ؛ إذا نجح ذلك ،تنتقل المطابقة إلى الكلمة الرئيسية التالية
Pg. 111
.إذا نجحت جميع أنماط الكلمات الرئيسية ،فإن نمط الفصل ينجحII.
السمة الموجودة في __ __match_argsفي حالة وجود أي أنماط موضعية ،يتم تحويلها إلى أنماط كلمات رئيسية باستخدام
:قبل المطابقة name_or_attrالفئة
o .إذا كان هذا يثير استثنا ًء ،فإن االستثناء يطفو على السطح
o .ويتم رفعه TypeErrorإذا لم تكن القيمة التي تم إرجاعها عبارة عن مجموعة ،يفشل التحويل
o الكلمة ] __match_args__[iيتم تحويل النمط الموضعي إلى نمط كلمة رئيسية باستخدام ، iخالف ذلك
.يتم رفعه TypeErrorيجب أن يكون سلسلة ؛ إذا لم]. __match_args__[iاألساسيةL
أنظر أيضا
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 أو
)isinstance(<subject>, CLS
Pg. 112
attr=P2:لكل وسيطة كلمة رئيسية
o )"hasattr(<subject>, "attr
.وما إلى ذلك بالنسبة إلى زوج الكلمات الرئيسية /النمط المقابل ...
أنظر أيضا
تعريفات الوظائف8.7
:يعرّ ف تعريف الوظيفة كائن دالة مع ّرف من قبل المستخدم (راجع قسم التدرج الهرمي للنوع القياسي)
| parameter_list_no_posonly
| parameter_list_starargs
تعريف الدالة هو بيان قابل للتنفيذ .يؤدي تنفيذها إلى ربط اسم الوظيفة في مساحة االسم المحلية الحالية بكائن دالة (غالف حول الكود
القابل للتنفيذ للوظيفة) .يحتوي كائن الوظيفة هذا على مرجع إلى مساحة Lاالسم العمومية الحالية كمساحة االسم العمومية التي سيتم
.استخدامها عند استدعاء الوظيفة
تعريف الوظيفة ال ينفذ الجسم الوظيفي ؛ يتم تنفيذ هذا فقط عندما يتم استدعاء الوظيفة4 .
عند تحديد الوظيفة ،في Decoratorيمكن تغليف تعريف الوظيفة بواسطة تعبير أو أكثر من تعبيرات الزخرفة . يتم تقييم تعبيرات
النطاق الذي يحتوي على تعريف الوظيفة .يجب أن تكون النتيجة قابلة لالستدعاء ،والتي يتم استدعاؤها باستخدام كائن الوظيفة
باعتباره الوسيطة الوحيدة .ترتبط القيمة التي تم إرجاعها باسم الوظيفة بدالً من كائن الوظيفة .يتم تطبيق العديد من الزخارف بطريقة
متداخلة .على سبيل المثال ،الكود التالي
)@f1(arg
@f2
Pg. 113
def func(): pass
يعادل تقريبًا
))func = f1(arg)(f2(func
في السابق ،كانت القواعد أكثر assignment_expression. تم التغيير في اإلصدار :3.9يمكن تزيين الوظائف بأي منها صالح
.لمزيد من التفاصيلPEP 614 تقيي ًدا ؛ ارى
عندما تحتوي معلمة واحدة أو أكثر على تعبير معلمة النموذج ، يُقال أن الوظيفة لها "قيم المعلمات Lاالفتراضية ".بالنسبة إلى المعلمة
ذات القيمة االفتراضية ،يمكن حذف الوسيطة المقابلة من االستدعاء ،وفي هذه الحالة يتم استبدال القيمة االفتراضية للمعامل .إذا
ضا على قيمة افتراضية -وهذا قيد كانت المعلمة تحتوي على قيمة افتراضية ،فيجب أن تحتوي جميع المعلمات Lالتالية حتى " " أي ً
*.= نحوي ال يتم التعبير عنه بواسطة القواعد النحوية
يتم تقييم قيم المعلمات االفتراضية من اليسار إلى اليمين عند تنفيذ تعريف الوظيفة .هذا يعني أنه يتم تقييم التعبير مرة واحدة ،
عندما يتم تحديد الوظيفة ،ويتم استخدام نفس القيمة "المحسوبة مسب ًقا" لكل استدعاء .هذا مهم بشكل خاص لفهم متى تكون قيمة
المعلمة االفتراضية كائ ًن ا قابل للتغيير ،مثل قائمة أو قاموس :إذا كانت الوظيفة تعدل الكائن (على سبيل المثال عن طريق إلحاق
عنصر بقائمة) ،يتم تعديل قيمة المعلمة االفتراضية في الواقع .هذا بشكل عام ليس ما كان المقصود .هناك طريقة للتغلب على ذلك
:الوضع االفتراضي واختباره بشكل صريح في جسم الوظيفة ،على سبيل المثال Noneوهي استخدام
def whats_on_the_telly(penguin=None):
][ = penguin
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.
أنظر أيضا
القدرة على كتابة إقرارات متغيرة التلميح ،بما في ذلك متغيرات الفئة ومتغيرات الحالة
تعريفات الفئة8.8
:يحدد تعريف الفئة كائن فئة (راجع قسم التدرج الهرمي للنوع القياسي)
:: = identifierاسم الفئة
لالستخدامات Lاألكثر Metaclasses انظر( تعريف الفئة هو بيان قابل للتنفيذ .عاد ًة ما تقدم قائمة الوراثة قائمة بالفئات األساسيةL
لذلك يجب تقييم كل عنصر في القائمة إلى كائن فئة يسمح بالتصنيف الفرعي .ترث الفئات التي ال تحتوي على قائمة وراثة ) ، ،تقدمًا
،؛ بالتالي objectافتراضيًا ،من الفئة األساسية
class Foo:
pass
يعادل
class Foo(object):
pass
ً
حديثا يتم بعد ذلك تنفيذ مجموعة الفصل في إطار تنفيذ جديد (انظر التسمية والربط ، ) باستخدام مساحة Lاسم محلية تم إنشاؤها
ومساحة االسم العالمية األصلية( .عادة ،تحتوي المجموعة على تعريفات وظيفية في الغالب ).عندما تنتهي مجموعة الفصل من
التنفيذ ،يتم تجاهل إطار التنفيذ الخاص بها ولكن يتم حفظ مساحة االسم المحلية الخاصة بها 5 .ثم يتم إنشاء كائن فئة باستخدام قائمة
التوريث للفئات األساسية ومساحة االسم المحلية المحفوظة لقاموس السمات .يرتبط اسم الفئة بكائن الفئة هذا في مساحة Lاالسم المحلية
.األصلية
الحظ أن هذا يمكن االعتماد عليه __dict__. يتم االحتفاظ بالترتيب الذي يتم به تعريف السمات Lفي جسم الفصل في الفصل الجديد
.فقط بعد إنشاء الفئة وفقط للفئات التي تم تعريفها باستخدام صيغة التعريف
Pg. 115
metaclasses .يمكن تخصيص إنشاء الفصل بشكل كبير باستخدام
،يمكن أيضً ا تزيين الفصول الدراسية :تمامًا كما هو الحال عند تزيين الوظائف
)@f1(arg
@f2
يعادل تقريبًا
))Foo = f1(arg)(f2(Foo
.قواعد التقييم لتعبيرات المصمم هي نفسها بالنسبة لمصممي الوظيفة .ثم يتم ربط النتيجة باسم الفئة
في السابق ،كانت القواعد أكثر assignment_expression. تم التغيير في اإلصدار :3.9يمكن تزيين الفصول بأي نوع صالح
.لمزيد من التفاصيلPEP 614 تقيي ًدا ؛ ارى
مالحظة المبرمج :المتغيرات المعرفة في تعريف الفئة هي سمات فئة ؛ يتم مشاركتها من قبل األمثلة .يمكن تعيين سمات المثيل
بطريقة ذات . يمكن الوصول إلى سمات Lكل من الفئة والمثيل من خالل الترميز " ، " وتخفي سمة مثيل سمة فئة تحمل االسم نفسه
عند الوصول إليها بهذه الطريقة .يمكن استخدام سمات Lالفئة كإعدادات افتراضية لسمات المثال ،ولكن استخدام القيم القابلة للتغيير
هناك يمكن أن يؤدي إلى نتائج غير متوقعة .واصفات يمكن استخدامها إلنشاء Lمتغيرات سبيل المثال مع تفاصيل التنفيذ
.self.name = valueself.nameالمختلفة
أنظر أيضا
.االقتراح الذي غيّر إعالن الفئات الوصفية إلى الصيغة الحالية ،والدالالت الخاصة بكيفية إنشاء الفئات ذات الفئات الوصفية
.االقتراح الذي أضاف مصممين للفصل .تم تقديم مصممي الديكور الوظيفي والطريقة فيبيب 318
8.9. Coroutines
Coroutine تعريف وظيفة8.9.1.
التعبيرات ،وال يمكن استخدامها إال coroutine ). awaitانظر( واستئنافها Lفي عدة نقاط coroutines Pythonيمكن تعليق تنفيذ
coroutine.async forasync withفي جسم وظيفة
)(do_stuff
Pg. 116
)(await some_coroutine
اآلن الكلمات الرئيسية .في السابق كانوا يعاملون فقط على هذا النحو داخل جسم وظيفة asyncو:await تغير في اإلصدار 3.7
coroutine.
async forفي بيان8.9.2.
األسلوب الذي يعود مباشرة إلى مكرر غير متزامن ، والتي يمكن استدعاء التعليمات __aiter__ Lيوفر iterable و غير المتزامن
.األسلوب__ __anextالبرمجية غير متزامن في تقريرها
:الكود التالي
SUITE
else:
SUITE2
:يعادل لغويًا
)iter = (ITER
)iter = type(iter).__aiter__(iter
running = True
while running:
try:
except StopAsyncIteration:
running = False
else:
SUITE
else:
SUITE2
async withفي بيان8.9.3.
.و مدير سياق غير متزامن هو مدير السياق أن يكون قادرا على وقف إعدام في في دخول و خروج األساليب
Pg. 117
الكود التالي:
SUITE
يعادل لغويًا:
manager = (EXPRESSION)
aenter = type(manager).__aenter__
aexit = type(manager).__aexit__
hit_except = False
try:
TARGET = value
SUITE
except:
hit_except = True
raise
finally:
if not hit_except:
أنظر أيضا
االقتراح الذي جعلcoroutines مفهومًا مستقالً مناسبًا فيPython ، وأضاف بناء الجملة الداعم.
الحواشي
يتم نشر االستثناء إلى مكدس االستدعاء ما لم يكن هناك finally هذا االستثناء الجديد يتسبب في ضياع .بند يحدث إلثارة استثناء آخر
االستثناء القديم.
يتم تعريف التسلسل على أنه واحد مما يلي، في مطابقة النمط:
Pg. 118
collections.abc.Sequenceفئة ترث من
array.array
collections.deque
list
memoryview
range
tuple
ملحوظة
3
:في مطابقة النمط ،يتم تعريف التعيين على أنه واحد مما يلي
4
الخاصة docstring سمة الوظيفة وبالتالي سلسلة__ __docيتم تحويل السلسلة الحرفية التي تظهر كأول بيان في جسم الوظيفة إلى
.بالوظيفة
5
عنصر مساحة Lاالسم وبالتالي __ __docيتم تحويل السلسلة الحرفية التي تظهر كأول بيان في نص الفصل إلى
.للفصل docstring سلسلة
يمكن لمترجم بايثون الحصول على مدخالته من عدد من المصادر :من نص تم تمريره إليه كمدخل قياسي أو كوسيط برنامج ،
.مكتوب بشكل تفاعلي ،من ملف مصدر وحدة ،إلخ .يعطي هذا الفصل الصيغة المستخدمة Lفي هذه الحاالت
بينما ال تحتاج مواصفات اللغة إلى وصف كيفية استدعاء مترجم اللغة ،فمن المفيد أن يكون لديك فكرة عن برنامج بايثون كامل .يتم
الكامل في بيئة مهيأة بالحد األدنى :جميع الوحدات المضمنة والقياسية متاحة ،ولكن لم تتم تهيئة أي منها Python ،تنفيذ برنامج
Pg. 119
يتم استخدام األخير __main__. و ) Noneالوظائف المضمنة ،االستثناءات و() ، builtinsخدمات Lالنظام المختلفة( sysباستثناء
.لتوفير مساحة Lاالسم المحلية والعالمية لتنفيذ البرنامج الكامل
.الكامل هي تلك الخاصة بإدخال الملفات ،الموصوفة في القسم التالي Pythonصيغة برنامج
ضا استدعاء المترجم الفوري في الوضع التفاعلي ؛ في هذه الحالة ،ال يقرأ وينفذ برنامجً ا كامالً ولكنه يقرأ وينفذ بيا ًنا واح ًدا
يمكن أي ً
( __main__.ربما مركبًا) في كل مرة .البيئة األولية مماثلة لبيئة البرنامج الكامل ؛ يتم تنفيذ كل عبارة في مساحة Lاسم
يمكن تمرير برنامج كامل إلى المترجم الفوري في ثالثة أشكال :باستخدام خيار سطر أوامر السلسلة ، أو كملف تم تمريره كأول
يدخل المترجم في الوضع tty ،وسيطة لسطر األوامر ،أو كمدخل قياسي .إذا كان الملف أو اإلدخال القياسي عبارة عن جهاز
.-cالتفاعلي ؛ وإال فإنه ينفذ الملف كبرنامج كامل
إدخال ملف9.2.
المدخالت Lالتفاعلية9.3
الحظ أن العبارة المركبة (المستوى األعلى) يجب أن يتبعها سطر فارغ في الوضع التفاعلي ؛ هذا ضروري لمساعدة المحلل اللغوي
.في اكتشاف نهاية اإلدخال
إدخال التعبير9.4
:يجب أن تحتوي وسيطة السلسلة على الشكل التالي)(. evalيستخدم إلدخال التعبير .يتجاهل المسافة Lالبيضاء البادئة)(eval
* Eval_input :: = expression_listNEWLINE
/انظر القواعد( CPythonالكاملة ،المشتقة مباشرة من القواعد النحوية المستخدمة Lإلنشاء محلل Pythonهذه هي قواعد لغة
.يحذف اإلصدار هنا التفاصيل المتعلقة بإنشاء التعليمات البرمجية واسترداد األخطاءpython.gram ).
على وجه الخصوص & ،متبو ًعا برمز ،يشير الرمز المميز أو المجموعة المحصورة PEG . و EBNF الترميز عبارة عن مزيج من
بين قوسين إلى نظرة موجبة (على سبيل المثال ،مطلوب للمطابقة ولكنها غير مستهلكة) ،بينما! يشير إلى مظهر سلبي (أي مطلوب
مكتوب كما هو الحال/ في القواعد النحوية التقليدية لـ( _ PEGال_ للمطابقة) .نستخدم| الفاصل لإلشارة إلى "االختيار المنظم" لـ
.لمزيد من التفاصيل حول قواعد النحو PEP 617 ارىPEG).
Pg. 120
interactive: statement_newline
fstring: star_expressions
type_expressions:
| '*' expression
| '**' expression
| ','.expression+
statements: statement+
statement_newline:
| compound_stmt NEWLINE
| simple_stmts
| NEWLINE
| ENDMARKER
simple_stmts:
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:
augassign:
| '+='
| '-='
| '*='
Pg. 122
| '@='
| '/='
| '%='
| '&='
| '|='
| '^='
| '<<='
| '>>='
| '**='
| '//='
yield_stmt: yield_expr
del_stmt:
# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS
import_from:
import_from_targets:
| import_from_as_names !','
| '*'
import_from_as_names:
Pg. 123
| ','.import_from_as_name+
import_from_as_name:
dotted_as_names:
| ','.dotted_as_name+
dotted_as_name:
dotted_name:
| NAME
if_stmt:
elif_stmt:
else_block:
while_stmt:
for_stmt:
with_stmt:
Pg. 124
with_item:
| expression
try_stmt:
except_block:
finally_block:
match_stmt:
subject_expr:
| named_expression
case_block:
patterns:
| open_sequence_pattern
| pattern
pattern:
| as_pattern
| or_pattern
as_pattern:
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_pattern:
| complex_number
| strings
| 'None'
| 'True'
| 'False'
literal_expr:
| complex_number
| strings
| 'None'
| 'True'
| 'False'
complex_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:
wildcard_pattern:
| "_"
value_pattern:
attr:
name_or_attr:
| attr
Pg. 127
| NAME
group_pattern:
sequence_pattern:
open_sequence_pattern:
maybe_sequence_pattern:
| ','.maybe_star_pattern+ ','?
maybe_star_pattern:
| star_pattern
| pattern
star_pattern:
| '*' pattern_capture_target
| '*' wildcard_pattern
mapping_pattern:
| '{' '}'
items_pattern:
| ','.key_value_pattern+
key_value_pattern:
double_star_pattern:
| '**' pattern_capture_target
Pg. 128
class_pattern:
positional_patterns:
| ','.pattern+
keyword_patterns:
| ','.keyword_pattern+
keyword_pattern:
return_stmt:
| 'return' [star_expressions]
raise_stmt:
| '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:
| TYPE_COMMENT
params:
Pg. 129
| parameters
parameters:
| param_with_default+ [star_etc]
| star_etc
slash_no_default:
slash_with_default:
star_etc:
| kwds
# - No default
# - With default
Pg. 130
#
# There are two alternative forms of each, to deal with type comments:
param_no_default:
param_with_default:
param_maybe_default:
class_def:
| decorators class_def_raw
| class_def_raw
class_def_raw:
block:
| simple_stmts
Pg. 131
star_expressions:
| star_expression ','
| star_expression
star_expression:
| '*' bitwise_or
| expression
star_named_expression:
| '*' bitwise_or
| named_expression
assigment_expression:
named_expression:
| assigment_expression
| expression !':='
expressions:
| expression ','
| expression
expression:
| disjunction
| lambdef
Pg. 132
lambdef:
lambda_params:
| lambda_parameters
lambda_parameters:
| lambda_param_with_default+ [lambda_star_etc]
| lambda_star_etc
lambda_slash_no_default:
lambda_slash_with_default:
lambda_star_etc:
| lambda_kwds
Pg. 133
lambda_param_no_default:
| lambda_param ','
| lambda_param &':'
lambda_param_with_default:
lambda_param_maybe_default:
lambda_param: NAME
disjunction:
| conjunction
conjunction:
| 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
noteq_bitwise_or:
| ('!=' ) bitwise_or
bitwise_or:
| bitwise_xor
bitwise_xor:
| bitwise_and
bitwise_and:
| shift_expr
shift_expr:
| sum
sum:
Pg. 135
| sum '+' term
| term
term:
| factor
factor:
| '+' factor
| '-' factor
| '~' factor
| power
power:
| await_primary
await_primary:
| AWAIT primary
| primary
primary:
| primary genexp
| atom
slices:
| slice !','
Pg. 136
| ','.slice+ [',']
slice:
| named_expression
atom:
| NAME
| 'True'
| 'False'
| 'None'
| strings
| NUMBER
| (list | listcomp)
| '...'
strings: STRING+
list:
listcomp:
tuple:
group:
genexp:
setcomp:
dict:
Pg. 137
| '{' [double_starred_kvpairs] '}'
dictcomp:
double_starred_kvpair:
| '**' bitwise_or
| kvpair
for_if_clauses:
| for_if_clause+
for_if_clause:
yield_expr:
| 'yield' [star_expressions]
arguments:
args:
| kwargs
kwargs:
| ','.kwarg_or_starred+
| ','.kwarg_or_double_starred+
starred_expression:
| '*' expression
Pg. 138
kwarg_or_starred:
| starred_expression
kwarg_or_double_starred:
| '**' expression
star_targets:
| star_target !','
star_targets_tuple_seq:
| star_target ','
star_target:
| target_with_star_atom
target_with_star_atom:
| star_atom
star_atom:
| NAME
single_target:
| single_subscript_attribute_target
| NAME
Pg. 139
')' | '(' single_target
single_subscript_attribute_target:
del_target:
| del_t_atom
del_t_atom:
| NAME
t_primary:
القياسية واسعة للغاية ،وتقدم مجموعة واسعة من المرافق كما هو موضح في جدول المحتويات الطويل المدرج Pythonمكتبة
توفر الوصول إلى وظائف النظام مثل ملف اإلدخال /اإلخراج الذي قد ) Cمكتوبة بلغة( أدناه .تحتوي المكتبة على وحدات مدمجة
التي توفر حلواًل قياسية للعديد من Pythonباإلضافة إلى الوحدات النمطية المكتوبة بلغة Python ،يتعذر الوصول إليه لمبرمجي
Pythonالمشكالت التي تحدث في البرمجة اليومية .تم تصميم بعض هذه الوحدات بشكل صريح لتشجيع وتعزيز قابلية نقل برامج
.من خالل تجريد خصائص النظام األساسي بعي ًدا في واجهات برمجة تطبيقات محايدة للنظام األساسي
ضا العديد من المكونات Windowsلنظام التشغيل Pythonعاد ًة ما تتضمن مثبتات المكتبة القياسية بأكملها وغالبًا ما تتضمن أي ً
عاد ًة كمجموعة من الحزم ،لذلك قد يكون من الضروري Pythonيتم توفير Unix ،اإلضافية .بالنسبة ألنظمة التشغيل المشابهة لـ
.استخدام أدوات الحزم المتوفرة مع نظام التشغيل للحصول على بعض أو كل المكونات االختيارية
Pg. 140
باإلضافة إلى المكتبة القياسية ،هناك مجموعة متزايدة من عدة آالف من المكونات (من البرامج الفردية والوحدات النمطية إلى الحزم
Python Package Index .وأطر تطوير التطبيقات بالكامل) ،وهي متاحة من
Introduction
يحتوي على أنواع البيانات التي تعتبر عاد ًة جزءًا من "جوهر" اللغة ،مثل األرقام والقوائم .بالنسبة لهذه األنواع ،يحدد جوهر لغة
شكل القيم الحرفية ويضع بعض القيود على دالالتها ،ولكنه ال يحدد الدالالت بشكل كامل( .من ناحية أخرى ،يحدد جوهر Python
اللغة الخصائص النحوية مثل التهجئة وأولويات المشغلين).
البرمجية دون Pythonتحتوي المكتبة أيضً ا على وظائف واستثناءات مضمنة -كائنات يمكن استخدامها بواسطة جميع تعليماتL
بيان .يتم تعريف بعضها من خالل اللغة األساسية ،لكن العديد منها ليس ضروريًا للدالالت األساسية Lويتم وصفه importالحاجة إلى
.هنا فقط
ومع ذلك ،فإن الجزء األكبر من المكتبة يتكون من مجموعة من الوحدات .هناك طرق عديدة لتشريح هذه المجموعة .بعض الوحدات
ويتم استيراده في شكل مصدر .توفر بعض Pythonومدمجة في مترجم بايثون ؛ البعض اآلخر مكتوب بلغة Cمكتوبة بلغة
جدا ببيثون ،مثل طباعة تتبع مكدس ؛ يوفر البعض واجهات Lخاصة بأنظمة تشغيل معينة ،مثلالوحدات النمطية واجهات خاصة ً
الوصول إلى أجهزة معينة ؛ يوفر البعض اآلخر واجهات خاصة بمجال تطبيق معين ،مثل شبكة الويب العالمية .تتوفر بعض
؛ يتوفر اآلخرون فقط عندما يدعمهم النظام األساسي أو يتطلبهم ؛ ومع ذلك ،ال يتوفر Pythonالوحدات في جميع إصدارات ومنافذ
.وتثبيته Pythonالبعض اآلخر إال عند اختيار خيار تكوين معين في الوقت الذي تم فيه تجميع
تم تنظيم هذا الدليل "من الداخل إلى الخارج" :فهو يصف أوالً الوظائف المضمنة وأنواع البيانات واالستثناءات ،وأخيراً الوحدات
.النمطية المجمعة Lفي فصول من الوحدات ذات الصلة
هذا يعني أنك إذا بدأت في قراءة هذا الدليل من البداية ،وانتقلت إلى الفصل التالي عندما تشعر بالملل ،فستحصل على نظرة عامة
بالطبع ،ال يتعين عليك قراءتها كأنها رواية -يمكنك Python. معقولة للوحدات النمطية المتاحة ومناطق التطبيق التي تدعمها مكتبة
أيضً ا تصفح جدول المحتويات (أمام الدليل) ،أو البحث عن وظيفة أو وحدة أو مصطلح معين في الفهرس (في الخلف) .وأخيرً ا ،إذا
وتقرأ قسمًا أو ) randomانظر الوحدة( كنت تستمتع بالتعرف على مواضيع عشوائية ،فإنك تختار رقم صفحة عشوائيًا
قسمين .بغض النظر عن الترتيب الذي تقرأ به أقسام هذا الدليل ،فمن المفيد البدء بفصل الوظائف المضمنة ، حيث يفترض باقي
.الدليل اإللمام بهذه المادة
!ليبدأ العرض
والتي تعتمد macOS ،مدعومة على ": Unixإذا لم يتم ذكرها بشكل منفصل ،فإن جميع الوظائف التي تدعي "التوفر
Unix core.على
وظائف مدمجة
.على عدد من الوظائف واألنواع المضمنة فيه والتي تكون متاحة دائمًا .تم سردها هنا بالترتيب األبجدي Pythonيحتوي مترجم
وظائف مدمجة
Pg. 141
وظائف مدمجة
any()
round()
anext()
F م
ascii()
filter() map() س
id() print()
د
input() property() مع
delattr()
int() zip()
dict()
isinstance()
dir()
issubclass() _
divmod()
iter() __import__()
abs( خ )
قد تكون الوسيطة عد ًدا صحيحً ا أو رقمًا فاصلة عائمة أو كائ ًنا مطب ًقا .إرجاع القيمة المطلقة لرقم __abs__(). إذا كانت الوسيطة
يتم إرجاع مقدارها، عبارة عن رقم مركب.
aiter( متزامن غير )
Pg. 142
aiter(x).هي نفسها)) aiter(aiter(xلذلك x،طريقة تعود)(__ __aiterنفسها لديها)aiter(x
) متكرر all(
:إذا كانت جميع العناصر القابلة للتكرار صحيحة (أو إذا كانت العناصر القابلة للتكرار فارغة) .أي ما يعادل Trueالعودة
def all(iterable):
return False
return True
.عند االنتظار ،قم بإرجاع العنصر التالي من المكرر غير المتزامن المحدد ، أو االفتراضي إذا تم توفيره وتم استنفاد المكرر
وإرجاع ملف . يؤدي انتظار هذا إلى إرجاع القيمة التالية للمكرر .إذا تم async_iterator ،طريقة)(__ __anextهذا يستدعي
.يتم رفعه StopAsyncIterationتقديم االفتراضي ، يتم إرجاعه إذا تم استنفاد المكرر ،وإال
) متكرر any(
:أي ما يعادل False. إذا كان أي عنصر من العناصر القابلة للتكرار صحيحً ا .إذا كان العنصر المكرر فار ًغا ،فارجع Trueالعودة
def any(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
>>>
)'('0b1110', '1110
)'('0b1110', '1110
bool( [ x ] ) فئة
خطأ أو تم x باستخدام إجراء اختبار الحقيقة القياسي . إذا كانت x يتم تحويل False. أو Trueقم بإرجاع قيمة منطقية ،مثل واحد من
انظر أنواع الرقمية -كثافة ،تطفو int( ،الفئة هي فئة فرعية من boolو True. ؛ وإال فإنه يعود Falseحذفها ، Lيتم إرجاعها
).انظر القيم المنطقية( Trueو Falseال يمكن تصنيفها إلى فئة فرعية أخرى .حاالته الوحيدة هي ). معقدة
argsويمر sys.breakpointhook()،تنقلك هذه الوظيفة إلى مصحح األخطاء في موقع االتصال .على وجه التحديد ،وتدعو
أي وسيطات .في هذه)( pdb.set_traceالمكالمات)( sys.breakpointhookمباشرة من خالل .بشكل افتراضي ،ال تتوقع kwsو
أو كتابة أكبر قدر ممكن من التعليمات البرمجية إلدخال مصحح pdbالحالة ،إنها وظيفة مالئمة بحتة ،لذا ال يتعين عليك استيراد
وسوف تستدعي ذلك تلقائيًا ،مما )( breakpointيمكن ضبطها على وظيفة أخرى)( ، sys.breakpointhookاألخطاء .ومع ذلك
.يسمح لك باإلسقاط في مصحح األخطاء الذي تختاره
breakpointhook.بالحجة builtins.breakpoint يثير حدث تدقيق
الطبقة هي سلسلة قابلة للتغيير من األعداد الصحيحة في النطاق من =< 0س < bytearrayإرجاع صفيف جديد من البايت .و
نوع له .256 bytes ،وقد معظم الطرق المعتادة للتسلسل قابلة للتغيير ،وصفت في أنواع متقلب تسلسل ، وكذلك معظم الطرق أن
.العمليات Bytearrayانظر بايت و
ثم يحول السلسلة إلى )( bytearrayإذا كانت سلسلة ، يجب عليك أيضً ا تقديم معلمات الترميز( واختياريا ً ،األخطاء ) ؛
str.encode().بايت باستخدام
.إذا كان كائ ًنا يتوافق مع واجهة المخزن المؤقت ، فسيتم استخدام مخزن مؤقت للقراءة فقط للكائن لتهيئة صفيف البايت
إذا كانت قابلة للتكرار ، فيجب أن تكون متكررة من األعداد الصحيحة في النطاق ، والتي يتم استخدامها كمحتويات أولية
<= x < 256للمصفوفة0.
Pg. 144
) ] المصدر ، [ ترميز ، [ أخطاء bytes( [ ] ] فئة
إرجاع كائن "بايت" جديد وهو عبارة عن تسلسل ثابت من األعداد الصحيحة في النطاق . هي نسخة غير قابلة للتغيير من - لها نفس
<= x < 256bytesbytearrayاألساليب غير المتغيرة ونفس سلوك الفهرسة والتقطيع0.
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
يتم تجاهل المثيل باستثناء فئته .إذا تم استدعاء طريقة C().f()). مثل( أو في مثيل ))( C.fمثل( يمكن استدعاء طريقة الفئة إما في الفئة
.الفئة لفئة مشتقة ،فسيتم تمرير كائن الفئة المشتق باعتباره الوسيطة األولى الضمنية
في هذا القسم .لمزيد من )( staticmethodالثابتة .إذا كنت تريد هؤالء ،انظر Javaأو C ++تختلف طرق الفئات عن طرق
.المعلومات حول طرق الفصل ،راجع التدرج الهرمي للنوع القياسي
Pg. 145
يمكن أن eval(). أو)( execيمكن تنفيذ كائنات التعليمات البرمجية بواسطة AST. تجميع المصدر في رمز أو كائن
وثائق الوحدة للحصول على معلومات حول كيفية العمل astالرجوع إلى AST. يكون المصدر سلسلة عادية أو سلسلة بايت أو كائن
AST.مع كائنات
و اسم الملف حجة يجب أن تعطي الملف الذي تم قراءة الشفرة .تمرير بعض القيم التي يمكن التعرف عليها إذا لم يتم قراءتها من
).شائع االستخدام'> ( '<stringملف
إذا كان المصدر يتكون من سلسلة ' 'execو وضع يحدد حجة أي نوع من التعليمات البرمجية يجب أن يكون ترجمة .يمكن أن يكون
في الحالة ( إذا كان يتكون من عبارة تفاعلية واحدة' 'singleإذا كان يتكون من تعبير واحد ،أو' 'evalمن العبارات ،أو
).سيتم طباعة عبارات التعبير التي يتم تقييمها لشيء آخر غير سيتم طباعتها ، Noneاألخيرة
معً ا لتحديد خيارات ORedيتم تحديد خيارات المحول البرمجي والبيانات المستقبلية بواسطة وحدات البت التي يمكن أن تكون
المثيل _Featureعلى compiler_flagمتعددة .يمكن العثور على حقل البت المطلوب لتحديد ميزة مستقبلية معينة كسمة
.البادئة_ PyCFالوحدة النمطية ،مع ast الوحدة النمطية .يمكن العثور على أعالم المترجم في__ __futureفي
-Oحجة األمثل يحدد مستوى االستغالل األمثل للمترجم .تحدد القيمة االفتراضية لـ1- مستوى التحسين للمترجم كما هو محدد
أو) خطأ__ ، __debugتمت إزالة التأكيدات() ، 1صحيح__ __debugال يوجد تحسين ؛(بالخيارات .المستويات الصريحة هي0
(2.تمت إزالة سالسل المستندات أيضًا)
وإذا كان المصدر يحتوي على وحدات بايت ، ValueErrorإذا كان المصدر المترجم غير صالح SyntaxErrorتظهر هذه الدالة
.فارغة
ملحوظة
وضع ،يجب إنهاء اإلدخال بحرف سطر جديد واحد على األقل .هذا ' '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، األعلى
Pg. 146
أو تحويل سلسلة أو رقم لعدد معقدة .إذا كانت المعلمة األولى عبارة عن سلسلة J ،إرجاع عدد معقدة مع القيمة الحقيقية + ايماج1 *
فسيتم تفسيرها على أنها رقم مركب ويجب استدعاء الوظيفة بدون معلمة ثانية .ال يمكن أن تكون المعلمة الثانية سلسلة .قد تكون كل
وسيطة من أي نوع رقمي (بما في ذلك المعقد) .إذا تم حذف الصورة ،فسيتم تعيينها افتراضيًا على الصفر ويعمل المُنشئ كتحويل
j.إذا تم حذف كلتا الوسيطتين ،يتم إرجاع float. 0 و intرقمي مثل
ملحوظة
عند التحويل من سلسلة ،يجب أال تحتوي السلسلة على مسافة Lبيضاء حول الوسط+ أو- المشغل .على سبيل
.complex('1 + 2j')ValueErrorال بأس به ،لكنه يزيد)' ، complex('1+2jالمثال
.تم التغيير في اإلصدار :3.6يُسمح بتجميع األرقام مع الشرطة السفلية كما هو الحال في الرموز الحرفية
) كائن ، اسم delattr(
الوسيطات هي كائن وسلسلة .يجب أن تكون السلسلة اسم إحدى سمات Lالكائن .تقوم الوظيفة بحذف setattr(). هذا هو أحد أقارب
.delattr(x, 'foobar')del x.foobarالسمة المسماة ، Lبشرط أن يسمح بها الكائن .على سبيل المثال ،يعادل
) dict( ** kwarg فئة
) dict( iterable ، ** kwarg الفئة
.و أنواع الخرائط -ديكت للتوثيق حول هذه الفئة dictالهدف من ذلك هو الطبقة القاموس .رؤية dictأنشئ قامو ًسا جدي ًدا .و
] ) كائن dir( [
بدون وسيطات ،قم بإرجاع قائمة األسماء في النطاق المحلي الحالي .باستخدام وسيطة ،حاول إرجاع قائمة بالسمات Lالصالحة لهذا
.الكائن
فسيتم استدعاء هذه الطريقة ويجب أن تعيد قائمة السمات L.يسمح هذا للكائنات __dir__()،إذا كان الكائن يحتوي على طريقة مسماةL
.اإلبالغ عن سماتها dir()Lوظيفة بتخصيص طريقة)(__ __getattributeأو)(__ __getattrالتي تنفذ تخصيصًا
سمة الكائن ، إذا تم تعريفها ،ومن__ __dictفإن الوظيفة تبذل قصارى جهدها لجمع المعلومات من __dir__()،إذا لم يوفر الكائن
__getattr__().كائن النوع الخاص به .القائمة الناتجة ليست بالضرورة كاملة وقد تكون غير دقيقة عندما يكون للكائن مخصص
تتصرف اآللية االفتراضية بشكل مختلف مع أنواع مختلفة من الكائنات ،حيث تحاول إنتاج المعلومات األكثر صلة وليست )(dir
:كاملة
.إذا كان الكائن عبارة عن كائن وحدة نمطية ،فإن القائمة تحتوي على أسماء سمات الوحدة النمطية
.إذا كان الكائن عبارة عن كائن نوع أو فئة ،فإن القائمة تحتوي على أسماء Lسماتها ، Lوبشكل متكرر لسمات قواعدها
بخالف ذلك ،تحتوي القائمة على أسماء سمات الكائن ،وأسماء سمات Lفئتها ،وبشكل متكرر لسمات الفئات األساسية
.لفئتها
Pg. 147
>>>
]''unpack', 'unpack_from
)(>>> s = Shape
)>>> dir(s
ملحوظة
يتم توفيره بشكل أساسي كوسيلة مالئمة لالستخدام في موجه تفاعلي ،فإنه يحاول توفير مجموعة مثيرة لالهتمام من )( 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 .الحصول عليها من بالتكرار عبر
>>>
))>>> list(enumerate(seasons
Pg. 148
))>>> list(enumerate(seasons, start=1
:أي ما يعادل
n = start
yield n, elem
n += 1
قاموسًا .إذا تم 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 رفع حدث تدقيق
يجب أن يكون الكائن إما سلسلة أو كائن رمز .إذا كانت سلسلة ،يتم تحليل Python. تدعم هذه الوظيفة التنفيذ الديناميكي لرمز
والتي يتم تنفيذها بعد ذلك (ما لم يحدث خطأ في بناء الجملة) 1 .إذا كان كائن رمز ،يتم Pythonالسلسلة كمجموعة من عبارات
تنفيذه ببساطة .في جميع الحاالت ،من المتوقع أن يكون الرمز الذي تم تنفيذه صالحً ا كإدخال ملف (راجع قسم "إدخال الملف" في
Pg. 149
البيانات قد ال تكون خارج تستخدم التعاريف وظيفة حتى في سياق return و nonlocal، yieldالدليل المرجعي) .كن على علم بأن
None.وظيفة .القيمة المعادة هي)( execكود تمريرها إلى
فقط ، فيجب أن globals في جميع الحاالت ،إذا تم حذف األجزاء االختيارية ،فسيتم تنفيذ الكود في النطاق الحالي .إذا تم توفير
يكون قاموسً ا (وليس فئة فرعية من القاموس) ،والذي سيتم استخدامه لكل من المتغيرات العامة Lوالمحلية .إذا تم تقديم الكرات
األرضية والسكان المحليين ، فسيتم استخدامها للمتغيرات العالمية والمحلية ،على التوالي .إذا تم توفيرها ،يمكن أن يكون السكان
المحليون أي كائن تعيين .تذكر أنه على مستوى الوحدة النمطية ،فإن القاموس العالمي والسكان المحليين هم نفس القاموس .إذا
.إكسيك يحصل كائنين منفصلين كما غلوبالس و السكان المحليين ، وسيتم تنفيذ الكود كما لو كانت جزءا ال يتجزأ في تعريف فئة
فسيتم إدراج إشارة إلى قاموس الوحدة النمطية __builtins__،ال يحتوي على قيمة للمفتاح globals إذا كان قاموس
تحت هذا المفتاح .وبهذه الطريقة يمكنك التحكم في العناصر المضمنة المتاحة للكود المنفذ عن طريق إدراج builtinsالمضمنة
exec().قبل تمريره إليه globals في__ __builtinsقاموسك الخاص
.مع كائن التعليمات البرمجية كوسيطة .قد يتم أيضً ا رفع أحداث تجميع التعليمات البرمجية exec رفع حدث تدقيق
ملحوظة
إعادة القاموس العالمي والمحلي الحالي ،على التوالي ،والتي قد تكون مفيدة لتمرير حول )( localsو)( globalsالمدمج في وظائف
exec().الستخدامها بوصفها الوسيطة الثانية والثالثة ل
ملحوظة
) وظيفة ، تكرارية filter(
قد يكون إما التسلسل ،حاوية التي تدعم . iterable أنشئ مكررً ا من تلك العناصر القابلة للتكرار التي تعود الدالة على أنها صحيحة
.تتم إزالة كاذبة iterable يفترض وظيفة الهوية ،وهذا هو ،كل عناصر None،التكرار ،أو مكرر .إذا وظيفة هي
float( [ x ] ) فئة
إذا كانت الوسيطة عبارة عن سلسلة ،فيجب أن تحتوي على رقم عشري ،مسبو ًقا بشكل اختياري بعالمة ،ومضمّن اختياريًا في
مسافة Lبيضاء .قد تكون العالمة االختيارية'+' أو'-' ؛ على'+' عالمة ليس له أي تأثير على القيمة المنتجة .قد تكون الوسيطة أيضًا
أو ما ال نهاية موجبًا أو سالبًا .بتعبير أدق ،يجب أن يتوافق اإلدخال مع القواعد النحوية ) ،ليس رقمًا( NaNعبارة عن سلسلة تمثل
:التالية بعد إزالة أحرف المسافات Lالبيضاء البادئة والزائدة
numeric_string :: = [ sign]numeric_value
Pg. 150
هو شكل حرفية الفاصلة العائمة في بايثون ،موصوفة في حرفية النقطة العائمة . الحالة ليست مهمة ، Lلذلك floatnumber ،هذا
.كلها تهجئات مقبولة لما ال نهاية موجبة " "iNfINityو " "INFINITYو " "Infو " ، "infعلى سبيل المثال
ضمن دقة ( وإال ،إذا كانت الوسيطة عبارة عن عدد صحيح أو رقم فاصلة عائمة ،فسيتم إرجاع رقم فاصلة عائمة بنفس القيمة
.فسيتم رفع قيمة Python ، OverflowErrorإذا كانت الوسيطة خارج نطاق عائم Python). الفاصلة العائمة في
:أمثلة
>>>
)'>>> float('+1.23
1.23
-12345.0
)'>>> float('1e-003
0.001
)'>>> float('+1E6
1000000.0
)'>>> float('-Infinity
-inf
.تم التغيير في اإلصدار :3.6يُسمح بتجميع األرقام مع الشرطة السفلية كما هو الحال في الرموز الحرفية
على نوع وسيطة القيمة ؛ ومع ذلك format_spec ،يعتمد تفسير format_spec . تحويل قيمة إلى تمثيل "منسق" ،كما يتحكم به
.هناك بناء جملة تنسيق قياسي يتم استخدامه من قبل معظم األنواع المضمنة :مواصفات التنسيق لغة مصغرة
تتم ترجمة استدعاء إلى والذي يتجاوز قاموس المثيل عند البحث عن طريقة القيمة . يظهر استثناء إذا وصل بحث
أو القيمة المرجعة عبارة عن format_spec غير فارغ ،أو إذا لم تكن قيمة format_spec األسلوب وكان
.format(value, format_spec)type(value).__format__(value, format_spec)__format__()TypeErrorسالسل
object
) ] متكرر frozenset( [ فئة
هي فئة مدمجة . frozenset.كائن جديد ، اختياريًا باستخدام العناصر المأخوذة من العناصر القابلة للتكرار frozensetقم بإرجاع
.للتوثيق حول هذه الفئة، frozenset و تعيين أنواع -مجموعة frozensetانظر
Pg. 151
.الوحدة النمطية collections والفئات ،باإلضافة إلى tuple، dictو set، listبالنسبة للحاويات األخرى ،راجع الفئات المضمنة
إرجاع قيمة السمة المسماة للكائن . يجب أن يكون االسم سلسلة .إذا كانت السلسلة هي اسم إحدى سمات الكائن ،فإن النتيجة هي قيمة
تلك السمة .على سبيل المثال ،يعادل . في حالة عدم وجود السمة المسماة ، 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
إذا كنت ترغب في تحويل رقم صحيح إلى سلسلة سداسية عشرية كبيرة أو أقل ببادئة أم ال ،يمكنك استخدام أي من الطريقتين
:التاليتين
>>>
.لتحويل سلسلة سداسية عشرية إلى عدد صحيح باستخدام األساس int()16انظر أيضًا
ملحوظة
) كائن id(
إعادة "هوية" كائن .هذا عدد صحيح مضمون أن يكون فري ًدا وثاب ًتا لهذا الكائن خالل حياته .قد يكون لكائنان ذات أعمار غير متراكبة
.القيمة id() نفس
id.بالحجة builtins.id يثير حدث تدقيق
] ) موجه input( [
إذا كانت الوسيطة الفورية موجودة ،يتم كتابتها إلى اإلخراج القياسي دون سطر جديد الحق .تقوم الوظيفة بعد ذلك بقراءة سطر من
:يتم رفعه .مثال EOF ، EOFErrorاإلدخال ،وتحويله إلى سلسلة (تجريد سطر جديد الحق) ،وإرجاع ذلك .عند قراءة
>>>
>>> s
Pg. 153
قبل قراءة المدخالت promptLبالحجة builtins.input رفع حدث تدقيق
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فإن هذا ليس قانونيًا ،بينما هو كذلك
األسلوب ،الذي يسمى طريقة للحصول على __ base.__indexو قاعدة كائن لديه intتغير في اإلصدار :3.4إذا قاعدة ال مثيل
base.__index__.بدالً من__ base.__intعدد صحيح للقاعدة .تم استخدام اإلصدارات السابقة
.تم التغيير في اإلصدار :3.6يُسمح بتجميع األرقام مع الشرطة السفلية كما هو الحال في الرموز الحرفية
تعتبر الفئة فئة فرعية من نفسها .قد classinfo . إذا كانت الفئة فئة فرعية (مباشرة أو غير مباشرة أو افتراضية ) من Trueالعودة
إذا كانت الفئة True وفي هذه الحالة يتم إرجاع الفئة Union ،عبارة عن مجموعة من كائنات الفئة أو نوع classinfo يكون
.يتم رفع استثناء ، TypeError في أي حالة أخرى classinfo . فئة فرعية ألي إدخال في
Pg. 154
.راجع أيضًا أنواع التكرار
هو بناء قارئ كتلة .على سبيل المثال ،قراءة الكتل ذات العرض الثابت من ملف قاعدة )( iterأحد التطبيقات المفيدة للشكل الثاني
:بيانات ثنائية حتى الوصول إلى نهاية الملف
)process_block(block
) ق len(
أو )أو قائمة أو نطاق tupleمثل سلسلة أو بايت أو( إرجاع طول (عدد العناصر) كائن .قد تكون الوسيطة عبارة عن تسلسل
.مجموعة (مثل قاموس أو مجموعة أو مجموعة مجمدة)
) ] متكرر list( [ فئة
هو في الواقع قابلة للتغيير نوع تسلسل ،كما هو موثق في قوائم و أنواع تسلسل -القائمة ،الصفوف، listبدال من أن تكون وظيفة
.مجموعة (tuple)،
)(locals
عند استدعائها في كتل )( localsتحديث وإرجاع قاموس يمثل جدول الرموز المحلي الحالي .يتم إرجاع المتغيرات المجانية
.هي نفس القاموس)( globalsو، locals() الوظائف ،ولكن ليس في كتل الفئات .الحظ أنه على مستوى الوحدة
ملحوظة
.ال ينبغي تعديل محتويات هذا القاموس ؛ قد ال تؤثر التغييرات على قيم المتغيرات المحلية والمجانية التي يستخدمها المترجم
أعد مكررً ا يطبق وظيفة على كل عنصر قابل للتكرار ، مما يؤدي إلى النتائج .إذا تم تمرير وسيطات إضافية قابلة للتكرار ، فيجب
أن تأخذ الوظيفة العديد من الوسائط ويتم تطبيقها على العناصر من جميع العناصر التكرارية بالتوازي .مع العديد من العناصر
التكرارية ،يتوقف المكرر عند استنفاد أقصر العناصر التكرارية .للحاالت التي يتم فيها ترتيب مدخالت الوظيفة بالفعل في
itertools.starmap().مجموعات الوسيطة ،راجع
إذا تم توفير حجة موضعية واحدة ،فيجب أن تكون قابلة للتكرار . يتم إرجاع العنصر األكبر في التكرارات .إذا تم توفير وسيطين
.موضعيين أو أكثر ،فسيتم إرجاع أكبر الوسائط الموضعية
هناك نوعان من الوسائط االختيارية للكلمات الرئيسية فقط .و رئيسية تحدد حجة ترتيب الوظائف وسيطة واحدة مثل تلك المستخدمة
ً
فارغا ولم يتم iterableو االفتراضية يحدد حجة كائن للعودة إذا قدمت list.sort(). ل فارغ .إذا كان العنصر المكرر
a.رفع ValueErrorتوفير اإلعداد االفتراضي ، فسيتم
إذا كانت العناصر المتعددة هي الحد األقصى ،ترجع الدالة العنصر األول الذي تمت مواجهته .يتوافق هذا مع أدوات الحفاظ على
) .sorted(iterable, key=keyfunc, reverse=Trueاستقرار الفرز األخرى مثل و
)[0]heapq.nlargest(1, iterable, key=keyfunc
Pg. 155
.الجديد في اإلصدار :3.4و االفتراضي حجة الكلمة الوحيدة
) كائن memoryview( فئة
.قم بإرجاع كائن "عرض الذاكرة" الذي تم إنشاؤه من وسيطة معينة .انظر طرق عرض الذاكرة لمزيد من المعلومات
إذا تم توفير حجة موضعية واحدة ،فيجب أن تكون قابلة للتكرار . يتم إرجاع العنصر األصغر في القابل للتكرار .إذا تم توفير
.وسيطين موضعيين أو أكثر ،فسيتم إرجاع أصغر وسيطات موضعية
هناك نوعان من الوسائط االختيارية للكلمات الرئيسية فقط .و رئيسية تحدد حجة ترتيب الوظائف وسيطة واحدة مثل تلك المستخدمة
ً
فارغا ولم يتم iterableو االفتراضية يحدد حجة كائن للعودة إذا قدمت list.sort(). ل فارغ .إذا كان العنصر المكرر
a.رفع ValueErrorتوفير اإلعداد االفتراضي ، فسيتم
إذا كانت العناصر المتعددة ضئيلة ،فإن الوظيفة ترجع العنصر األول الذي تمت مواجهته .يتوافق هذا مع أدوات الحفاظ على
) .sorted(iterable, key=keyfunc)[0]heapq.nsmallest(1, iterable, key=keyfuncاستقرار الفرز األخرى مثل و
طريقته .إذا تم تقديم االفتراضي ، يتم إرجاعه إذا تم استنفاد )(__ __nextاسترجع العنصر التالي من المكرر عن طريق استدعاء
.يتم رفعه StopIterationالمكرر ،وإال
objectفئة
هي قاعدة لجميع الطبقات .لديها طرق مشتركة لجميع مثيالت أصناف بايثون .هذه الوظيفة ال . objectإعادة كائن جديد غير مميز
.تقبل أي حجج
ملحوظة
) خ oct(
Python ،كائ ًنا في xint والنتيجة هي تعبير صالح في بايثون .إذا لم يكنo". تحويل عدد صحيح إلى سلسلة ثماني مسبوقة بـ "0
:طريقة ُترجع ً
عددا صحيحً ا .على سبيل المثال)(__ __indexفيجب عليه تحديد
>>>
)>>> oct(8
''0o10
)>>> oct(-56
''-0o70
.أو ال ،يمكنك استخدام أي من الطرق التالية " oإذا كنت تريد تحويل رقم صحيح إلى سلسلة ثماني إما بالبادئة "0
Pg. 156
>>>
)'('0o12', '12
)'('0o12', '12
)'('0o12', '12
ملف ، وضع' = ص' ، التخزين المؤقت ، 1 - = ترميز = ال يوجد ، أخطاء = ال يوجد ، السطر = ال open(
) صحيح ، فتحت = ال يوجد ، closefd = يوجد
رفع ملف .راجع قراءة الملفات وكتابتها لمزيد من OSErrorافتح الملف وأعد كائن الملف المقابل . إذا تعذر فتح الملف ،فسيتم
.األمثلة حول كيفية استخدام هذه الوظيفة
الملف هو كائن يشبه المسار يعطي اسم المسار (مطلق أو متعلق بدليل العمل الحالي) للملف المراد فتحه أو واصف ملف عدد صحيح
إذا تم توفير واصف ملف ،فسيتم إغالقه عند إغالق كائن اإلدخال /اإلخراج المرتجع ما لم يتم (. للملف المراد تغليفه
) False.على closeefd تعيين
مما يعني أنه مفتوح للقراءة في وضع' 'rالوضع عبارة عن سلسلة اختيارية تحدد الوضع الذي يتم فيه فتح الملف .يتم تعيينه افتراضيًا
وهو ما يعني ( وإللحاق' ، 'aوإلنشاء خاص' ، 'xللكتابة (اقتطاع الملف إذا كان موجو ًدا بالفعل)' 'wالنص .القيم الشائعة األخرى هي
في وضع النص ،إذا ترميز لم ). أن جميع الكتابات تلحق بنهاية الملف بغض النظر عن موضع البحث الحالي Unixفي بعض أنظمة
ويسمى للحصول على ترميز ): locale.getpreferredencoding(Falseيتم تحديد الترميز المستخدمة هي التي تعتمد على منصة
:اللغة الحالي( .للقراءة والكتابة بالبايت الخام ،استخدم الوضع الثنائي واترك الترميز غير محدد ).األوضاع المتاحة هي
اختالف
المعنى
الشخصيات
''x فتح لإلنشاء الحصري ،والفشل إذا كان الملف موجو ًدا بالفعل
''a مفتوح للكتابة ،وإلحاق بنهاية الملف إذا كان موجو ًدا
بين اإلدخال /اإلخراج الثنائي والنص .ترجع الملفات المفتوحة في الوضع الثنائي 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'
يتحكم الخط الجديد في كيفية عمل وضع الخطوط الجديدة العامة( ينطبق فقط على وضع النص) .ويمكن أن
:يعمل على النحو التالي '\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).وظائف مماثلة لتمرير
ً
حديثا غير قابل للتوريث .الملف الذي تم إنشاؤه
>>>
...
...
استخدامه لفتح ملف في وضع نص)( openالوظيفة على الوضع .عند)( openيعتمد نوع كائن الملف الذي تم إرجاعه بواسطة
عند io.TextIOWrapper). على وجه التحديد( io.TextIOBaseفإنه يقوم بإرجاع فئة فرعية من ) ،إلخ ( 'w'، 'r'، 'wt'، 'rt'،
استخدامها لفتح ملف في الوضع الثنائي مع التخزين المؤقت ،فإن الفئة التي تم إرجاعها هي فئة فرعية
؛ في أوضاع io.BufferedReaderتختلف الفئة الدقيقة :في وضع القراءة الثنائي ،تقوم بإرجاع io.BufferedIOBase. من
وفي وضع القراءة /الكتابة ،تقوم io.BufferedWriter،الكتابة الثنائية واإللحاق ،تقوم بإرجاع
عند تعطيل التخزين المؤقت ، يتم إرجاع التدفق األولي ،فئة فرعية io.BufferedRandom. بإرجاع
io.RawIOBase، io.FileIO.من
file، mode، flags.بالحجج open يثير حدث تدقيق
Pg. 159
OSError.كان يُثار ،أصبح اآلن اسمًا مستعارً ا لـIOError
.موجو ًدا بالفعل )' ( 'xيظهر اآلن إذا كان الملف المفتوح في وضع اإلنشاء الخاصFileExistsError
إذا تمت مقاطعة استدعاء النظام ولم يقم معالج اإلشارة بإصدار استثناء ،تقوم الوظيفة اآلن بإعادة محاولة استدعاء النظام
).لألساس المنطقيPEP 475 راجع( استثناء InterruptedErrorبدالً من رفع
io.FileIO.بخالف io.RawIOBaseقد يؤدي فتح مخزن مؤقت لوحدة التحكم إلى إرجاع فئة فرعية Windows ،في
) ج ord(
لهذا الحرف .على سبيل Unicodeواحد ،قم بإرجاع عدد صحيح يمثل نقطة رمز Unicodeإعطاء سلسلة تمثل حرف
chr().العوائد (عالمة اليورو) .8364 هذا هو معكوس )' ord('€بإرجاع عدد صحيح97 و)'، ord('aالمثال
محسوبة بشكل أكثر ( 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 إرجاعها ،حيث
>>>
23
>>> 23 * 38 % 97 == 1
True
يسمح الشكل المكون من ثالث وسيطات اآلن بأن تكون الوسيطة الثانية ، powللمعامالت intLتم التغيير في اإلصدار :3.8بالنسبة
.سالبة ،مما يسمح بحساب االنعكاسات Lالمعيارية
.تم التغيير في اإلصدار :3.8السماح بوسائط الكلمات األساسية .في السابق ،تم دعم الحجج الموضعية فقط
Pg. 160
) تدفق = خطأ = sys.stdout ، ملف = '\ n' ، النهاية ، sep = '' ، كائنات print( *
ال تحتوي على كلمات رئيسية إلى سالسل كما هو الحال ويتم كتابتها في الدفق str() ،يتم تحويل جميع الوسيطات التي
مما يعني استخدام القيم None،سالسل ؛ يمكن أن تكون أيضًا end و sep مفصولة بفاصلة متبوعة بنهاية . يجب أن يكون كل من
.فسوف تكتب النهاية )( ، printاالفتراضية .إذا لم يتم إعطاء أي كائنات
سيتم استخدامها .نظرً ا None، sys.stdoutاألسلوب .إذا لم تكن موجودة أو) write(stringفي ملف يجب أن يكون حجة كائن مع
فال يمكن استخدامها مع كائنات الملفات ذات الوضع الثنائي .لهذه ، print() ،ألنه يتم تحويل الوسائط المطبوعة إلى سالسل نصية
.بدال من ذلك) file.write(...استخدم
.ما إذا كانت مخزنة الناتج عادة يتم تحديدها من قبل ملف ، ولكن إذا كان تدفق حجة الكلمة صحيحة ،يتم مسح تيار قسرا
) ال شيء ، doc = ال شيء ، fdel = ال شيء ، fset = ال شيء property( fget = فئة
هي وظيفة لحذف قيمة سمة .و ثيقة يخلق. fdel هي وظيفة لتحديد قيمة السمة. fset هي وظيفة للحصول على قيمة سمةfget
.للسمة docstring
class C:
def __init__(self):
self._x = None
def getx(self):
return self._x
self._x = value
def delx(self):
del self._x
.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):
return self._voltage
عن الجهد docstring األسلوب الى "جالبة" لسمة للقراءة فقط بنفس االسم ،ويقوم بتعيين)( voltageالديكور يتحول @propertyو
" .ل"احصل على الجهد الحالي
أساليب يمكن استخدامها في الديكور أن إنشاء Lنسخة من الممتلكات مع ما يوازيها من deleterو getter، setterكائن الملكية لديها
:مجموعة وظيفة استرجاع إلى وظيفة تزيين .من األفضل شرح ذلك بمثال
class C:
def __init__(self):
self._x = None
@property
def x(self):
return self._x
@x.setter
self._x = value
@x.deleter
def x(self):
del self._x
).في هذه الحالة ( xهذا الرمز يعادل بالضبط المثال األول .تأكد من إعطاء الوظائف اإلضافية نفس اسم الخاصية األصلية
.تم التغيير في اإلصدار :3.5أصبحت سالسل مستندات كائنات الخاصية قابلة للكتابة اآلن
) توقف range( فئة
Pg. 162
هو في الواقع غير قابل للتغيير نوع تسلسل ،كما هو موثق في نطاقات و أنواع تسلسل -القائمة، range ،بدال من أن تكون وظيفة
.مجموعة (tuple)،الصفوف
) كائن repr(
إرجاع سلسلة تحتوي على تمثيل قابل للطباعة لكائن .بالنسبة للعديد من األنواع ،تحاول هذه الوظيفة إرجاع سلسلة من شأنها أن
؛ بخالف ذلك ،يكون التمثيل عبارة عن سلسلة محاطة بأقواس زاوية تحتوي )( evalتؤدي إلى كائن بنفس القيمة عند تمريرها إلى
على اسم نوع الكائن مع معلومات إضافية غالبًا تتضمن اسم الكائن وعنوانه .يمكن للفئة التحكم في ما ترجع إليه هذه الوظيفة
.طريقة)(__ __reprلمثيالتها من خالل تحديد
) فيما يليها (reversed
؛ إذا قدم المساواة ndigits يتم تقريب القيم إلى أقرب مضاعف لـ 10إلى القوة ناقص round()،بالنسبة لألنواع المضمنة الداعمة
round(-و) round(0.5حتى ،على سبيل المثال ،على حد سواء( قريب ،تدوير األرقام يتم اثنين من مضاعفات نحو االختيار حتى
القيمة المرجعة هي ). موجب ،صفر ،أو سالب( ndigits أي قيمة عدد صحيح صالحة لعدد). هو round(1.5)2 هي ،0 و)0.5
.خالف ذلك ،فإن القيمة المرجعة لها نفس نوع الرقم None. أو ndigits عدد صحيح إذا تم حذف
ملحوظة
مفاج ًئا :على سبيل المثال ،يعطي بدالً من المتوقع . هذا ليس خطأ :إنه نتيجة لحقيقة أن for floatsيمكن أن يكون سلوك)(round
معظم الكسور العشرية ال يمكن تمثيلها على أنها عدد عشري .راجع حساب Lالنقطة العائمة :المشكالت والقيود لمزيد من
.round(2.675, 2)2.672.68المعلومات
) ] متكرر set( [ فئة
و تعيين setهي فئة مدمجة .انظر . setكائن جديد ، اختياريًا باستخدام العناصر المأخوذة من العناصر القابلة للتكرار setقم بإرجاع
.للتوثيق حول هذه الفئة، frozenset أنواع -مجموعة
) كائن ، اسم ، قيمة setattr(
الوسيطات هي كائن وسلسلة وقيمة عشوائية .قد تقوم السلسلة بتسمية سمة موجودة أو سمة جديدة .تقوم getattr(). هذا هو المقابل لـ
.setattr(x, 'foobar', 123)x.foobar = 123الوظيفة بتعيين قيمة للسمة ،بشرط أن يسمح بها الكائن .على سبيل المثال ،يعادل
ملحوظة
نظرً ا ألن تغيير االسم الخاص يحدث في وقت التحويل البرمجي ،يجب على المرء أن يفسد يدويًا اسم سمة خاصة (سمات ذات
setattr().شرطتين سفليتين رئيسيتين) من أجل تعيينها
) توقف slice( فئة
Pg. 163
قم بإرجاع كائن شريحة يمثل مجموعة الفهارس المحددة بواسطة . في بداية و خطوة الوسائط االفتراضية ل . قرأت فقط األشياء
شريحة سمات البيانات ، و التي مجرد إرجاع القيم الحجة (أو االفتراضية) .ليس لديهم وظائف أخرى صريحة ؛ ومع ذلك ،يتم
وحزم الجهات الخارجية األخرى .يتم أيضً ا إنشاء كائنات الشرائح عند استخدام صيغة الفهرسة NumPyاستخدامها بواسطة
الممتدة .على سبيل المثال :أو . انظر للحصول على نسخة بديلة تقوم بإرجاع
)(.range(start, stop, step)Nonestartstopstepa[start:stop:step]a[start:stop, i]itertools.isliceمكرر
على سبيل ( مفتاح يحدد وظيفة من وسيطة واحدة يتم استخدامها الستخراج مفتاح مقارنة من كل عنصر في قابل للتكرار
).قارن العناصر مباشرة( Noneالقيمة االفتراضية هي ، key=str.lower). المثال
.فسيتم فرز عناصر القائمة كما لو تم عكس كل مقارنة True،العكس هو قيمة منطقية .إذا تم التعيين على
الوظيفة المدمجة مضمونة لتكون مستقرة .يكون الفرز مستقرً ا إذا كان يضمن عدم تغيير الترتيب النسبي للعناصر التي )(sorted
.تقارن متساوية -وهذا مفيد للفرز في عدة ممرات (على سبيل المثال ،الفرز حسب القسم ،ثم حسب درجة الراتب)
PEPطريقة سيكون كافيا ً للفرز ،توصي)(__ __ltتستخدم خوارزمية الفرز< مقارنات بين العناصر فقط . في حين أن تحديد
بتنفيذجميع المقارنات الثرية الست .سيساعد هذا في تجنب األخطاء عند استخدام نفس البيانات مع أدوات الطلب األخرى مثل 8
التي تعتمد على طريقة أساسية مختلفة .يساعد تنفيذ جميع المقارنات الستة أي ً
ضا على تجنب االرتباك للمقارنات المختلطة )(maxتلك
.الطريقةالمنعكسة__gt__()Lالتي يمكن أن تستدعي
.للحصول على أمثلة حول الفرز ودورة تعليمية موجزة عن الفرز ،راجع فرز كيفية
@staticmethod
:ال يتلقى األسلوب الثابت وسيطة أولى ضمنية .لإلعالن عن طريقة ثابتة ،استخدم هذا المصطلح
class C:
@staticmethod
( عالوة على ذلك ،يمكن تسميتها بالوظائف العادية C().f()). مثل( أو في مثيل ))( C.fمثل( يمكن استدعاء طريقة ثابتة إما في الفئة
f()).مثل
إلى المتغير الذي يفيد في إنشاء )( classmethodانظر أيضًا C ++. أو Javaمشابهة Lلتلك الموجودة في Pythonالطرق الثابتة في
.مُنشئ فئة بديل
وظيفة عادية والقيام بشيء ما بنتائجها .هذا مطلوب في بعض staticmethodمثل جميع المصممين ،من الممكن أيضً ا استدعاء
الحاالت التي تحتاج فيها إلى مرجع إلى وظيفة من جسم فئة وتريد تجنب التحويل التلقائي إلى أسلوب المثيل .لهذه الحاالت ،استخدم
:هذا المصطلح
def regular_function():
...
Pg. 164
class C:
)method = staticmethod(regular_function
- str .هي فئة السلسلة المضمنة . للحصول على معلومات عامة حول السالسل ،راجع نوع تسلسل النصstr
البنود الصورة عادة ما تكون األرقام iterable ،تبدأ المجاميع وعناصر قابلة للتكرار من اليسار إلى اليمين و ُترجع اإلجمالي .و
.وغير مسموح قيمة البداية وحتى تكون سلسلة
الطريقة المفضلة والسريعة لتسلسل سلسلة من السالسل هي عن sum(). بالنسبة لبعض حاالت االستخدام ،توجد بدائل جيدة لـ
لتسلسل سلسلة من العناصر math.fsum(). إلضافة قيم النقطة العائمة بدقة ممتدة ،راجع ''.join(sequence). طريق االتصال
itertools.chain().التكرارية ،ضع في اعتبارك استخدام
قم بإرجاع كائن وكيل يقوم بتفويض استدعاءات األسلوب إلى فئة من النوع األصل أو األشقاء . هذا مفيد للوصول إلى األساليب
.الموروثة التي تم تجاوزها في فئة
السمة super(). و)( getattrالسمة من كائن أو نوع القوائم األسلوب دقة ترتيب البحث التي يستخدمها كل من__ __mroو
.ديناميكية ويمكن أن تتغير كلما تم تحديث التسلسل الهرمي للوراثة
إذا تم حذف الوسيطة الثانية ،فسيكون الكائن الفائق الذي تم إرجاعه غير منضم .إذا كانت الوسيطة الثانية كائ ًنا ،فيجب أن تكون
صحيحة .إذا كانت الوسيطة الثانية من النوع ،فيجب أن تكون صحيحة (هذا مفيد للطرق
).isinstance(obj, type)issubclass(type2, typeالصفية)
هناك حالتان نموذجيتان لالستخدام الفائق . في التسلسل الهرمي للفئة ذات الميراث الفردي ،يمكن استخدام الفائق لإلشارة إلى الفئات
في لغات super األصلية دون تسميتها صراحة ،مما يجعل الكود أكثر قابلية للصيانة .هذا االستخدام يوازي بشكل وثيق استخدام
.البرمجة األخرى
حالة االستخدام الثانية هي دعم الميراث المتعدد التعاوني في بيئة تنفيذ ديناميكية .حالة االستخدام هذه خاصة ببايثون وال توجد في
اللغات المجمعة بشكل ثابت أو اللغات التي تدعم الوراثة الفردية فقط .هذا يجعل من الممكن تنفيذ "المخططات Lالماسية" حيث تقوم
فئات أساسية متعددة بتطبيق نفس الطريقة .يفترض التصميم الجيد أن مثل هذه التطبيقات لها نفس توقيع االتصال في كل حالة (ألن
ترتيب المكالمات يتم تحديده في وقت التشغيل ،ألن هذا الترتيب يتكيف مع التغييرات في التسلسل الهرمي للفئة ،وألن هذا الترتيب
.يمكن أن يتضمن فئات أشقاء غير معروفة قبل وقت التشغيل )
:لكلتا حالتي االستخدام ،تبدو مكالمة Lالطبقة الفائقة النموذجية كما يلي
Pg. 165
class C(B):
تعمل أيضً ا مع عمليات البحث عن السمات .إحدى حاالت االستخدام المحتملة )( ، superباإلضافة إلى عمليات البحث عن الطريقة
.لذلك هي استدعاء الواصفات في فئة الوالدين أو األشقاء
يتم تنفيذه كجزء من عملية الربط لعمليات البحث الصريحة للسمات Lالمنقطة )( superالحظ أن ذلك
للبحث عن الفئات )(__ __getattributeتقوم بذلك من خالل تنفيذ طريقتها الخاصة super().__getitem__(name). مثل
يتم تعريف عمليات البحث الضمنية باستخدام عبارات أو)( ، superبترتيب يمكن التنبؤ به يدعم الميراث المتعدد التعاوني .وف ًقا لذلك
super()[name].عوامل تشغيل مثل
ضا أنه ،بصرف النظر عن نموذج الوسيطة الصفرية ال يقتصر على استخدام الطرق الداخلية .يحدد نموذج )( ، superالحظ أي ً
الوسيطتين الوسيطتين تمامًا ويقدم المراجع المناسبة .ال يعمل نموذج الوسيطة الصفرية إال داخل تعريف الصنف ،حيث يمأل المترجم
.التفاصيل الضرورية السترداد الفئة التي تم تحديدها بشكل صحيح ،وكذلك الوصول إلى المثيل الحالي للطرق العادية
super () .راجع دليل استخدام super()،للحصول على اقتراحات عملية حول كيفية تصميم الفصول التعاونية باستخدام
) ] متكرر tuple( [ فئة
هو في الواقع غير قابل للتغيير نوع تسلسل ،كما هو موثق في التيوبل و أنواع تسلسل -القائمة، tuple ،بدال من أن تكون وظيفة
.مجموعة (tuple)،الصفوف
) كائن type( فئة
باستخدام وسيطة واحدة ،قم بإرجاع نوع الكائن . القيمة المعادة هي كائن نوع وعمومًا نفس الكائن الذي تم إرجاعه
object.__class__.بواسطة
.المدمج في وظيفة ينصح الختبار نوع كائن ،ألنه يأخذ بعين االعتبار الفئات الفرعية)( isinstanceو
للبيان .و اسم السلسلة اسم الفئة classباستخدام ثالث وسيطات ،قم بإرجاع كائن نوع جديد .هذا هو في األساس شكل ديناميكي
السمة .إذا كانت __ __basesيحتوي على الفئات األساسية ويصبح ) (tupleالسمة .و قواعد الصفوف__ __nameوتصبح
تتم إضافة القاعدة النهائية لجميع الفئات .و ديكت القاموس يحتوي على سمة وطريقة تعاريف للجسم الطبقة .قد يتم object،فارغة
:كائنات متطابقة typeالسمة .العبارتان التاليتان تنشئان__ __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يظهر
).السمة
.كرر العديد من العناصر التكرارية على التوازي ،مما ينتج عنه مجموعات تحتوي على عنصر من كل عنصر
:مثال
>>>
... )print(item
...
)'(1, 'sugar
)'(2, 'spice
.وهي تحويل الصفوف إلى أعمدة واألعمدة إلى صفوف .هذا مشابه لنقل مصفوفة)( zipهناك طريقة أخرى للتفكير
حلقة أو عن طريق forكسول :لن تتم معالجة Lالعناصر حتى يتم إعادة تشغيل العنصر المتكرر ،على سبيل المثال عن طريق)(zip
list.االلتفاف في ملف
يمكن أن يكون لها أطوال مختلفة ؛ أحيا ًنا عن طريق )( zipشيء واحد يجب مراعاته هو أن العناصر التكرارية التي تم تمريرها
:ثالث طرق مختلفة للتعامل مع هذه المشكلة Pythonالتصميم ،وأحيا ًنا بسبب خطأ في الكود الذي أعد هذه العناصر المكررة .تقدم
يتوقف عند استنفاد أقصر تكرارات .سوف يتجاهل العناصر المتبقية في العناصر التكرارية )( ، zipبشكل افتراضي
:األطول ،ويقطع النتيجة بطول أقصر تكرارات
>>>
غالبًا ما يستخدم في الحاالت التي يُفترض فيها أن تكون العناصر التكرارية متساوية الطول .في مثل هذه الحاالت zip() ،
zip():الخيار .ناتجها هو نفسه العادي strict=True يوصى باستخدام
Pg. 167
>>>
:إذا لم تكن كذلك ValueErrorعلى عكس السلوك االفتراضي ،فإنه يتحقق من أن أطوال العناصر التكرارية متطابقة ،ويرفع قيمة
>>>
...
الحجة ،سيتم إسكات أي خطأ ينتج عنه متكررات ذات أطوال مختلفة ،وربما يظهر على أنه خطأ يصعب strict=Trueبدون
.العثور عليه في جزء آخر من البرنامج
يمكن حشو العناصر التكرارية األقصر بقيمة ثابتة لجعل جميع العناصر التكرارية لها نفس الطول .يتم
itertools.zip_longest().ذلك بواسطة
مع عدم وجود وسيطات ،فإنه يقوم -tuples. إرجاع مكرر من zip()1باستخدام وسيطة واحدة قابلة للتكرار ،يتم Edge:حاالت
.بإرجاع مكرر فارغ
:النصائح والحيل
يتم ضمان ترتيب التقييم من اليسار إلى اليمين من العناصر التكرارية .هذا يجعل من الممكن المصطلح لتجميع سلسلة
باستخدام . هذا يكرر نفس مرات التكرار بحيث يكون لكل مجموعة مخرجات n Lالبيانات في مجموعات الطول
n.zip(*[iter(s)]*n, strict=True)nnنتيجة استدعاءات للمكرر .هذا له تأثير تقسيم المدخالت إلى أجزاء ذات طول
>>>
True
) االسم ، الكرة األرضية = ال شيء ، السكان المحليون = ال شيء ، من القائمة ، )( = المستوى__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هنا ألن هذا هو الكائن المرتبط باسم من خالل ُ toplevelترجع الوحدة النمطية)(__ __importالحظ كيف
eggs = _temp.eggs
saus = _temp.sausage
من هذا الكائن ،يتم استرداد األسماء المراد استيرادها وتخصيصها __import__(). يتم إرجاع الوحدة من ، spam.hamهنا
.ألسمائها الخاصة
إذا كنت ترغب ببساطة في استيراد وحدة نمطية (من المحتمل أن تكون ضمن حزمة) باالسم ،
importlib.import_module().فاستخدمL
.تم تجاهله اآلنPYTHONCASEOK قيد االستخدام ،متغير البيئة -Iأو -Eتم التغيير في اإلصدار :3.9عند خيارات سطر األوامر
الثوابت
False
True
None
Pg. 169
عنصر يستخدم بشكل متكرر لتمثيل عدم وجود قيمة ،كما هو الحال عندما ال يتم تمرير الوسيطات االفتراضية إلى
.النوع NoneTypeهو المثيل الوحيد من SyntaxError. Noneغير قانونية ورفع أ None دالة .التخصيصات
NotImplemented
على سبيل ( قيمة خاصة يجب إرجاعها بواسطة الطرق الخاصة الثنائية
لإلشارة إلى أن العملية لم يتم تنفيذها فيما يتعلق بالنوع )إلخ __eq__()، __lt__()، __add__()، __rsub__()،المثال
لنفس )وغيرها)(__ __imul__()، __iandعلى سبيل المثال( اآلخر ؛ يمكن إرجاعها بواسطة الطرق في مكان الثنائية الخاصة
.النوع types.NotImplementedTypeهو المثيل الوحيد من. NotImplementedالغرض .ال ينبغي تقييمها في سياق منطقي
ملحوظة
سيحاول المترجم الفوري العملية المنعكسة Lعلى النوع اآلخر (أو NotImplemented،عندما ترجع الطريقة الثنائية (أو الموضعية)
ً
اعتمادا على عامل التشغيل) .إذا عادت جميع المحاوالت فسيقوم NotImplemented،بعض اإلجراءات االحتياطية األخرى ،
سيؤدي اإلرجاع بشكل غير صحيح إلى ظهور رسالة خطأ مضللة . NotImplementedالمترجم بإصدار استثناء مناسبL
Python.إرجاع القيمة إلى كود NotImplementedأو
ملحوظة
تم إهمال التقييم في سياق منطقي .بينما يتم تقييمه حاليًا على أنه صحيح ،فإنه :NotImplemented تم التغيير في اإلصدار 3.9
Python.طرح إصدار في المستقبل من TypeErrorسيتم DeprecationWarning. سيصدر ملف
Ellipsis
نفس عالمة القطع " ."... تستخدم القيمة الخاصة في الغالب باالقتران مع بنية التقطيع الموسعة ألنواع بيانات الحاوية المعرفة Lمن قبل
.النوع types.EllipsisTypeهو المثيل الوحيد من. Ellipsisالمستخدم
____debug
ملحوظة
ولذلك SyntaxError)،تعيينات لهم ،وحتى اسم سمة ،رفع( ال يمكن إعادة تعيين __debug__ و None، False، Trueأسماء
".يمكن اعتبار الثوابت "الحقيقية
يضيف عدة الثوابت إلى )يتم إعطاء خيار سطر األوامر -Sوالتي يتم استيرادها تلقائيا أثناء بدء التشغيل ،إال إذا كان( حدة siteو
.مساحة االسم المضمنة .وهي مفيدة لقذيفة المترجم التفاعلي وال ينبغي استخدامها في البرامج
للخروج" ،وعند استدعائها EOF) ،أي( Ctrl-Dأو )( "Use quitالكائنات التي عند طباعتها ،اطبع رسالة مثل
.باستخدام رمز الخروج المحدد SystemExitارفعهاL
Pg. 170
copyright
credits
.الكائنات التي تطبع نص حقوق النشر أو االعتمادات عند طباعتها أو استدعاؤها ،على التوالي
license
الكائن الذي عند طباعته ،يطبع الرسالة "نوع الترخيص () لرؤية نص الترخيص الكامل" ،وعندما يتم االتصال به ،يعرض نص
.الترخيص الكامل بطريقة تشبه الصفحة (شاشة واحدة في كل مرة)
أنواع
بعض فئات المجموعة قابلة للتغيير .الطرق التي تضيف أو تطرح أو تعيد ترتيب أعضائها في مكانها ، Lوال تعيد عنصرً ا معي ًنا ،ال
ُ None.ترجع أب ًدا نسخة المجموعة نفسها ولكن
يتم دعم بعض العمليات بواسطة عدة أنواع من الكائنات ؛ على وجه الخصوص ،يمكن مقارنة جميع الكائنات عمليًا من أجل
يتم استخدام الوظيفة ). الوظيفة المختلفة قليالً)( strالوظيفة أو)( reprمع( المساواة ،واختبار قيمة الحقيقة ،وتحويلها إلى سلسلة
.الوظيفة)( printاألخيرة ضمنيًا عندما تتم كتابة كائن بواسطة
.شرط أو المعامل العمليات المنطقية أدناه whileأو ifأي كائن يمكن اختبار لقيمة الحقيقة ،الستخدامها في
طريقة ُترجع صفرً ا __len__() ،أو Falseطريقة ُترجع)(__ __boolبشكل افتراضي ،يعتبر الكائن صحيحً ا ما لم تحدد فئته إما
:عند استدعائها مع الكائن 1 .فيما يلي معظم العناصر المضمنة التي تعتبر خاطئة
(. للصواب ،ما لم يُذكر خالف ذلك/ Trueللخطأ و False1 العمليات والوظائف المضمنة التي لها نتيجة منطقية تعود دائمًا 0 أو
).دائما يعود واحد من المعامالت الخاصة بهم andو orاستثناء هام :العمليات المنطقية
- and، or، notالعمليات المنطقية
x and
إذا كانت س خطأ ،ثم س ، وإال ص )(2
y
:ملحوظات
.هذا عامل تشغيل ماس كهربائى ،لذا فهو يقيم الوسيطة الثانية فقط إذا كانت األولى خاطئة 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 no
رفض هوية الكائن
t
أبدا بالتساوي .و== يعرف مشغل دائما لكن بالنسبة لبعض كائنات من أنواع مختلفة ،باستثناء األنواع الرقمية المختلفة ،ال تقارن ً
و> ،=< ،< و => يتم تعريف المشغلين فقط حيث كانت منطقية .على is. أنواع الكائنات (على سبيل المثال ،كائنات فئة) ما يعادل
.استثناء عندما تكون إحدى الوسيطات رقمًا مركبًا TypeErrorسبيل المثال ،تثير
.الطريقة)(__ __eqعاد ًة ما ُت قارن األمثلة غير المتطابقة لفئة على أنها غير متكافئة ما لم تحدد الفئة
مثيالت الفئة ال يمكن أن يؤمر فيما يتعلق حاالت أخرى من نفس الفئة ،أو أنواع أخرى من وجوه ،ما لم تحدد الدرجة ما يكفي من
كافية ،إذا كنت تريد المعاني )(__ __eqو)(__، __ltبشكل عام()(__ __geو __lt__()، __le__()، __gt__()،األساليب
).التقليدية لل عوامل المقارنة
.is notو مشغلي ال يمكن تخصيص .كما يمكن تطبيقها على أي كائنين وال تثير استثنا ًء مطل ًقا isسلوك
- int، float، complexأنواع األرقام
هناك ثالثة أنواع متميزة الرقمية :األعداد الصحيحة ، أرقام النقطة العائمة ، و األعداد المركبة . باإلضافة إلى ذلك ،تعد القيم
المنطقية نوعً ا فرعيًا من األعداد الصحيحة .األعداد الصحيحة لها دقة غير محدودة .عادة ما يتم تنفيذ أرقام الفاصلة العائمة
؛ تتوفر معلومات حول الدقة والتمثيل الداخلي ألرقام الفاصلة العائمة للجهاز الذي يعمل عليه Cباستخدام ضعف في
تحتوي األعداد المركبة على جزء حقيقي وخيالي ،وكل منهما عبارة عن رقم فاصلة عائمة .الستخراج sys.float_info. برنامجك
تتضمن المكتبة القياسية األنواع الرقمية ( z.imag. و z.realهذه األجزاء من رقم مركب ض ، استخدم
ألرقام الفاصلة العائمة بدقة يمكن تحديدها من قبل decimal.Decimal،لألسباب المنطقية ،و fractions.Fraction،اإلضافية
).المستخدم
Pg. 172
يتم إنشاء األرقام بواسطة حرفية رقمية أو كنتيجة لوظائف وعوامل مضمنة .ينتج عن األعداد الصحيحة غير المزخرفة (بما في ذلك
األرقام السداسية والثمانية والثنائية) أعداد صحيحة .تنتج القيم الحرفية الرقمية التي تحتوي على فاصلة عشرية أو عالمة األس أرقامًا
به ينتج عنه رقم تخيلي (رقم مركب به جزء حقيقي صفري) والذي يمكنك إضافته إلى' 'Jأو' 'jفاصلة عائمة .إلحاق رقم حرفي رقمي
.عدد صحيح أو عائم للحصول على رقم معقد بأجزاء حقيقية وخيالية
الحساب المختلط تما ًم ا :عندما يكون لدى عامل حسابي ثنائي معامالت من أنواع عددية مختلفة ،يتم توسيع المعامل Pythonتدعم
ذي النوع "الضيق" إلى النوع اآلخر ،حيث يكون العدد الصحيح أضيق من النقطة العائمة ،والتي تكون أضيق من
المعامل .تتصرف المقارنة بين أعداد األنواع المختلفة وكأن القيم الدقيقة لتلك األرقام تتم مقارنتها2 .
:تدعم جميع األنواع الرقمية (باستثناء المعقدة) العمليات التالية (للتعرف على أولويات العمليات ،راجع أسبقية المشغل)
ملحوظا
عملية نتيجة وثائق كاملة
ت
x + y yو x مجموع
-x س نفي
:ملحوظات
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.
.سالبة
).الخاصية Ndنقاط الرمز مع( Unicodeتتضمن القيم الحرفية الرقمية المقبولة األرقام0 إلى9 أو أي مكافئ لـ 6.
عملية نتيجة
math.trunc(x
Integralمقطوع إلىx
)
فسيتم تعيينه افتراضيًا على n ،من األرقام ،مع تقريب نصف إلى زوجي .إذا تم حذف nمقربة إلىx
)]round(x[, n
0.
)math.floor(x س Integral <= أعظم
منطقية فقط لألعداد الصحيحة .يتم حساب Lنتيجة العمليات األحادية كما لو تم تنفيذها في تكملة ثنائية مع عدد ال Bitwiseعمليات
.حصر له من بتات اإلشارة
أولويات العمليات ثنائية البت هي كلها أقل من العمليات الرقمية وأعلى من المقارنات ؛ العملية األحادية~ لها نفس أولوية العمليات
.الرقمية األحادية األخرى (+ و)-
:يسرد هذا الجدول عمليات البت التي تم فرزها حسب Lاألولوية التصاعدية
Pg. 174
عملية نتيجة ملحوظات
x <<
بت n لليسار بمقدار x إزاحة )(1)(2
n
x >>
بت n لليمين بمقدار x إزاحة )(1)(3
n
~x مقلوبة x بتات
:ملحوظات
".في رفع قيمة "أ ValueErrorتعد أعداد المناوبات السلبية غير قانونية وتتسبب 1.
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):
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
>>>
'b'\x04\x00
'b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00
'b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00
>>> x = 1000
'b'\xe8\x03
يتم رفع إذا كان صحيحا ليس للتمثيل مع عدد معين من وحدات OverflowError يتم تمثيل العدد الصحيح باستخدام طول بايت .و
.البايت
والبت األكثر أهمية هو في بداية "big"،هو byteorder حجة يحدد ترتيب البايت تستخدم لتمثيل العدد الصحيح .إذا byteorder و
والبت األكثر أهمية هو في نهاية صفيف بايت .لطلب ترتيب البايت األصلي للنظام "little"،هو byteorder صفيف بايت .إذا
.كقيمة ترتيب البايت sys.byteorderالمضيف ،استخدم
Pg. 176
ويعطى عدد صحيح سلبية False ،و قعت Lتحدد حجة ما إذا كان استخدام متمم ثنائي لتمثيل صحيح .إذا وقعت و
False.يظهر .القيمة االفتراضية للموقع هي OverflowErrorوهو
>>>
16
4096
-1024
64512
16711680
والبت األكثر أهمية هو في بداية "big"،هو byteorder حجة يحدد ترتيب البايت تستخدم لتمثيل العدد الصحيح .إذا byteorder و
والبت األكثر أهمية هو في نهاية صفيف بايت .لطلب ترتيب البايت األصلي للنظام "little"،هو byteorder صفيف بايت .إذا
.كقيمة ترتيب البايت sys.byteorderالمضيف ،استخدم
)(int.as_integer_ratio
قم بإرجاع زوج من األعداد الصحيحة التي تكون نسبتها مساوية تمامًا للعدد الصحيح األصلي وبها مقام موجب .النسبة الصحيحة
.لألعداد الصحيحة (األعداد الصحيحة) هي دائمًا العدد الصحيح كبسط1 ومقام
.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بادئة وتتبع
.على مسافة بيضاء في المقدمة والخلفية s أسلوب فئة إلعادة تعويم يمثله عشري سلسلة الصورة . قد تحتوي السلسلة
الحظ أن األس مكتوب بالنظام العشري بدالً من النظام السداسي عشري ،وأنه يعطي قوة 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 / 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،منطقي
"""
P = sys.hash_info.modulus
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:
if m < 0:
hash_value = -hash_value
if hash_value == -1:
hash_value = -2
return hash_value
def hash_float(x):
if math.isnan(x):
return object.__hash__(x)
elif math.isinf(x):
else:
return hash_fraction(*x.as_integer_ratio())
def hash_complex(z):
M = 2**(sys.hash_info.width - 1)
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بعد تنفيذها لبروتوكول المكرر
أنواع المولدات
تم تنفيذ طريقة كائن الحاوية كمولد ،فسوف يقوم تلقائيًا)(__ __iterطريقة مالئمة لتنفيذ بروتوكول المكرر .إذا Python يوفر مولد
يمكن العثور على مزيد من المعلومات حول __next__(). و)(__ __iterبإرجاع كائن مكرر (تقنيًا ،كائن منشئ) لتزويد الطرق
.المولدات في وثائق تعبير العائد
- list، tuple، rangeأنواع التسلسل
هناك ثالثة أنواع أساسية من التسلسالت :القوائم ،والمجموعات ،وكائنات النطاق .أنواع تسلسل إضافية مصممة Lخصيصا لمعالجة
.من البيانات الثنائية و سالسل نصية تم وصفها في أقسام مخصصة
متواليات من نفس t و ، s يسرد هذا الجدول عمليات التسلسل مرتبة حسب األولوية التصاعدية .في الجدول
s .كائن عشوائي يفي بأي نوع وقيود تفرضها x أعداد صحيحة و k و j و i و ، n النوع
و عمليات تكون له نفس األولويات عمليات المقارنة .العمليات( التسلسل) و( التكرار) لها نفس أولوية العمليات الرقمية inو
*not in+المقابلة3 .
Pg. 181
ملحوظ
عملية نتيجة
ات
ط البند الرابع
]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من
إجمالي عدد
)s.count(x
sفي x تكرارات
تدعم التسلسالت من نفس النوع أيضً ا المقارنات .على وجه الخصوص ،تتم مقارنة المجموعات والقوائم بشكل معجمي من خالل
مقارنة العناصر المقابلة .هذا يعني أنه للمقارنة بالتساوي ،يجب أن يقارن كل عنصر بالتساوي ويجب أن يكون التسلسالن من نفس
النوع وأن يكون لهما نفس الطول( .للحصول على التفاصيل الكاملة ،راجع المقارنات في مرجع اللغة).
:ملحوظات
Pg. 182
فقط الختبار االحتواء البسيط في الحالة العامة ، Lفإن بعض التسلسالت المتخصصة inand بينماُ تستخدم العمليات 1.
ضا لالختبار الالحق (:not instrbytesbytearrayمثل ، و ) تستخدم أي ً
>>>
True
الحظ أن العناصر الموجودة في s ). والتي ينتج عنها تسلسل فارغ من نفس النوع مثل( أقل من n يتم التعامل مع قيم 2.
تسلسل الصورة ال يتم نسخ .تمت اإلشارة إليهم عدة مرات .هذا غالبًا ما يطارد مبرمجي بايثون الجدد ؛ انصح00:
>>>
>>> lists
)>>> lists[0].append(3
>>> lists
ما حدث هو أن]][[ هذه قائمة مكونة من عنصر واحد تحتوي على قائمة فارغة ،لذا فإن العناصر الثالثة جميعها إشارات إلى هذه
القائمة الفارغة المفردة .تعديل أي من عناصر تعديل هذه القائمة المنفردة .يمكنك إنشاء قائمة بقوائم مختلفة بهذه الطريقة:
3 * ]][[lists
>>>
)>>> lists[0].append(3
)>>> lists[1].append(5
)>>> lists[2].append(7
>>> lists
.يتوفر المزيد من الشرح في إدخال األسئلة الشائعة .كيف أقوم بإنشاء قائمة متعددة األبعاد؟
أو يتم تعويضه .لكن الحظ أن هذا ال 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 إلى
تسمح هذه j . و i ال تدعم جميع التطبيقات تمرير الحجج اإلضافية s . في x عندما ال توجد ValueErrorيزيد8. index
الحجج بالبحث الفعال عن األقسام الفرعية للتسلسل .يعد تمرير الوسائط اإلضافية مكاف ًئا تقريبًا
فقط بدون نسخ أي بيانات ويكون الفهرس الذي يتم إرجاعه متعل ًقا ببداية التسلسل بدالً من s[i:j].index(x)،لالستخدام
.بداية الشريحة
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
من القائمة
تمتد الصورة مع
محتويات ر( بالنسبة
(s.extend
للجزء األكبر
s += tأوt)
s[len(s):len(s)] نفس)
= t
في s في x يُدرج
s.insert(i, الفهرس المعطى
)x )s[i:i] = مثل( i بواسطة
][x
:ملحوظات
.وسيطة اختيارية ط االفتراضي ،1- بحيث افتراضيا يتم إزالة العنصر األخير وعاد 2.
Pg. 185
s .في x عندما ال توجد ValueErrorيزيد)(3. remove
الطريقة بتعديل التسلسل المطبق لتوفير المساحة عند عكس تسلسل كبير .لتذكير المستخدمين بأنه يعمل )( reverseتقوم 4.
.من خالل التأثير الجانبي ،فإنه ال يقوم بإرجاع التسلسل المعكوس
dictمثل( ترد على االتساق مع واجهات حاويات قابلة للتغيير التي ال تدعم عمليات التقطيع)( copyو)(5. clear
ولكن معظم فئات التسلسل المتغير collections.abc.MutableSequenceABC ،ليس جزءًا من)( set). copyو
.الملموس توفره
التسلسل .ال يتم نسخ n تمسح القيم الصفرية والسالبة لـ __index__(). هي عدد صحيح ،أو كائن مطبق n القيمة 6.
.s * nالعناصر الموجودة في التسلسل ؛ يتم الرجوع إليها عدة مرات ،كما هو موضح في إطار عمليات تسلسل المشتركة
Lists
القوائم عبارة عن تسلسالت قابلة للتغيير ُ ،تستخدم عاد ًة لتخزين مجموعات من العناصر المتجانسة (حيث تختلف درجة التشابه
.الدقيقة حسب Lالتطبيق)
] ) متكرر list( [ فئة
قد يكون إما التسلسل ،حاوية التي تدعم . iterable يُنشئ المُنشئ قائمة عناصرها هي نفسها وبنفس ترتيب العناصر القابلة للتكرار
على سبيل iterable[:]. التكرار ،أو كائن مكرر .إذا كان التكرار عبارة عن قائمة بالفعل ،فسيتم عمل نسخة وإعادتها ،على غرار
، .العائدات و العائدات . إذا لم يتم تقديم أي وسيطة ،يقوم المنشئ بإنشاء قائمة فارغة جديدة)'، list('abcالمثال
][]['a', 'b', 'c']list( (1, 2, 3) )[1, 2, 3
تقوم هذه الطريقة بفرز القائمة في مكانها ،باستخدام< المقارنات بين العناصر فقط . ال يتم منع االستثناءات -في حالة فشل أي
.عمليات مقارنة ،ستفشل عملية الفرز بالكامل (ومن المحتمل أن ُتترك القائمة في حالة معدلة جزئيًا)
:يقبل وسيطتين ال يمكن تمريرهما إال من خالل الكلمات Lالرئيسية ( وسيطات الكلمات الرئيسية فقطsort())
على سبيل ( يحدد المفتاح دالة من وسيطة واحدة ُتستخدم الستخراج مفتاح مقارنة من كل عنصر قائمةL
يتم حساب المفتاح المقابل لكل عنصر في القائمة مرة واحدة ثم يتم استخدامه لعملية الفرز ، key=str.lower). المثال
.تعني القيمة االفتراضية لـ أنه يتم فرز عناصر القائمة مباشر ًة دون حساب قيمة مفتاح منفصلة. None بأكملها
.فسيتم فرز عناصر القائمة كما لو تم عكس كل مقارنة True،العكس هو قيمة منطقية .إذا تم التعيين على
تقوم هذه الطريقة بتعديل التسلسل في المكان لتوفير المساحة عند فرز تسلسل كبير .لتذكير المستخدمين بأنه يعمل من خالل التأثير
).لطلب نسخة قائمة تم فرزها بشكل صريح)( sortedاستخدمه( الجانبي ،فإنه ال يقوم بإرجاع التسلسل الذي تم فرزه
Pg. 186
مكفول طريقة لتكون مستقرة .يكون الفرز مستقرً ا إذا كان يضمن عدم تغيير الترتيب النسبي للعناصر التي تقارن متساوية sort()-و
.وهذا مفيد للفرز في عدة ممرات (على سبيل المثال ،الفرز حسب القسم ،ثم حسب درجة الراتب)
.للحصول على أمثلة حول الفرز ودورة تعليمية موجزة عن الفرز ،راجع فرز كيفية
أثناء فرز القائمة ،يكون تأثير محاولة تغيير القائمة ،أو حتى فحصها ،غير محدد .يؤدي تطبيق لغة CPython: تفاصيل تنفيذ
ما إذا كان بإمكانه اكتشاف أن القائمة قد تم ValueErrorالبرمجة بلغة لغة البايثون إلى ظهور القائمة فارغة طوال المدة ،ويزيد
.تغييرها أثناء عملية الفرز
Tuples
التي -tuplesمثل (2عبارة عن تسلسالت غير قابلة للتغيير ُ ،تستخدم عاد ًة لتخزين مجموعات من البيانات غير المتجانسة Tuples
ضا في الحاالت التي تتطلب تسلساًل غير قابل للتغيير من البيانات المتجانسة ُ Tuplesتستخدم). المدمج في enumerate() ينتجها
أي ً
).مثيل dictأو setمثل السماح بالتخزين في مثيل(
] ) متكرر 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كوسيطة وحيدة
بالنسبة للمجموعات غير المتجانسة من البيانات حيث يكون الوصول باالسم أكثر وضوحً ا من الوصول عن طريق
.بسيط tupleفقد يكون اختيارً ا أكثر مالءمة من كائن)( ، collections.namedtupleالفهرس
Ranges
.الحلقات for يمثل نوع غير قابل للتغيير تسلسل األرقام ويستخدم عادة لحلقات عددا محددا من المرات في rangeو
) توقف range( فئة
إذا تم ). الطريقة الخاصة__ __indexأو أي كائن يقوم بتنفيذ intإما مضمنة( يجب أن تكون وسيطات مُنشئ النطاق أعدا ًدا صحيحة
حذف وسيطة الخطوة ،يتم تعيينها افتراضيًا على .1 إذا تم حذف وسيطة البداية ، فسيتم تعيينها افتراضيًا على .0 إذا
.يتم رفعها ، ValueErrorكانت الخطوة صفر
.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
][1, 2, 3, 4, 5, 6, 7, 8, 9, 10
][0, 3, 6, 9
][0, -1, -2, -3, -4, -5, -6, -7, -8, -9
))>>> list(range(0
][
][
تقوم النطاقات Lبتنفيذ جميع عمليات التسلسل الشائعة باستثناء التسلسل والتكرار (نظرً ا لحقيقة أن كائنات النطاق ال يمكنها إال تمثيل
نمطا صار ًما ،وعادة ما ينتهك التكرار والتسلسل هذا النمط).التسلسالت التي تتبع ً
start
stop
قيمة معلمة اإليقاف
step
الكائن سوف تتخذ دائما نفس المبلغ (صغير) من الذاكرة ،ال rangeهي أن tupleأو listنوع أكثر من العادية rangeاالستفادة من
).الفردية بحاجة subrangesالقيم ،وحساب العناصر و stepو start، stopكما أنه يخزن فقط( يهم حجم مجموعة أنها تمثل
وتوفر ميزات مثل اختبارات االحتواء ،والبحث عن فهرس العناصر collections.abc.SequenceABC ، ،تنفذ كائنات النطاق
:والتقطيع ،ودعم الفهارس السالبة (انظر أنواع التسلسل -القائمة ،والصف ،والنطاق)
>>>
Pg. 188
)>>> r = range(0, 20, 2
>>> r
>>> 11 in r
False
>>> 10 in r
True
)>>> r.index(10
5
]>>> r[5
10
]>>> r[:5
]>>> 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حدد '==' و '! =' لمقارنة كائنات النطاق بنا ًء على تسلسل القيم التي تحددها (بدالً من المقارنة بنا ًء
.على هوية الكائن)
أنظر أيضا
.يبين كيفية تنفيذ نسخة كسول من مجموعة مناسبة لتطبيقات النقاط العائمة linspace و صفة
تتم Unicode. كائنات أو سالسل . السالسل هي متواليات ثابتة لنقاط كود strباستخدام Pythonيتم التعامل مع البيانات النصية في
:كتابة السالسل الحرفية بعدة طرق
قد تمتد السالسل الثالثية بين عالمات االقتباس على عدة أسطر -سيتم تضمين جميع المسافات البيضاء المرتبطة في السلسلة
.الحرفية
Pg. 189
سيتم تحويل القيم الحرفية للسلسلة التي تعد جز ًء ا من تعبير واحد والتي تحتوي على مسافة بيضاء فقط ضم ًنا إلى سلسلة حرفية
هذا هو .واحدة .("spam " "eggs") == "spam eggs"
راجع String and Bytes literals بما في ذلك تسلسالت الهروب، لمزيد من المعلومات حول األشكال المختلفة للسلسلة الحرفية
المدعومة، r"( والبادئةraw") التي تعطل معظم معالجة تسلسل الهروب.
ً يمكن أي str الباني.
ضا إنشاء سالسل من كائنات أخرى باستخدام
أي للسلسلة غير.1 تؤدي فهرسة سلسلة نصية إلى إنتاج سالسل بطول، نظرً ا لعدم وجود نوع "حرف" منفصل
الفارغة s ، .s[0] == s[0:1]
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.
>>>
>>> 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".
str.center(width[, fillchar])
str.count(sub[, start[, end]])
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.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\t012\t0123\t01234'.expandtabs(4)
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:
>>>
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.
>>>
Pg. 192
See Format String Syntax for a description of the various formatting options that can be specified in
format strings.
Note
اإلعدادات المحلية مؤق ًتا LC_CTYPEبالنوع ،تقوم الوظيفة بتعيين nتم التغيير في اإلصدار :3.7عند تنسيق رقم
.المحلية في بعض الحاالت LC_NUMERICإلى اإلعدادات
هذا مفيد إذا dict. يتم استخدامه مباشرة وال يتم نسخه إلى ملف mappingباستثناء ما str.format(**mapping)،على غرار
:فئة فرعية ديكت mappingكانت على سبيل المثال
>>>
...
)(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.رمز في النطاق
)(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.
مثال:
>>>
True, False
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
False
) متكرر str.join(
إذا كان هناك أي قيم غير سلسلة في التكرار A ، سيتم رفع . TypeErrorإرجاع سلسلة عبارة عن سلسلة من السالسل في التكرار
.الكائنات .الفاصل بين العناصر هو السلسلة التي توفر هذه الطريقة bytesبما في ذلك
االفتراضي هو مسافة( أعد السلسلة إلى اليسار مضبوطة في سلسلة طولها عرض . يتم إجراء الحشو باستخدام حرف التعبئة المحدد
len(s).يتم إرجاع السلسلة األصلية إذا كان العرض أقل من أو يساويASCII).
)(str.lower
.قم بإعادة نسخة من السلسلة مع تحويل جميع األحرف المغطاة 4 إلى أحرف صغيرة
Unicode.تم وصف خوارزمية الغالف السفلي المستخدمة Lفي القسم 3.13من معيار
] ) حرف str.lstrip( [
إعادة نسخة من السلسلة مع إزالة األحرف البادئة .و حرف الحجة هي سلسلة تحديد مجموعة من األحرف المراد إزالتها .إذا تم حذف
بشكل افتراضي على إزالة المسافة البيضاء .و حرف الحجة ليست بادئة .بدالً من ذلك ،يتم charsيتم تعيين وسيطة None،أو
:تجريد جميع مجموعات قيمها
>>>
' 'spacious
)'>>> 'www.example.com'.lstrip('cmowz.
Pg. 195
'example.com'
ابحث str.removeprefix()على سبيل المثال .عن طريقة تزيل سلسلة بادئة واحدة بدالً من كل مجموعة من األحرف:
>>>
'ee!'
'three!'
تقوم هذه الطريقة الثابتة بإرجاع جدول ترجمة يمكن استخدامه من أجله 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'
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'
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]])
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'
>>> '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'
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(',')
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:
>>>
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
For example:
>>>
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()
[]
Pg. 199
['One line']
For comparison, split('\n') gives:
>>>
>>> ''.split('\n')
['']
str.startswith(prefix[, start[, end]])
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'
>>> '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:
>>>
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'
>>>
>>>
>>> import re
... s)
...
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.
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'
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.
A conversion specifier contains two or more characters and has the following components, which
must occur in this order:
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.
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:
>>>
In this case no * specifiers may occur in a format (since they require a sequential parameter list).
ً
معدّل الطول ( قد يكون h، lأو L) على سبيل المثال- ولكن يتم تجاهله ألنه ليس ضروريًا لبايثون، موجودا ، %ldمطابق لـ %d.
Pg. 203
Pg. 204
:ملحوظات
.قبل الرقم األول )' ( '0oيتسبب النموذج البديل في إدخال محدد ثماني بادئ 1.
قبل الرقم )الشكل المستخدم' 'Xأو' 'xاعتما ًدا على ما إذا كان التنسيق('Xأوx'0' يؤدي النموذج البديل إلى إدخال بادئة2. 0'
.األول
.يتسبب النموذج البديل في احتواء النتيجة دائمًا على فاصلة عشرية ،حتى لو لم تتبعها أرقام 3.
.تحدد الدقة عدد األرقام بعد الفاصلة العشرية واالفتراضية إلى 6
.يتسبب النموذج البديل في احتواء النتيجة دائ ًم ا على فاصلة عشرية ،وال تتم إزالة األصفار الالحقة كما لو كانت 4.
.تحدد الدقة عدد األرقام المعنوية قبل وبعد الفاصلة العشرية واالفتراضية إلى 6
.ارى6. 237
.التحويالت ال تفترض أن هذه'0\' هي نهاية السلسلة %sلها طول واضح ،فإن Pythonنظرً ا ألن سالسل
.بالتحويالت %gلم تعد ُتستبدل e50تحويالت األرقام التي تزيد قيمتها المطلقة عن :%f 1تم التغيير في اإلصدار 3.1
Pg. 205
استخدام بروتوك memoryviewيتم دعمها من خالل bytearray. و bytesاألنواع األساسية المضمنة لمعالجة البيانات الثنائية هي
.ول المخزن المؤقت للوصول إلى ذاكرة الكائنات الثنائية األخرى دون الحاجة إلى عمل نسخة
القيم العائمة الدقة IEEE754تدعم وحدة التخزين الفعال من أنواع البيانات األساسية مثل األعداد الصحيحة 32بت و arrayو
.المزدوجة
كائنات بايت
ASCIIكائنات البايت هي تسلسالت ثابتة من بايت واحد .نظرً ا ألن العديد من البروتوكوالت الثنائية الرئيسية تعتمد على ترميز نص
ً
ارتباطا وثي ًقا بكائنات السلسلة ASCIIفإن كائنات البايت تقدم عدة طرق صالحة فقط عند العمل مع البيانات المتوافقة مع ، وترتبط
.بعدة طرق أخرى
:البادئة bأوالً ،تكون صيغة البايتات الحرفية هي نفسها إلى حد كبير تلك المستخدمة في السالسل الحرفية ،باستثناء إضافة
بالبايت الحرفية (بغض النظر عن ترميز كود المصدر المعلن) .يجب إدخال أي قيم ثنائية تزيد عن ASCII 127يُسمح فقط بأحرف
.في وحدات بايت حرفية باستخدام تسلسل اإلفالت المناسبL
String andبادئة لتعطيل معالجة تسلسالت الهروب .راجع rكما هو الحال مع السالسل الحرفية ،قد تستخدم البايتات الحرفية أيضًا
.لمزيد من المعلومات حول األشكال المختلفة للبايتات الحرفية ،بما في ذلك تسلسالت الهروب المدعومةBytes literals
فإن كائنات البايت تتصرف في الواقع مثل التسلسالت الثابتة لألعداد ASCII ،بينما تستند وحدات البايت الحرفية والتمثيالت إلى نص
الصحيحة ،مع تقييد كل قيمة في التسلسل بحيث( محاوالت انتهاك هذا التقييد ستطلق .) يتم إجراء ذلك بشكل متعمد للتأكيد على أنه
ويمكن معالجتها Lبشكل مفيد باستخدام بعض الخوارزميات ASCIIبينما تتضمن العديد من التنسيقات الثنائية عناصر قائمة على
تطبيق خوارزميات معالجة Lالنص بشكل أعمى على ( الموجهة للنص ،فإن هذا ليس هو الحال عمومًا للبيانات الثنائية التعسفية
).0 <= x < 256ValueErrorإلى تلف البيانات ASCIIتنسيقات البيانات الثنائية غير عاد ًة ما يؤدي التوافق مع
:باإلضافة إلى األشكال الحرفية ،يمكن إنشاء كائنات البايت بعدة طرق أخرى
.انظر أي ً
ضا إلى وحدات البايت المضمنة
نظرً ا ألن رقمين سداسي عشريين يتوافقان بدقة مع بايت واحد ،فإن األرقام السداسية العشرية هي تنسيق شائع االستخدام لوصف
:البيانات الثنائية .وف ًق ا لذلك ،يحتوي نوع البايت على طريقة تصنيف إضافية لقراءة البيانات بهذا التنسيق
طريقة الفئة هذه بإرجاع كائن بايت ،وفك تشفير كائن السلسلة المحدد .يجب أن تحتوي السلسلة على رقمين سداسي bytesتقوم
ASCII.عشريين لكل بايت ،مع تجاهل المسافات البيضاء
>>>
'b'.\xf0\xf1\xf2
Pg. 206
.البيضاء في السلسلة ،وليس المسافات Lفقط ASCIIيتخطى اآلن كل مسافات:bytes.fromhex() تم التغيير في اإلصدار 3.7
.توجد وظيفة تحويل عكسي لتحويل كائن بايت إلى تمثيل سداسي عشري
.قم بإرجاع كائن سلسلة يحتوي على رقمين سداسي عشري لكل بايت في المثيل
>>>
)(>>> b'\xf0\xf1\xf2'.hex
''f0f1f2
فاصل حرف واحد لتضمينها في sep إذا كنت ترغب في تسهيل قراءة السلسلة السداسية العشرية ،يمكنك تحديد معلمة
اختيارية ثانية في التباعد .القيم الموجبة تحسب موضع الفاصل من bytes_per_sep اإلخراج .افتراضيا بين كل بايت .تتحكم معلمة
.اليمين ،والقيم السالبة من اليسار
>>>
)'>>> value.hex('-
''f0-f1-f2
''f0_f1f2
سوف يكون صحيحا ، 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 كائنات
Pg. 207
] ) المصدر ، [ ترميز ، [ أخطاء bytearray( [ ] ] فئة
:وبدالً من ذلك يتم إنشاؤها دائمًا عن طريق استدعاء المُنشئ bytearray ،ال يوجد بناء جملة حرفي مخصص لكائنات
قابلة للتغيير ،فهي تدعم عمليات التسلسل القابل للتغيير باإلضافة إلى عمليات البايت الشائعة وعمليات bytearrayنظرً ا ألن كائنات
Bytearray .و Bytesالسطر البايت الموصوفة في عمليات
نظرً ا ألن رقمين سداسي عشريين يتوافقان بدقة مع بايت واحد ،فإن األرقام السداسية العشرية هي تنسيق شائع االستخدام لوصف
:على طريقة فئة إضافية لقراءة البيانات بهذا التنسيق bytearrayالبيانات الثنائية .وف ًقا لذلك ،يحتوي نوع
وفك تشفير كائن السلسلة المحدد .يجب أن تحتوي السلسلة على رقمين bytearray ،طريقة الفئة هذه بإرجاع كائن bytearrayتقوم
ASCII.سداسي عشريين لكل بايت ،مع تجاهل المسافات البيضاء
>>>
)'bytearray(b'.\xf0\xf1\xf2
.البيضاء في السلسلة ،وليس المسافات Lفقط ASCIIيتخطى اآلن كل مسافات:bytearray.fromhex() تم التغيير في اإلصدار 3.7
.إلى تمثيل سداسي عشري bytearrayتوجد وظيفة تحويل عكسي لتحويل كائن
.قم بإرجاع كائن سلسلة يحتوي على رقمين سداسي عشري لكل بايت في المثيل
>>>
)(>>> bytearray(b'\xf0\xf1\xf2').hex
''f0f1f2
سوف يكون ] ، 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
:و
"a = b"abc
وبالتالي يجب تجنبها عند العمل مع ASCII ،تفترض بعض عمليات البايت وسجالت البايت استخدام تنسيقات ثنائية متوافقة مع
.بيانات ثنائية عشوائية .يتم تغطية هذه القيود أدناه
ملحوظة
إلى تلف ASCIIلمعالجة البيانات الثنائية التي لم يتم تخزينها بتنسيق يستند إلى ASCIIقد يؤدي استخدام هذه العمليات المستندة إلى
.البيانات
.مع بيانات ثنائية عشوائية bytearrayيمكن استخدام الطرق التالية على كائنات بايت و
قم بإرجاع عدد التكرارات غير المتداخلة للفرع الفرعي التالي في النطاق [ البداية ، النهاية .] يتم تفسير الوسيطات
.كما في تدوين الشرائح start and end االختيارية
.قد تكون الالحقة التي يجب البحث عنها أي كائن يشبه البايت أو عد ًدا صحيحً ا في النطاق من 0إلى 255
.تم التغيير في اإلصدار :3.3قبول أيضً ا عد ًدا صحيحً ا في النطاق من 0إلى 255باعتباره التالي
:خالف ذلك ،قم بإرجاع نسخة من البيانات الثنائية األصلية bytes[len(prefix):]. إذا بدأت البيانات الثنائية بسلسلة البادئة ، فارجع
>>>
)'>>> b'TestHook'.removeprefix(b'Test
'b'Hook
)'>>> b'BaseTestCase'.removeprefix(b'Test
'b'BaseTestCase
Pg. 209
.و بادئة قد يكون أي بايت مثل الكائن
ملحوظة
.هذه الطريقة ال تعمل في مكان -أنها تنتج دائما كائن جديد ،حتى لو لم يتم إجراء أية تغييرات bytearrayال النسخة
خالف ذلك ،قم بإرجاع نسخة bytes[:-len(suffix)]. إذا نهايات البيانات الثنائية مع الحقة سلسلة وأن احقة ليست فارغة ،وعودة
:من البيانات الثنائية األصلية
>>>
)'>>> b'MiscTests'.removesuffix(b'Tests
'b'Misc
)'>>> b'TmpDirMixin'.removesuffix(b'Tests
'b'TmpDirMixin
ملحوظة
.هذه الطريقة ال تعمل في مكان -أنها تنتج دائما كائن جديد ،حتى لو لم يتم إجراء أية تغييرات bytearrayال النسخة
يمكن إعطاء أخطاء لتعيين نظام معالجة أخطاء 'utf-8'. إرجاع سلسلة تم فك تشفيرها من البايتات المحددة .الترميز االفتراضي هو
القيم األخرى UnicodeError. مما يعني أن أخطاء الترميز ترفع ملف 'strict'،مختلف .اإلعداد االفتراضي لألخطاء هو
انظر القسم معالجات خطأ . للحصول على codecs.register_error()،وبأي اسم آخر مسجل عبر' 'ignore'، 'replaceالممكنة
.قائمة الترميزات المحتملة ،راجع قسم الترميزات القياسية
بشكل افتراضي ،ال يتم التحقق من وسيطة األخطاء للحصول على أفضل أداء ،ولكن يتم استخدامها فقط عند أول خطأ في فك
.أو استخدم بنية تصحيح األخطاء للتحقق من األخطاء Python ،التشفير .قم بتمكين وضع تطوير
ملحوظة
bytearray.يسمح فك أي بايت مثل الكائن مباشرة ،دون الحاجة إلى جعل بايت مؤقتة أو كائن strتمرير ترميز حجة ل
Pg. 210
) الحقة ، [ بداية ، [ نهايةbytearray.endswith( ] ]
يمكن أن تكون الالحقة أيضً ا مجموعة من False. إذا كانت البيانات الثنائية تنتهي بالالحقة المحددة ، وإال يتم إرجاعها Trueالعودة
.اللواحق للبحث عنها .مع بدء اختياري ، ابدأ االختبار في هذا الموضع .مع نهاية اختيارية ، توقف عن المقارنة في هذا الموضع
.قد تكون الالحقة (اللواحق) التي سيتم البحث عنها عبارة عن أي كائن يشبه البايت
قم بإرجاع أدنى فهرس في البيانات حيث تم العثور على الفرع الفرعي التالي ، بحيث يكون هذا الجزء الفرعي موجو ًدا في
كما في تدوين الشرائح .العودة1- إذا لم يتم العثور start and end يتم تفسير الوسيطات االختيارية s[start:end]. الشريحة
.على الفرعية
.قد تكون الالحقة التي يجب البحث عنها أي كائن يشبه البايت أو عد ًدا صحيحً ا في النطاق من 0إلى 255
ملحوظة
ينبغي أن تستخدم الطريقة فقط إذا كنت بحاجة إلى معرفة موقف الفرعية . للتحقق مما إذا كانت السلسلة الفرعية عبارة عن )( findو
:عامل التشغيل inسلسلة فرعية أم ال ،استخدم
>>>
True
.تم التغيير في اإلصدار :3.3قبول أيضً ا عد ًدا صحيحً ا في النطاق من 0إلى 255باعتباره التالي
.قد تكون الالحقة التي يجب البحث عنها أي كائن يشبه البايت أو عد ًدا صحيحً ا في النطاق من 0إلى 255
.تم التغيير في اإلصدار :3.3قبول أيضً ا عد ًدا صحيحً ا في النطاق من 0إلى 255باعتباره التالي
) متكرر bytes.join(
) متكرر bytearray.join(
إذا A سيتم رفع . TypeErrorقم بإرجاع كائن بايت أو بايت ،وهو عبارة عن سلسلة من تسلسالت البيانات الثنائية في قابلة للتكرار
الكائنات .الفاصل بين العناصر هو محتويات بايت أو كائن strكان هناك أي قيم في التكرار ليست كائنات تشبه البايت ، بما في ذلك
.مخطط بايت يوفر هذه الطريقة
) من ، إلى bytes.maketrans( ثابت
) من ، إلى bytearray.maketrans( ثابت
تعيين كل حرف من الحرف في نفس )( bytes.translateتقوم هذه الطريقة الثابتة بإرجاع جدول ترجمة يمكن استخدامه من أجل
.كائنات تشبه البايت ولها نفس الطول from and to الموضع إلى ؛ يجب أن يكون كل من
)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.
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]])
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.
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.
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.
>>>
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 '
>>> 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'ee!'
b'three!'
Note
ال النسخةbytearray حتى لو لم يتم إجراء أية تغييرات، أنها تنتج دائما كائن جديد- تعمل في مكان ال هذه الطريقة.
المحدد بايت التعبئة يتم إجراء الحشو باستخدام . الطول عرض قم بإرجاع نسخة من الكائن إلى اليمين مبررة في تسلسل (االفتراضي
L هو مسافةASCII). بالنسبة bytesأقل من أو يساوي العرض يتم إرجاع التسلسل األصلي إذا كان، للكائنات len(s).
ملحوظة
ال النسخةbytearray حتى لو لم يتم إجراء أية تغييرات، أنها تنتج دائما كائن جديد- تعمل في مكان ال هذه الطريقة.
Pg. 214
تعطى ،في maxsplit تقسيم تسلسل ثنائي في المتتالية من نفس النوع ،وذلك باستخدام سبتمبر كسلسلة محدد .إذا
فإن أي تتابع الحق يتكون فقط من مسافة None، Lأو sep االنقسامات Lتتم ،و أقصى اليمين منها .إذا لم يتم تحديد maxsplit معظم
.ما هو موصوف بالتفصيل أدناه)( splitيتصرف مثل)( ، rsplitهو فاصل .باستثناء االنفصال عن اليمين ASCIIبيضاء
] ) حرف bytes.rstrip( [
] ) حرف bytearray.rstrip( [
إعادة نسخة من التسلسل مع إزالة بايتات الحقة محددة .و حرف الحجة هي سلسلة ثنائي تحديد مجموعة من القيم بايت المراد إزالتها
بشكل افتر charsيتم تعيين وسيطة None،إذا تم حذف أو - ASCII. اسم يشير إلى حقيقة وعادة ما يستخدم هذا األسلوب مع أحرف
:و حرف الحجة ليست الحقة .بدالً من ذلك ،يتم تجريد جميع مجموعات قيمها ASCII. Lاضي على إزالة المسافة البيضاء
>>>
'b' spacious
)'>>> b'mississippi'.rstrip(b'ipz
'b'mississ
عن طريقة تزيل سلسلة الحقة )( removesuffixقد يكون التسلسل الثنائي لقيم البايت المراد إزالتها أي كائن يشبه البايت . ابحث
:واحدة بدالً من كل مجموعة من األحرف .على سبيل المثال
>>>
'b'M
'b'Monty
ملحوظة
.هذه الطريقة ال تعمل في مكان -أنها تنتج دائما كائن جديد ،حتى لو لم يتم إجراء أية تغييرات bytearrayال النسخة
وكان غير 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', b'2,3
)'>>> b'1,2,,3,'.split(b',
كفاصل ASCIIتطبيق خوارزمية تقسيم مختلفة :يتم اعتبار عمليات تشغيل المسافة Lالبيضاء المتتالية Noneأو تم sep إذا لم يتم تحديد
واحد ،ولن تحتوي النتيجة على سالسل فارغة في البداية أو النهاية إذا كان التسلسل يحتوي على مسافة بيضاء بادئة أو
[].بدون فاصل محدد يعود ASCIIالحقة .وبالتالي ،فإن تقسيم تسلسل فارغ أو تسلسل يتكون فقط من مسافة Lبيضاء
>>>
] ) حرف bytes.strip( [
] ) حرف bytearray.strip( [
قم بإرجاع نسخة من التسلسل مع إزالة البايتات البادئة والزائدة المحددة .و حرف الحجة هي سلسلة ثنائي تحديد مجموعة من القيم
يتم None،إذا تم حذف أو ASCII. بايت المراد إزالتها -اسم يشير إلى حقيقة وعادة ما يستخدم هذا األسلوب مع أحرف
و حرف الحجة ليست بادئة أو الحقة .بدالً من ذلك ،يتم ASCII. بشكل افتراضي على إزالة المسافة البيضاء charsتعيين وسيطة
:تجريد جميع مجموعات قيمها
>>>
'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ال النسخة
ASCII ،بمسافة Lواحدة أو أكثر من مسافات ASCII Lقم بإرجاع نسخة من التسلسل حيث يتم استبدال جميع أحرف عالمة تبويب
اعتما ًدا على العمود الحالي وحجم عالمة التبويب المحدد .تظهر مواضع الجدولة في كل بايت من حجم الجدولة( االفتراضي هو ، 8
مع إعطاء مواضع جدولة في األعمدة 0و 8و 16وما إلى ذلك) .لتوسيع التسلسل ،يتم تعيين العمود الحالي على صفر ويتم فحص
فسيتم إدراج حرف مسافة واحد أو أكثر في النتيجة ASCII ( b'\t') ،التسلسل بايت بايت .إذا كان البايت عبارة عن حرف جدولة
حتى يصبح العمود الحالي مساويًا لموضع الجدولة التالي( .لم يتم نسخ حرف الجدولة نفسه ).إذا كان البايت الحالي عبارة عن سطر
يتم نسخه وإعادة تعيين العمود الحالي إلى الصفر .يتم نسخ أي قيمة بايت أخرى (b'\r') ،أو حرف إرجاع )' ASCII ( b'\nجديد
:بدون تغيير ويتم زيادة العمود الحالي بواحد بغض النظر عن كيفية تمثيل قيمة البايت عند الطباعة
>>>
)(>>> b'01\t012\t0123\t01234'.expandtabs
)>>> b'01\t012\t0123\t01234'.expandtabs(4
ملحوظة
.هذه الطريقة ال تعمل في مكان -أنها تنتج دائما كائن جديد ،حتى لو لم يتم إجراء أية تغييرات bytearrayال النسخة
)(bytes.isalnum
)(bytearray.isalnum
ولم يكن التسلسل ASCIIأبجدية أو أرقامًا عشرية ASCIIإذا كانت جميع وحدات البايت في التسلسل أحرف Trueقم باإلرجاع
ً
فارغا األبجدية هي قيم البايت الموجودة في ASCIIوإال .أحرف، False
هي قيم ASCIIاألرقام العشرية b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'. التسلسل
b'0123456789'.البايت في التسلسل
>>>
)(>>> b'ABCabc1'.isalnum
True
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
)(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
False
)(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قم
".التفاصيل حول تعريف "حالة العنوان
>>>
True
False
)(bytes.isupper
)(bytearray.isupper
، Falseصغيرة ASCIIأبجدي كبير واحد على األقل في التسلسل وليس هناك أحرف ASCIIإذا كان هناك حرف Trueقم باإلرجاع
.وإال
>>>
True
False
Pg. 219
)(bytes.lower
)(bytearray.lower
.الكبيرة إلى نظيرتها الصغيرة المقابلة ASCIIقم بإرجاع نسخة من التسلسل مع تحويل جميع أحرف
>>>
'b'hello world
ملحوظة
.هذه الطريقة ال تعمل في مكان -أنها تنتج دائما كائن جديد ،حتى لو لم يتم إجراء أية تغييرات bytearrayال النسخة
تستخدم هذه الطريقة نهج الخطوط الجديدة ASCII. قم بإرجاع قائمة باألسطر في التسلسل الثنائي ،مع كسر حدود أسطر
.العالمية لتقسيم الخطوط .ال يتم تضمين فواصل األسطر في القائمة الناتجة ما لم يتم توفير عمليات حفظ األسطر وصحيحة
>>>
فإن هذه الطريقة ُترجع قائمة فارغة للسلسلة الفارغة ،وال ينتج sep ،عندما يتم إعطاء سلسلة محددة)( splitعلى عكس ما يحدث
:عن فاصل السطر الطرفي سطرً ا إضافيًا
>>>
)(bytes.swapcase
)(bytearray.swapcase
.الصغيرة إلى نظيرتها ذات األحرف الكبيرة والعكس صحيح ASCIIقم بإرجاع نسخة من التسلسل مع تحويل جميع أحرف
Pg. 220
:على سبيل المثال
>>>
'b'hELLO wORLD
على ASCII ،دائمًا ما يكون هذا هو الحال بالنسبة لإلصدارات الثنائية .تحويالت الحالة متناظرة في str.swapcase()،على عكس
.bin.swapcase().swapcase() == binالعشوائية Unicodeالرغم من أن هذا ال ينطبق بشكل عام على نقاط رمز
ملحوظة
.هذه الطريقة ال تعمل في مكان -أنها تنتج دائما كائن جديد ،حتى لو لم يتم إجراء أية تغييرات bytearrayال النسخة
)(bytes.title
)(bytearray.title
كبير وتكون األحرف المتبقية صغيرة .يتم ترك قيم ASCIIقم بإرجاع نسخة عنوانها من التسلسل الثنائي حيث تبدأ الكلمات بحرف
.البايت غير المعدلة
>>>
'b'Hello World
>>>
>>>
... mo.group(0)[1:].lower(),
Pg. 221
... )s
...
ملحوظة
.هذه الطريقة ال تعمل في مكان -أنها تنتج دائما كائن جديد ،حتى لو لم يتم إجراء أية تغييرات bytearrayال النسخة
)(bytes.upper
)(bytearray.upper
.الصغيرة إلى نظيرتها ذات األحرف الكبيرة ASCIIقم بإرجاع نسخة من التسلسل مع تحويل جميع أحرف
>>>
'b'HELLO WORLD
ملحوظة
.هذه الطريقة ال تعمل في مكان -أنها تنتج دائما كائن جديد ،حتى لو لم يتم إجراء أية تغييرات 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ال النسخة
ملحوظة
تعرض عمليات التنسيق الموصوفة هنا مجموعة متنوعة من المراوغات التي تؤدي إلى عدد من األخطاء الشائعة (مثل الفشل في
.عرض المجموعات والقواميس بشكل صحيح) .إذا كانت القيمة التي يتم طباعتها عبارة عن مجموعة أو قاموس ،فلفها في مجموعة
يُعرف هذا أيضًا (modulo). لها عملية مدمجة Lفريدة واحدة% :عامل التشغيل ) ( bytes/ bytearrayكائنات البايت
باسم عامل تنسيق البايت أو عامل االستيفاء . نظرً ا( حيث يكون التنسيق عبارة عن كائن بايت) ،يتم استبدال مواصفات التحويل
)(.format % values%sprintfفي التنسيق بصفر أو أكثر من عناصر القيم . التأثير مشابه الستخدام لغة سي
إذا تطلب التنسيق وسيطة واحدة ،فقد تكون القيم كائ ًنا واح ًدا غير مجموعة 5 .وبخالف ذلك ،يجب أن تكون القيم عبارة عن
.مجموعة تحتوي بالضبط على عدد العناصر المحدد بواسطة كائن تنسيق البايت ،أو كائن تعيين واحد (على سبيل المثال ،قاموس)
:يحتوي محدد التحويل على حرفين أو أكثر ويحتوي على المكونات التالية ،والتي يجب أن تحدث بهذا الترتيب
، (somename)).على سبيل المثال( مفتاح التعيين (اختياري) ،يتكون من سلسلة من األحرف بين قوسين 2.
.أعالم التحويل (اختياري) ،والتي تؤثر على نتيجة بعض أنواع التحويل 3.
عرض الحقل األدنى (اختياري) .إذا تم تحديده على أنه('*' عالمة النجمة) ،فسيتم قراءة العرض الفعلي من العنصر التالي 4.
.في المجموعة في القيم ، ويأتي الكائن المراد تحويله بعد الحد األدنى لعرض الحقل والدقة االختيارية
5. الدقة (اختيارية) ُ ،تعطى على شكل('.' نقطة) متبوعة بالدقة .إذا تم تحديدها كـ('*' عالمة نجمية) ،تتم قراءة الدقة الفعلية
.من العنصر التالي في المجموعة في القيم ، وتأتي القيمة المراد تحويلها بعد الدقة
عندما الحجة الصحيحة هي القاموس (أو غيرها من نوع رسم الخرائط) ،ثم األشكال في كائن بايت يجب أن تتضمن مفتاح الخرائط
إلى أن القاموس تضاف مباشرة بعد'%' الحرف .يحدد مفتاح التعيين القيمة المراد تنسيقها من التعيين .على سبيل parenthesised
:المثال
>>>
.في هذه الحالة * ،قد ال تظهر محددات في تنسيق (ألنها تتطلب قائمة معلمات Lمتسلسلة)
Pg. 223
ً
موجودا ،ولكن يتم تجاهله ألنه ليس ضروريًا لبايثون -على سبيل المثال ) Lأو ( h، lقد يكون معدّل الطول %d.مطابق لـ، %ld
Pg. 224
:ملحوظات
.قبل الرقم األول )' ( '0oيتسبب النموذج البديل في إدخال محدد ثماني بادئ 1.
قبل الرقم )الشكل المستخدم' 'Xأو' 'xاعتما ًدا على ما إذا كان التنسيق('Xأوx'0' يؤدي النموذج البديل إلى إدخال بادئة2. 0'
.األول
.يتسبب النموذج البديل في احتواء النتيجة دائمًا على فاصلة عشرية ،حتى لو لم تتبعها أرقام 3.
.تحدد الدقة عدد األرقام بعد الفاصلة العشرية واالفتراضية إلى 6
.يتسبب النموذج البديل في احتواء النتيجة دائ ًم ا على فاصلة عشرية ،وال تتم إزالة األصفار الالحقة كما لو كانت 4.
.تحدد الدقة عدد األرقام المعنوية قبل وبعد الفاصلة العشرية واالفتراضية إلى 6
.x.تم إيقاف العمل به ،ولكن لن تتم إزالته أثناء السلسلة 6. b'%s' 3
.x.تم إيقاف العمل به ،ولكن لن تتم إزالته أثناء السلسلة 7. b'%r' 3
.ارى8. 237
ملحوظة
.هذه الطريقة ال تعمل في مكان -أنها تنتج دائما كائن جديد ،حتى لو لم يتم إجراء أية تغييرات bytearrayال النسخة
أنظر أيضا
مشاهدات الذاكرة
.بالوصول إلى البيانات الداخلية لكائن يدعم بروتوكول المخزن المؤقت دون نسخ Pythonتسمح الكائنات لكودmemoryview
) كائن memoryview( فئة
يشير إلى ذلك . يجب أن يدعم الكائن بروتوكول المخزن المؤقت .تتضمن الكائنات المضمنة التي memoryview قم بإنشاء كائن
.bytesbytearrayتدعم بروتوكول المخزن المؤقت و
على فكرة العنصر ، وهي وحدة الذاكرة الذرية التي يتعامل معها Lالكائن األصلي . بالنسبة للعديد من A يحتويmemoryview
قد array.arrayيكون العنصر عبارة عن بايت واحد ،لكن األنواع األخرى مثل bytearray،و bytesاألنواع البسيطة مثل
.تحتوي على عناصر أكبر
Pg. 225
إذا كان الطول .1إذا كان الطول يساوي عدد العناصر في العرض .بالنسبة لألبعاد األعلى ،يكون tolist. يساوي طول)len(view
الطول مساويًا لطول تمثيل القائمة المتداخلة لطريقة العرض .و سوف سمة تعطيك عدد البايتات في عنصر
.view.ndim = 0view.ndim = 1itemsizeواحد
>>>
)'>>> 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 صحيح واحد .يمكن فهرسة مشاهدات الذاكرة متعددة األبعاد مع مجموعات من األعداد الصحيحة
.عدد األبعاد .يمكن فهرسة مشاهدات الذاكرة صفرية األبعاد باستخدام المجموعة الفارغة
>>>
)>>> m = memoryview(a
]>>> m[0
-11111111
]>>> m[-1
44444444
)(>>> m[::2].tolist
][-11111111, -33333333
:إذا كان الكائن األساسي قابالً للكتابة ،فإن عرض الذاكرة يدعم تخصيص شريحة أحادية البعد .تغيير الحجم غير مسموح به
>>>
)>>> v = memoryview(data
Pg. 226
>>> v.readonly
False
>>> data
bytearray(b'zbcefg')
>>> data
bytearray(b'z123fg')
>>> data
bytearray(b'z1spam')
" عروض الذاكرة أحادية البعد لألنواع القابلة للقراءة (للقراءة فقط) ذات التنسيقاتB" " أوb" " أوc" يتم .هي أيضً ا قابلة للتجزئة
تعريف التجزئة على أنها :hash(m) == hash(m.tobytes())
>>>
>>> v = memoryview(b'abcefg')
True
True
True
عروض الذاكرة أحادية البعد ذات التنسيقات .يمكن اآلن تقطيع مشاهدات الذاكرة أحادية البعد :3.3 " تم التغيير في اإلصدارB" أو
"b" " أوc" قابلة للتجزئة اآلن.
يمكن اآلن فهرسة عروض الذاكرة بمجموعة من األعداد الصحيحة :3.5 تم التغيير في اإلصدار.
__eq__( مصدر )
Pg. 227
A Memoryview وa مصدر PEP 3118 يكون متساويًا إذا كانت أشكاله متساوية وإذا كانت جميع القيم المقابلة متساوية عند
تفسير رموز تنسيق المعامل باستخدامstructالصيغة.
>>>
>>> x = memoryview(a)
>>> y = memoryview(b)
>>> x == a == y == b
True
True
>>> z = y[::-2]
>>> z == c
True
True
إذا لم يتم دعم أي من سلسلة التنسيق بواسطة struct فستتم مقارنة الكائنات دائمًا على أنها غير متكافئة (حتى إذا، الوحدة النمطية
)كانت سالسل التنسيق ومحتويات المخزن المؤقت متطابقة:
>>>
...
>>> a = memoryview(point)
>>> b = memoryview(point)
>>> a == point
False
>>> a == b
Pg. 228
False
.تم التغيير في اإلصدار :3.3قارنت اإلصدارات السابقة الذاكرة األولية بغض النظر عن تنسيق العنصر وهيكل الصفيف المنطقي
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
.قم بإرجاع كائن سلسلة يحتوي على رقمين سداسي عشري لكل بايت في المخزن المؤقت
>>>
)">>> m = memoryview(b"abc
)(>>> m.hex
''616263
)(tolist
>>>
)(>>> memoryview(b'abc').tolist
Pg. 229
)>>> m = memoryview(a
)(>>> m.tolist
بناء جملة الوحدة structيدعم اآلن جميع التنسيقات األصلية ذات األحرف الفردية في:tolist() تم التغيير في اإلصدار 3.3
.باإلضافة إلى التمثيالت متعددة األبعاد
)(toreadonly
.كائن عرض الذاكرة األصلي لم يتغير memoryview. قم بإرجاع نسخة للقراءة فقط من كائن
>>>
))'>>> m = memoryview(bytearray(b'abc
)(>>> mm = m.toreadonly
)(>>> mm.tolist
)(>>> mm.tolist
تتخذ العديد من الكائنات إجراءات خاصة عندما يتم memoryview. حرر المخزن المؤقت األساسي المكشوف بواسطة كائن
؛ لذلك ،فإن استدعاء اإلصدار () سهل )مؤق ًتا تغيير الحجم a قد تمنع ، bytearrayعلى سبيل المثال( االحتفاظ بمشاهدة عليها
.إلزالة هذه القيود (وتحرير أي موارد متدلية) في أسرع وقت ممكن
نفسها والتي يمكن تسميتها عدة)( releaseباستثناء( ValueErrorبعد استدعاء هذه الطريقة ،فإن أي عملية أخرى في العرض ترفع
):مرات
>>>
)'>>> m = memoryview(b'abc
)(>>> m.release
]>>> m[0
Pg. 230
ValueError: operation forbidden on released memoryview object
>>>
... ]m[0
...
97
]>>> m[0
مما يعني أن عرض [byte_length//new_itemsize]،إرسال عرض الذاكرة إلى شكل أو شكل جديد .الشكل االفتراضي هو
النتيجة سيكون أحادي البعد .القيمة المعادة هي طريقة عرض ذاكرة جديدة ،ولكن ال يتم نسخ المخزن المؤقت نفسه .القوالب
C -> 1D.متجاورة ومتجاورةD -> C - المدعومة هي 1
أو " "bأو " ("Bبناء الجملة .يجب أن يكون أحد التنسيقات بتنسيق بايت structتنسيق الوجهة مقيد بتنسيق أصلي لعنصر واحد في
.يجب أن يكون طول البايت الناتج هو نفس الطول األصلي"c").
>>>
)>>> 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
>>>
>>> b = bytearray(b'zyz')
>>> x = memoryview(b)
>>> y = x.cast('c')
>>> b
bytearray(b'ayz')
>>>
>>> x = memoryview(buf)
>>> y.tolist()
>>> 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
>>>
>>> x = memoryview(buf)
>>> len(y)
>>> y.nbytes
48
>>> y.tolist()
لم يعد تنسيق المصدر مقي ًدا عند اإلرسال إلى عرض بايت :3.5 تم التغيير في اإلصدار.
obj
>>>
Pg. 233
>>> b = bytearray(b'xyz')
>>> m = memoryview(b)
>>> m.obj is b
True
nbytes
>>>
>>> m = memoryview(a)
>>> len(m)
>>> m.nbytes
20
>>> y = m[::2]
>>> len(y)
>>> y.nbytes
12
>>> len(y.tobytes())
12
Multi-dimensional arrays:
>>>
>>> x = memoryview(buf)
>>> 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
readonly
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
>>>
>>> m.itemsize
>>> m[0]
32000
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.
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
c_contiguous
f_contiguous
contiguous
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.
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.
Pg. 236
Use a set comprehension: {c for c in 'abracadabra' if c not in 'abc'}
len(s)
x in s
x not 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)
issuperset(other)
union(*others)
Return a new set with elements from the set and all others.
intersection(*others)
Return a new set with elements common to the set and all others.
difference(*others)
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()
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).
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.
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)
intersection_update(*others)
Update the set, keeping only elements found in it and all others.
difference_update(*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)
remove(elem)
discard(elem)
pop()
Remove and return an arbitrary element from the set. Raises KeyError if the set is empty.
clear()
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.
Pg. 239
Use a comma-separated list of key: value pairs within
braces: {'jack': 4098, 'sjoerd': 4127} or {4098: 'jack', 4127: 'sjoerd'}
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.
>>>
>>> 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)
len(d)
d[key]
Return the item of d with key key. Raises a KeyError if key is not in the map.
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:
>>>
... return 0
>>> c = Counter()
>>> c['red']
>>> c['red'] += 1
>>> c['red']
d[key] = value
Set d[key] to value.
del d[key]
key in d
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()
copy()
classmethod fromkeys(iterable[, 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()).
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
>>>
False
d | other
إنشاء قاموس جديد مع المفاتيح والقيم المدمجة من د و اآلخر ، الذي يجب أن يكون كل من القواميس .قيم أخرى ذات أولوية اتخاذها
.عند د و غيرها من مفاتيح األسهم
d |= other
أزواج مفتاح /قيمة .قيم أخرى ذات iterable تحديث القاموس د مع المفاتيح والقيم من اآلخر ، والذي قد يكون إما رسم الخرائط أو
.أولوية اتخاذها عند د و غيرها من مفاتيح األسهم
>' ('<'، '<='،تقارن القواميس بالتساوي إذا وفقط إذا كان لديهم نفس األزواج (بغض النظر عن الترتيب) .زيادة مقارنات الطلبات
='، '>') .(key, value)TypeError
.تحافظ القواميس على ترتيب اإلدراج .الحظ أن تحديث مفتاح ال يؤثر على األمر .يتم إدخال المفاتيح المضافة بعد الحذف في النهاية
>>>
>>> d
)>>> list(d
))(>>> list(d.values
][1, 2, 3, 4
>>> d
>>> d
من CPythonتم التغيير في اإلصدار :3.7ترتيب القاموس مضمون ليكون ترتيبًا لإلدراج .كان هذا السلوك أحد تفاصيل تطبيق
3.6.
Pg. 243
>>>
>>> d
))>>> list(reversed(d
)))(>>> list(reversed(d.values
][4, 3, 2, 1
)))(>>> list(reversed(d.items
أنظر أيضا
:يمكن تكرار طرق عرض القاموس لتقديم البيانات الخاصة بها ،ودعم اختبارات العضوية
)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قد يؤدي
.اإلدخاالت
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.
األزواج بحيث تكون، إذا كانت جميع القيم قابلة للتجزئة .يتم تعيين طرق عرض المفاتيح نظرً ا ألن إدخاالتها فريدة وقابلة للتجزئة
(ال يتم التعامل مع وجهات النظر القيم كمجموعة مثل منذ اإلدخاالت هي . فسيتم تعيين عرض العناصر أيضًا، فريدة وقابلة للتجزئة
متوفرة (على سبيل مجردةL وجميع العمليات المحددة للفئة األساسية،) لمجموعة مثل جهات النظر.عموما ليست فريدة من نوعها
) أو، ، ،المثال.(key, value)collections.abc.Set==<^
>>>
>>> # iteration
>>> n = 0
... n += val
>>> print(n)
504
>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
>>> list(values)
[2, 1, 1, 500]
>>> list(keys)
['bacon', 'spam']
Pg. 245
>>> # set operations
}'{'bacon
>>> values.mapping
]'>>> 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
ملحوظة
يعمل الكائن كبديل ل أنواع العامة ، وتنفيذ األدوية معلمات - Lعلى سبيل المثال تحديدا من عام والذي يوفر أنواع GenericAliasو
.لعناصر الحاوية
]T[X, Y, ...
ً
اعتمادا على Y و X يحتوي على عناصر من األنواع Tيمثل نوعًا GenericAliasيُنشئ نوعًا المستخدم .على سبيل المثال T،والمزيد
float:محتوية listدالة تتوقع وجود عناصر
وهو نوع عام يتوقع معلمتين من النوع يمثالن نوع المفتاح ونوع القيمة .في هذا المثال a dict،مثال آخر لتعيين الكائنات ،باستخدام
int:وقيم النوع strمفاتيح من النوع ، dictتتوقع الوظيفة وجود
...
>>>
Pg. 247
>File "<stdin>", line 1, in <module
كتابة التعليقات التوضيحية . يمتد هذا إلى األنواع العامة ومعلمات النوع الخاصة بها .عند إنشاء Python ال يفرض وقت تشغيل
ال يتم التحقق من عناصر الحاوية مقابل نوعها .على سبيل المثال ،ال يُنصح باستخدام الكود التالي a GenericAlias، ،كائن من
:ولكنه سيعمل بدون أخطاء
>>>
]>>> t = list[str
][1, 2, 3
:عالوة على ذلك ،تمسح األدوية ذات المعلمات معلمات النوع أثناء إنشاء الكائن
>>>
]>>> t = list[str
)>>> type(t
>'<class 'types.GenericAlias
)(>>> l = t
)>>> type(l
>'<class 'list
>>>
)]>>> repr(list[int
']'list[int
)]>>> str(list[int
']'list[int
>>>
]>>> dict[str][str
Pg. 248
يجب أن يحتوي الفهرس على العديد من العناصر حيث توجد . متغيرات النوع استخدام تكون هذه التعبيرات صالحة عند، ومع ذلك
عناصر متغيرة من النوع في GenericAliasالكائن __args__.
>>>
>>> Y = TypeVar('Y')
dict[str, int]
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__() الحاوية
األصلية العامة :
>>>
genericalias.__parameters__
هذه السمة عبارة عن مجموعة تم حسابها بشكل كسول (ربما فارغة) لمتغيرات النوع الفريدة الموجودة في __args__:
Pg. 250
>>>
)'>>> T = TypeVar('T
__>>> list[T].__parameters
)(~T,
ملحوظة
أنظر أيضا
X | Y | ...
وهو ما يعادل . على سبيل المثال ،تتوقع الدالة التالية وسيطة Y.أو Xوما إلى ذلك .يعني إما Y و X يحدد كائن توحيد يحمل األنواع
:X | Ytyping.Union[X, Y]intfloatمن النوع أو
union_object == other
Pg. 251
int | str == typing.Union[int, str]
isinstance(obj, union_object)
issubclass(obj, union_object)
>>>
True
>>>
يمكن الوصول إلى النوع الذي يتعرض له المستخدم لكائن االتحاد من types.UnionTypeواستخدامه في isinstance() عمليات
ال يمكن إنشاء مثيل لكائن من النوع .التحقق:
>>>
True
>>> types.UnionType()
ملحوظة
تمت إضافة __or__()إذا نفذت . طريقة كائنات الكتابة لدعم بناء الجملةmetaclass ، يجوز لالتحاد تجاوزها:X | Y__or__()
>>>
Pg. 252
... "return "Hello
...
... pass
...
>>> C | int
''Hello
int | __main__.C
أنظر أيضا
.يدعم المترجم عدة أنواع أخرى من الكائنات .معظم هؤالء يدعمون عملية واحدة أو عمليتين فقط
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تعيين سمة على طريقة ينتج عنها رفع .لتعيين سمة طريقة ،تحتاج إلى تعيينها
:األساسي
>>>
... pass
...
)(>>> c = C
>>> c.method.whoami
القابل للتنفيذ "شبه المترجمة" مثل جسم الوظيفة .وهي Pythonيتم استخدام كائنات التعليمات البرمجية بواسطة التنفيذ لتمثيل كود
تختلف عن كائنات الوظائف ألنها ال تحتوي على مرجع لبيئة التنفيذ العالمية الخاصة بها .يتم إرجاع كائنات التعليمات البرمجية
codeسماتها .انظر أيضا __code__ الوظيفة المضمنة ويمكن استخالصها من كائنات الوظيفة من خالل)( compileبواسطة
.الوحدة
الوظائف )( evalأو)( execيمكن تنفيذ كائن التعليمات البرمجية أو تقييمه عن طريق تمريره (بدالً من سلسلة المصدر) إلى الوظائف
.المضمنة
اكتب كائنات
Pg. 254
ال توجد عمليات خاصة type(). تمثل كائنات الكتابة أنواع الكائنات المختلفة .يتم الوصول إلى نوع الكائن بواسطة الوظيفة المضمنة
.تحدد الوحدة القياسية أسماء جميع األنواع المضمنة القياسية . typesعلى األنواع
الكائن
يتم إرجاع هذا الكائن بواسطة داالت ال ُترجع قيمة بشكل صريح .ال يدعم أي عمليات خاصة .يوجد كائن فارغ واحد
.تنتج نفس المفرد)()). type(Noneاسم مضمن None( يسمى
القيم المنطقية
يتم استخدامها لتمثيل قيم الحقيقة (على الرغم من أنه يمكن أيضً ا اعتبار القيم True. و Falseالقيم المنطقية هما العنصران الثابتان
األخرى خاطئة أو صحيحة) .في السياقات الرقمية (على سبيل المثال عند استخدامها كوسيطة لعامل حسابي) ،تتصرف مثل األعداد
يمكن استخدام الوظيفة المضمنة لتحويل أي قيمة إلى قيمة منطقية ،إذا كان من الممكن تفسير)(. boolالصحيحة 0و 1على التوالي
.القيمة على أنها قيمة حقيقية (انظر قسم اختبار قيمة الحقيقة أعاله)
كائنات داخلية
راجع التسلسل الهرمي للنوع القياسي للحصول على هذه المعلومات .يصف كائنات إطار المكدس ، Lوكائنات التتبع ،وكائنات
.الشرائح
السمات Lالخاصة
يضيف التنفيذ بعض السمات Lالخاصة للقراءة فقط إلى العديد من أنواع الكائنات ،حيث تكون ذات صلة .لم يتم اإلبالغ عن بعض هذه
.الوظيفة المضمنة)( dirبواسطة
__object.__dict
.قاموس أو كائن تخطيط آخر يستخدم لتخزين سمات Lكائن (قابلة للكتابة)
__instance.__class
__class.__bases
__definition.__name
Pg. 255
__definition.__qualname
__class.__mro
.هذه السمة هي مجموعة من الفئات التي يتم أخذها في االعتبار عند البحث عن الفئات األساسية أثناء تحليل الطريقة
)(class.mro
لتخصيص ترتيب دقة الطريقة لمثيالتها .يتم استدعاؤه في إنشاء مثيل للفئة ،ويتم metaclassيمكن تجاوز هذه الطريقة بواسطة فئة
__mro__.تخزين نتائجه في
)(__class.__subclasses
تحتفظ كل فئة بقائمة من المراجع الضعيفة لفئاتها الفرعية المباشرة .تقوم هذه الطريقة بإرجاع قائمة بجميع تلك المراجع التي ال تزال
:على قيد الحياة .القائمة في ترتيب التعريف .مثال
>>>
)(__>>> int.__subclasses
]>'[<class 'bool
الحواشي
1
.المرجعي ( التخصيص األساسي Python ) يمكن العثور على معلومات إضافية حول هذه األساليب الخاصة في دليل
2
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يمكن أن تستكمل مع سبب واضح باستخدام
__. __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استثناء
BufferErrorاستثناء
LookupErrorاستثناء
الفئة األساسية Lلالستثناءات التي تظهر عندما يكون المفتاح أو الفهرس المستخدم في التعيين أو التسلسل غير
codecs.lookup().يمكن رفع هذا مباشرة بواسطة: IndexError، KeyError. صالح
استثناءات ملموسة
AssertionErrorاستثناء
AttributeErrorاستثناء
عندما ال يدعم الكائن مراجع السمات Lأو تعيينات السمات على (. يُطلق عند فشل مرجع السمة (راجع مراجع السمات ) Lأو التعيين
).يتم رفعه ، TypeErrorاإلطالق
سمات يمكن تعيين باستخدام الحجج الكلمة الوحيدة لمنشئ .عند تعيينها ،فإنها تمثل اسم السمة التي تمت محاولة objو nameو
.الوصول إليها والكائن الذي تم الوصول إليه للسمة المذكورة ،على التوالي
EOFErrorاستثناء
مالحظةُ :تعيد التاب(. دون قراءة أي بيانات ) (EOFتصل الوظيفة إلى حالة نهاية الملف)( inputيُطلق عندما
) EOF.سلسلة نصية فارغة عندما تضغط على)( io.IOBase.read()and io.IOBase.readlineع
FloatingPointErrorاستثناء
GeneratorExitاستثناء
ImportErrorاستثناء
يواجه البيان مشاكل أثناء محاولة تحميل وحدة .يتم رفعه أيضً ا عندما يكون للحرف "من القائمة" اسم ال يمكن importيُطلق عندما
.from ... importالعثور عليه
Pg. 258
سمات Lيمكن تعيين باستخدام الحجج الكلمة الوحيدة لمنشئ .عند تعيينها ،فإنها تمثل اسم الوحدة النمطية التي تمت pathو nameو
.محاولة استيرادها والمسار إلى أي ملف أدى إلى حدوث االستثناء ،على التوالي
ModuleNotFoundErrorاستثناء
IndexErrorاستثناء
يتم اقتطاع مؤشرات الشرائح بصمت لتقع في النطاق المسموح به ؛ إذا لم يكن (. يُطلق عندما يكون التسلسل المنخفض خارج النطاق
).فيتم رفعه ، TypeErrorالفهرس عد ًدا صحيحً ا
KeyErrorاستثناء
.يُطلق عند عدم العثور على مفتاح تعيين (قاموس) في مجموعة المفاتيح الموجودة
KeyboardInterruptاستثناء
يُطلق عندما يضغط المستخدم على مفتاح المقاطعة (عاد ًة أو .) أثناء التنفيذ ،يتم إجراء فحص للمقاطعات بانتظام .يرث االستثناء
.Control-من ذلك حتى ال يتم اكتشافه عن طريق الخطأ بواسطة الكود الذي يمسك وبالتالي يمنع المترجم الفوري من الخروج
CDeleteBaseExceptionException
MemoryErrorاستثناء
يُطلق عند نفاد الذاكرة من إحدى العمليات ولكن قد يستمر إنقاذ الموقف (عن طريق حذف بعض الكائنات) .القيمة المرتبطة هي
قد ال C ) ،وظيفة)( ( mallocسلسلة تشير إلى نوع العملية (الداخلية) التي نفدت الذاكرة .الحظ أنه بسبب بنية إدارة الذاكرة األساسية
يتمكن المترجم الفوري دائمًا من التعافي تمامًا من هذا الموقف ؛ ومع ذلك ،فإنه يثير استثناء بحيث يمكن طباعة تتبع مكدس ،في
.حالة وجود برنامج تشغيل ً
بعيدا هو السبب
NameErrorاستثناء
يُطلق عندما ال يتم العثور على اسم محلي أو عالمي .هذا ينطبق فقط على األسماء Lغير المؤهلة .القيمة المرتبطة هي رسالة خطأ
.تتضمن االسم الذي تعذر العثور عليه
يمكن تعيين السمة باستخدام حجة الكلمة الوحيدة لمنشئ .عند تعيينه ،فإنه يمثل اسم المتغير الذي تمت محاولة الوصول nameو
.إليه
NotImplementedErrorاستثناء
في الفئات األساسية التي يحددها المستخدم ،يجب أن تثير الطرق المجردة هذا االستثناء RuntimeError. هذا االستثناء مشتق من
.عندما تتطلب فئات مشتقة لتجاوز الطريقة ،أو أثناء تطوير الفئة لإلشارة إلى أن التنفيذ الحقيقي ال يزال بحاجة إلى اإلضافة
ملحوظة
ال ينبغي استخدامها لإلشارة إلى أن عامل التشغيل أو الطريقة ال يُقصد منها دعمها على اإلطالق -في هذه الحالة إما ترك عامل
None.التشغيل /الطريقة غير محدد أو ،إذا كانت فئة فرعية ،فقم بتعيينها على
ملحوظة
Pg. 259
قابلة للتبديل ،على الرغم من أن لها أسماء Lوأغراض متشابهة NotImplemented .وغيرNotImplementedError
.للحصول على تفاصيل حول وقت استخدامها NotImplementedانظر
] ) حج OSError( [ استثناء
يظهر هذا االستثناء عندما تقوم إحدى وظائف النظام بإرجاع خطأ متعلق بالنظام ،بما في ذلك حاالت فشل اإلدخال /اإلخراج مثل
".لم يتم العثور على الملف" أو "القرص ممتلئ" (ليس ألنواع الوسائط غير القانونية أو األخطاء العرضية األخرى)
إذا لم يتم تحديدها .للتوافق مع اإلصدارات Noneيعيّن الشكل الثاني للمنشئ السمات المقابلة ،الموضحة أدناه .السمات Lاالفتراضية
.السمة تحتوي فقط على مجموعتين من وسيطتي المُنشئ األولين argsالسابقة ،إذا تم تمرير ثالث وسيطات ،فإن
كما هو موضح في استثناءات نظام التشغيل أدناه .تعتمد الفئة الفرعية المعينة OSError،غالبًا ما ُترجع المُنشئ فئة فرعية لـ
مباشرة أو عبر اسم مستعار ،وال يتم توريثه عند OSErrorالقيمة النهائية . يحدث هذا السلوك فقط عند اإلنشاء errnoعلى
.التصنيف الفرعي
errno
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مثل( بالنسبة للوظائف التي تتضمن مسارين لنظام الملفات
.تمريره إلى الوظيفة
السمة اآلن اسم الملف األصلي الذي تم تمريره إلى الوظيفة ،بدالً من االسم filenameتم التغيير في اإلصدار :3.4أصبحت
filename2 .المشفر إلى أو فك تشفير نظام الملفات ومعالج األخطاء . كما تمت إضافة سمة وسم وسيطة منشئ
OverflowErrorاستثناء
التي تفضل رفعها ( يُطلق عندما تكون نتيجة عملية حسابية أكبر من أن يتم تمثيلها .ال يمكن أن يحدث هذا لألعداد الصحيحة
لألعداد الصحيحة خارج النطاق OverflowErrorومع ذلك ،ألسباب تاريخية ،يتم أحيا ًنا رفع). االستسالم MemoryErrorعلى
.ال يتم فحص معظم عمليات الفاصلة العائمة C ،المطلوب .بسبب عدم وجود توحيد قياسي لمعالجة استثناء النقطة العائمة في
RecursionErrorاستثناء
Pg. 260
( يتم رفعه عندما يكتشف المترجم أن الحد األقصى لعمق التكرار RuntimeError. هذا االستثناء مشتق من
.قد تم تجاوزه ))( sys.getrecursionlimitانظر
ReferenceErrorاستثناء
الوظيفة ،للوصول إلى سمة )( weakref.proxyيظهر هذا االستثناء عندما يتم استخدام وكيل مرجعي ضعيف ،تم إنشاؤه بواسطة
.الوحدة weakrefالمرجع بعد أن يتم جمعها غير المرغوب فيه .لمزيد من المعلومات حول المراجع الضعيفة ،راجع
RuntimeErrorاستثناء
.يُطلق عند اكتشاف خطأ ال يقع في أي فئة من الفئات األخرى .القيمة المرتبطة هي سلسلة تشير إلى الخطأ الذي حدث بالضبط
StopIterationاستثناء
.طريقة إلشارة أنه ال توجد أصناف أخرى تنتجها مكرر)(__ __nextو مكرر الصورة)( nextالتي أثارها المدمج في وظيفة
None.والتي يتم تقديمها كوسيطة عند إنشاء االستثناء ،ويتم تعيينها افتراضيًا على value،كائن االستثناء له سمة واحدة
يتم رفع مثيل جديد ، ويتم استخدام القيمة التي تم إرجاعها بواسطة coroutine ، StopIterationعندما يعود منشئ أو دالة
.االستثناءvalue الدالة كمعامل لمنشئ
بـ StopIterationاالحتفاظ( RuntimeErrorيتم تحويله إلى StopIteration،إذا تم رفع رمز المولد بشكل مباشر أو غير مباشر
).كسبب لالستثناء الجديد
.سمة وقدرة وظائف المُنشئ على استخدامها إلرجاع قيمة valueتم التغيير في اإلصدار :3.3تمت إضافة
يتم تحويل الخطأ الذي يظهر :StopIteration لجميع التعليمات البرمجية افتراضيًاPEP 479 تم التغيير في اإلصدار :3.7تمكين
RuntimeError.في المولد إلى ملف
StopAsyncIterationاستثناء
) رسالة ، تفاصيل 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)).
IndentationErrorاستثناء
SyntaxError.الصنف األساسي ألخطاء بناء الجملة المتعلقة بمسافة بادئة غير صحيحة .هذه فئة فرعية من
TabErrorاستثناء
يتم رفعه عندما تحتوي المسافة البادئة على استخدام غير متسق لعالمات التبويب والمسافات .هذه فئة فرعية
IndentationError.من
SystemErrorاستثناء
يُثار عندما يجد المترجم خطأ داخليًا ،لكن ال يبدو الوضع خطيرً ا لدرجة تجعله يتخلى عن كل أمل .القيمة المرتبطة هي سلسلة تشير
.إلى الخطأ الذي حدث (بعبارات منخفضة المستوى)
؛ تتم Python ( sys.versionيجب عليك إبالغ مؤلف أو مشرف مترجم بايثون الخاص بك .تأكد من اإلبالغ عن إصدار مترجم
ورسالة الخطأ الدقيقة (القيمة المرتبطة باالستثناء) ومصدر البرنامج الذي تسبب ) ،التفاعلية Pythonطباعته أيضً ا في بداية جلسة
.في حدوث الخطأ إن أمكن
SystemExitاستثناء
بحيث ال يتم اكتشافه عن Exceptionبدالً من BaseExceptionالوظيفة .إنه يرث من)( sys.exitيتم رفع هذا االستثناء بواسطة
هذا يسمح لالستثناء باالنتشار بشكل صحيح ويؤدي إلى خروج المترجم .عندما Exception. طريق الخطأ بواسطة الكود الذي يمسك
ال يتم التعامل معها ،يخرج مترجم بايثون ؛ ال تتم طباعة التتبع المكدس .يقبل المُنشئ نفس الوسيطة االختيارية التي تم تمريرها
؛ إذا كان األمر ) C وظيفة)( exitتم تمريرها إلى( إذا كانت القيمة ً
عددا صحيحً ا ،فإنها تحدد حالة خروج النظام sys.exit(). إلى
.فإن حالة الخروج هي صفر ؛ إذا كان له نوع آخر (مثل سلسلة) ،فستتم طباعة قيمة الكائن وحالة الخروج واحدة None،كذلك
code
TypeErrorاستثناء
.يُطلق عند تطبيق عملية أو وظيفة على كائن من نوع غير مناسب .القيمة المرتبطة هي سلسلة تعطي تفاصيل حول عدم تطابق النوع
قد يُثار هذا االستثناء من خالل رمز المستخدم لإلشارة إلى أن محاولة إجراء عملية على كائن غير مدعومة ،وليس من المفترض أن
ً
تنفيذا بعد فإن االستثناء ، NotImplementedErrorتكون كذلك .إذا كان الغرض من الكائن هو دعم عملية معينة ولكن لم يقدم
.المناسب Lهو رفعه
Pg. 262
ولكن ) TypeError،يكون متوقعًا intعندما a listعلى سبيل المثال تمرير( يجب أن ينتج عن تمرير الوسيطات من النوع الخاطئ
ValueError.تمرير الوسيطات ذات القيمة الخاطئة (على سبيل المثال ،رقم خارج الحدود المتوقعة) يجب أن ينتج عنه
UnboundLocalErrorاستثناء
NameError.يُطلق عند اإلشارة إلى متغير محلي في دالة أو طريقة ،ولكن لم يتم ربط أي قيمة بهذا المتغير .هذه فئة فرعية من
UnicodeErrorاستثناء
ValueError.إنها فئة فرعية من Unicode. يُطلق عند حدوث خطأ ترميز أو فك تشفير متعلق بـ
encoding
reason
object
start
end
UnicodeEncodeErrorاستثناء
UnicodeError.أثناء التشفير .إنها فئة فرعية من Unicodeيُطلق عند حدوث خطأ متعلق بـ
UnicodeDecodeErrorاستثناء
UnicodeError.أثناء فك التشفير .إنها فئة فرعية من Unicodeيُطلق عند حدوث خطأ متعلق بـ
UnicodeTranslateErrorاستثناء
UnicodeError.أثناء الترجمة .إنها فئة فرعية من Unicodeيُطلق عند حدوث خطأ متعلق بـ
ValueErrorاستثناء
يُطلق عندما تتلقى عملية أو دالة وسيطة من النوع الصحيح ولكن بقيمة غير مناسبة ،وال يتم وصف الموقف باستثناء أكثر دقة
IndexError.مثل
ZeroDivisionErrorاستثناء
ُ .ت رفع عندما تكون الوسيطة الثانية لقسمة أو عملية نمطية صفراً .القيمة المرتبطة هي سلسلة تشير إلى نوع المعامالت Lوالعملية
OSError.فهي أسماء Lمستعارة لـ Python 3.3 ،يتم االحتفاظ باالستثناءات التالية للتوافق مع اإلصدارات السابقة ؛ بدءًا من
EnvironmentErrorاستثناء
IOErrorاستثناء
Pg. 263
WindowsErrorاستثناء
BlockingIOErrorاستثناء
يُطلق عندما يتم حظر عملية ما على كائن (على سبيل المثال ،مقبس) تم تعيينه لعملية غير معطلة .يتوافق
EINPROGRESS.و errno EAGAIN، EALREADY، EWOULDBLOCKمع
characters_written
عدد صحيح يحتوي على عدد األحرف المكتوبة في الدفق قبل حظره .تتوفر هذه السمة عند استخدام فئات اإلدخال /اإلخراج المخزنة
.الوحدة النمطية ioمؤق ًتا من
ChildProcessErrorاستثناء
ConnectionErrorاستثناء
BrokenPipeError، ConnectionAbortedError، ConnectionRefusedErrorفرعية هي
ConnectionResetError.و
BrokenPipeErrorاستثناء
يتم رفعها عند محاولة الكتابة على أنبوب بينما يكون الطرف اآلخر مغل ًقا ،أو عند محاولة ConnectionError،فئة فرعية لـ
ESHUTDOWN.و errno EPIPEالكتابة على مقبس تم إغالقه بسبب الكتابة .يتوافق مع
ConnectionAbortedErrorاستثناء
يتم رفعها عندما يتم إحباط محاولة اتصال بواسطة النظير .يتوافق ConnectionError،فئة فرعية لـ
errno ECONNABORTED.مع
ConnectionRefusedErrorاستثناء
errno ECONNREFUSED.يتم رفعها عند رفض النظير محاولة االتصال .يتوافق مع ConnectionError،فئة فرعية لـ
ConnectionResetErrorاستثناء
errno ECONNRESET.يتم رفعها عند إعادة تعيين االتصال بواسطة النظير .يتوافق مع ConnectionError،فئة فرعية من
FileExistsErrorاستثناء
FileNotFoundErrorاستثناء
InterruptedErrorاستثناء
Pg. 264
بواسطة إشارة ،إال إذا قام معالج syscallاآلن محاولة مكالمات النظام عند مقاطعة Pythonتم التغيير في اإلصدار :3.5تعيد
InterruptedError.بدالً من الرفع ) ،لألساس المنطقيPEP 475 راجع( اإلشارة بإثارة استثناء
IsADirectoryErrorاستثناء
NotADirectoryErrorاستثناء
ضا إذا حاولت عملية POSIX ،على شيء ليس دليالً .في معظم أنظمة ))( os.listdirمثل( يُطلق عند طلب عملية دليل
قد يتم رفعه أي ً
اًل
errno ENOTDIR.ما فتح ملف غير دليل أو اجتيازه كما لو كان دلي .يتوافق مع
PermissionErrorاستثناء
يُطلق عند محاولة تشغيل عملية بدون حقوق الوصول المناسبة -على سبيل المثال أذونات نظام الملفات .يتوافق
EPERM.و errno EACCESمع
ProcessLookupErrorاستثناء
TimeoutErrorاستثناء
errno ETIMEDOUT.يُطلق عند انتهاء مهلة إحدى وظائف النظام على مستوى النظام .يتوافق مع
أنظر أيضا
Warnings
ُ .تستخدم االستثناءات التالية كفئة تحذير ؛ راجع وثائق " فئات التحذير" للحصول على مزيد من التفاصيل
Warningاستثناء
UserWarningاستثناء
DeprecationWarningاستثناء
.اآلخرين Pythonالفئة األساسية Lللتحذيرات المتعلقة بالميزات المهملة عندما تكون هذه التحذيرات مخصصة لمطوري
يؤدي تمكين وضع (PEP 565 ). الوحدة النمطية__ __mainتم تجاهله بواسطة عوامل تصفية التحذير االفتراضية ،باستثناء
.إلى إظهار هذا التحذير Python تطوير
PendingDeprecationWarningاستثناء
.الفئة األساسية Lللتحذيرات المتعلقة بالميزات القديمة والمتوقع إهمالها في المستقبل ،ولكن لم يتم إهمالها في الوقت الحالي
ويفضل في ، DeprecationWarning نادرً ا ما يتم استخدام هذه الفئة ألن إرسال تحذير بشأن إهمال قادم محتمل أمر غير معتاد
.حاالت اإلهمال النشطة بالفعل
Pg. 265
.إلى إظهار هذا التحذير Python تم تجاهله بواسطة عوامل تصفية التحذير االفتراضية .يؤدي تمكين وضع تطوير
SyntaxWarningاستثناء
RuntimeWarningاستثناء
FutureWarningاستثناء
الفئة األساسية Lللتحذيرات المتعلقة بالميزات المهملة عندما تكون هذه التحذيرات مخصصة للمستخدمين النهائيين للتطبيقات المكتوبة
Python.بلغة
ImportWarningاستثناء
.إلى إظهار هذا التحذير Python تم تجاهله بواسطة عوامل تصفية التحذير االفتراضية .يؤدي تمكين وضع تطوير
UnicodeWarningاستثناء
EncodingWarningاستثناء
BytesWarningاستثناء
ResourceWarningاستثناء
.إلى إظهار هذا التحذير Python تم تجاهله بواسطة عوامل تصفية التحذير االفتراضية .يؤدي تمكين وضع تطوير
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.ascii_letters
.صفت الثوابت أدناه .هذه القيمة ال تعتمد على اإلعدادات المحلية ascii_uppercase و ascii_lowercaseفي سلسلة من
string.ascii_lowercase
string.ascii_uppercase
string.digits
'.السلسلة0123456789'
string.hexdigits
abcdefABCDEF'.السلسلة0123456789'
string.octdigits
'.السلسلة01234567'
string.punctuation
string.printable
string.whitespace
التي تعتبر مسافة Lبيضاء .يتضمن ذلك مسافة األحرف ،وعالمة التبويب ،وتغذية األسطر ASCII ،سلسلة تحتوي على جميع أحرف
.والعودة ،وتغذية النموذج ،وعالمة التبويب العمودية
Pg. 269
الطريقة الموضحة في بيب)( formatتوفر فئة السلسلة المضمنة القدرة على إجراء استبداالت متغيرة معقدة وتنسيق القيمة عبر
الوحدة تسمح لك إلنشاء وتخصيص سلسلة تنسيق السلوكيات الخاصة بك باستخدام نفس تنفيذ stringفئة في . 3101Formatterو
.األسلوب)(formatمثل المدمج في
string.Formatterفئة
األساسية .يأخذ سلسلة تنسيق ومجموعة عشوائية من الوسائط الموضعية والكلمات الرئيسية .إنه مجرد غالف APIطريقة
vformat().يستدعي
vformat( format_string ، args ، kwargs )
تقوم هذه الوظيفة بالعمل الفعلي للتنسيق .يتم عرضه كدالة منفصلة للحاالت التي تريد فيها المرور في قاموس محدد مسب ًقا للوسيطات
يقوم بعمل تقسيم )(. vformatالجملة **kwargs وبناء ، *argsبدالً من تفريغ وإعادة حزم القاموس كوسيطات فردية باستخدام
.سلسلة التنسيق إلى بيانات شخصية وحقول االستبدال .يستدعي الطرق المختلفة الموضحة أدناه
:يحدد عدد من الطرق التي من المفترض أن يتم استبدالها بالفئات الفرعية ، Formatterباإلضافة إلى ذلك
parse( format_string )
تمثل القيم الموجودة في المجموعة من الناحية المفاهيمية نطا ًقا من النص الحرفي متبو ًعا بحقل بديل واحد .إذا لم يكن هناك نص
سلسلة ذات طول صفري .إذا لم 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،حالة
ً
تعقيد ا ،وعلى وجه الخصوص ،ال يدعم التعبيرات العشوائية .للسلسلة المنسقة ، ولكنه أقل
تحتوي سالسل التنسيق على "حقول استبدال" محاطة بأقواس معقوفة .}{ أي شيء غير موجود في األقواس يعتبر نصً ا حرفيًا ،يتم
.نسخه دون تغيير إلى اإلخراج .إذا كنت بحاجة إلى تضمين حرف قوس في النص الحرفي ،فيمكن تجاوزه بمضاعفة{{ :و}}
الذي يحدد الكائن الذي سيتم تنسيق قيمته وإدراجها في 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لـ
Pg. 271
:بعض أمثلة سالسل التنسيق البسيطة
"}{ "Bring me a # Implicitly references the first positional argument
بطريقة القيمة نفسها .ومع ذلك ،في )(__ __formatو تحويل يتسبب الحقل نوع اإلكراه قبل تهيئة .عاد ًة ما تتم مهمة تنسيق القيمة
بعض الحاالت ،من المستحسن فرض تنسيق نوع ما كسلسلة ،لتجاوز تعريف التنسيق الخاص به .بتحويل القيمة إلى سلسلة قبل
.يتم تجاوز منطق التنسيق العادي __format__()،االتصال
ascii().التي المكالمات' '!aو)( reprوالتي المكالمات'، '!rعلى القيمة str() التي المكالمات: '!s'Lيتم دعم ثالثة أعالم تحويل حاليا
:بعض األمثلة
"Bring out the holy {name!r}" # Calls repr() on the argument first
يحتوي الحقل على تحديد كيف ينبغي أن تقدم قيمة ،بما في ذلك تفاصيل مثل عرض الحقل ،والمحاذاة ،الحشو format_spec ،و
format_spec .عشري الدقة وهلم جرا .يمكن لكل نوع قيمة أن يحدد "لغة التنسيق المصغرة" الخاصة به أو تفسير التنسيق
.تدعم معظم األنواع المضمنة لغة تنسيق مصغرة شائعة ،والتي سيتم وصفها في القسم التالي
الحقل يمكن أن تشمل أيضا مجاالت استبدال متداخلة داخلها .قد تحتوي حقول االستبدال المتداخلة هذه على اسم A format_spec
قبل تف format_specحقل وعالمة تحويل ومواصفات تنسيق ،ولكن ال يُسمح بالتداخل األعمق .يتم استبدال حقول االستبدال ضمن
.يسمح ذلك بتحديد تنسيق القيمة ديناميكيًا format_spec . سير سلسلة
تنفذ معظم األنواع المضمنة الخيارات التالية لمواصفات التنسيق ،على الرغم من أن بعض خيارات التنسيق مدعومة فقط من خالل
.األنواع الرقمية
القيمة .عاد ًة ما تقوم مواصفات )( strاالصطالح العام هو أن مواصفات التنسيق الفارغة تنتج نفس النتيجة كما لو كنت قد استدعت
.التنسيق غير الفارغة بتعديل النتيجة
format_spec ]:: = [[ fill] align] [ sign] [#] [0] [ width] [ grouping_option] [. precision] [ type
Pg. 272
عالمة "" | ":: = "+" | "-
" = ::ب" | "ج" | "د" | "ه" | "ه" | "و "" | "x" | "X" | "٪ن" | "س" | "ق" | "" | "Gز" | "" | "Fالنوع
إذا تم تحديد قيمة محاذاة صالحة ، فيمكن أن يسبقها حرف تعبئة يمكن أن يكون أي حرف ويتم تعيينه افتراضيًا على مسافة Lإذا تم
حذفه .ال يمكن استخدام قوس متعرج حرفي (" "{ أو " )"} كحرف تعبئة في سلسلة حرفية منسقة أو عند
الطريقة .ومع ذلك ،من الممكن إدراج قوس متعرج مع حقل بديل متداخل .هذا القيد ال يؤثر str.format() استخدام
.الوظيفة)( formatعلى
خيا
المعنى
ر
الحظ أنه ما لم يتم تحديد الحد األدنى لعرض الحقل ،فسيكون عرض الحقل دائ ًم ا بنفس حجم البيانات لتعبئته ،بحيث ال يكون لخيار
.المحاذاة أي معنى في هذه الحالة
:في عالمة الخيار صالحا فقط ألنواع العدد ،ويمكن أن يكون أحد الخيارات التالية
خيار المعنى
فضا يشير إلى أنه يجب استخدام مسافة Lبادئة على األرقام
ء .الموجبة وعالمة ناقص على األرقام السالبة
و'#' يتسبب خيار "نموذج بديل" الستخدامها في عملية التحويل .يتم تعريف النموذج البديل بشكل مختلف ألنواع مختلفة .هذا الخيار
صالح فقط ألنواع األعداد الصحيحة والعائمة والمعقدة .من اجل االعداد الصحيحه ،عندما ثنائي ،يتم استخدام االنتاج ثماني ،أو
إلى قيمة االنتاج .بالنسبة للعوامات والمعقدة ،يتسبب النموذج 'Xأوb'، '0o'، '0x'، 0' عشري ،هذا الخيار يضيف البادئة منها0'
Pg. 273
البديل في احتواء نتيجة التحويل دائمًا على حرف فاصلة عشرية ،حتى لو لم تتبعه أرقام .عادة ،يظهر حرف الفاصلة العشرية في
.التحويالت ،ال تتم إزالة األصفار الالحقة من النتيجة 'G' إلى' 'gنتيجة هذه التحويالت فقط إذا تبعه رقم .باإلضافة إلى ذلك ،بالنسبة
.نوع العرض التقديمي الصحيح بدالً من ذلك' 'nيشير',' الخيار إلى استخدام فاصلة لفاصل اآلالف .لفاصل علم اللغة ،استخدم
ألنواع 'd'. يشير'_' الخيار إلى استخدام شرطة سفلية لفاصل اآلالف ألنواع عرض النقطة العائمة ولنوع العرض التقديمي الصحيح
سيتم إدراج أحرف (_) كل 4أرقام .بالنسبة ألنواع العروض التقديمية األخرى ،يعد تحديد 'X'،و 'b'، 'o'، 'x'،عرضا صحيحا
.هذا الخيار خطأ ً
العرض هو عدد صحيح عشري يحدد الحد األدنى إلجمالي عرض الحقل ،بما في ذلك أي بادئات وفواصل وأحرف تنسيق
.أخرى .إذا لم يتم تحديده ،فسيتم تحديد عرض الحقل من خالل المحتوى
عندما ال يتم إعطاء محاذاة صريحة ،فإن تسبق حقل العرض' '0بحرف صفري ( ) يتيح تدرك العالمة عدم ترك مساحة فارغة
'='.لألنواع الرقمية .هذا ما يعادل ملء شخصية'0' مع محاذاة نوع
.تغير في اإلصدار :3.10يسبق العرض الميدان الذي'0' لم يعد يؤثر على المحاذاة االفتراضية لسالسل
أو قبل 'F'،و' 'fو الدقة هو رقم عشري وتمثل عدد األرقام يجب أن يتم عرض بعد العالمة العشرية لقيمة النقطة العائمة تنسيق مع
بالنسبة لألنواع غير الرقمية ،يشير الحقل إلى الحد األقصى لحجم 'G'. أو' 'gوبعد الفاصلة العشرية لقيمة النقطة العائمة تنسيق مع
.الحقل -بمعنى آخر ،عدد األحرف التي سيتم استخدامها من محتوى الحقل .و الدقة ال يسمح للقيم صحيح
نوع المعنى
ال
's'.نفس
أحد
نوع المعنى
Pg. 274
نوع المعنى
ال
'd'.نفس
أحد
( باإلضافة إلى أنواع العروض التقديمية المذكورة أعاله ،يمكن تنسيق األعداد الصحيحة بأنواع عرض النقطة العائمة المدرجة أدناه
.يتم استخدامه لتحويل العدد الصحيح إلى رقم فاصلة عائمة قبل التنسيق)( ، floatعند القيام بذلك None). و' 'nباستثناء
نوع المعنى
Pg. 275
نوع المعنى
Pg. 276
%' ، على سبيل المثال .% المستخدم بدالً من: {}و مع مع إضافة، القديم للتنسيق% L يكون بناء الجملة مشاب ًها، في معظم الحاالت
03.2f'يمكن ترجمتها إلى '{:03.2f}'.
>>>
'a, b, c'
'a, b, c'
'c, b, a'
'c, b, a'
'abracadabra'
>>>
>>>
>>> c = 3-5j
>>> ('The complex number {0} is formed from the real part {0.real} '
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
Pg. 277
... def __str__(self):
...
'Point(4, 2)'
>>>
'X: 3; Y: 5'
استبدال %sو %r:
>>>
>>>
>>> '{:^30}'.format('centered')
'***********centered***********'
استبدال %+f، %-fوتحديد عالمة و:% f
>>>
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14) # show a space for positive numbers
>>> '{:-f}; {:-f}'.format(3.14, -3.14) # show only the minus -- same as '{:f}; {:f}'
Pg. 278
'3.140000; -3.140000'
>>>
>>>
>>> '{:,}'.format(1234567890)
'1,234,567,890'
>>>
>>> points = 19
>>> total = 22
>>>
'2010-07-04 12:15:58'
ً
تعقيدا الحجج المتداخلة واألمثلة األكثر:
>>>
...
'left<<<<<<<<<<<<'
Pg. 279
'^^^^^'^^^^^center
''>>>>>>>>>>>right
>>>
)>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets
''C0A80001
3232235521
>>>
... )(print
...
سالسل القالب
توفر سالسل القوالب استبداالت أبسط للسلسلة كما هو موضح في . 292 حالة االستخدام األساسية لسالسل القوالب هي التدويل
ألنه في هذا السياق ،تجعل البنية والوظائف األبسط عملية الترجمة أسهل من غيرها من مرافق تنسيق السلسلة المضمنة في )(i18n
flufl.i18n .راجع حزمة i18n ،كمثال على مكتبة مبنية على سالسل قوالب لـPython.
:تدعم سالسل القوالب$ االستبداالت المستندة إلى القواعد ،باستخدام القواعد التالية
يقتصر على " ، "identifierبشكل افتراضي "identifier". يسمي عنصرً ا نائبًا بدياًل يطابق مفتاح تعيين$identifier
غير حساسة لحالة األحرف (بما في ذلك الشرطات السفلية) التي تبدأ بشرطة سفلية أو ASCIIأي سلسلة أبجدية رقمية
.الحرف األول بدون معرف بعد$ إنهاء الحرف لمواصفات العنصر النائب هذا ASCII. حرف
يكون مطلوبًا عندما تتبع أحرف المعرف الصالحة العنصر النائب ولكنها ليست جزءًا $identifier. يعادل}${identifier
"${noun}ification".من العنصر النائب ،مثل
Pg. 280
.رفع ValueError أي مظهر آخر لـ$ في السلسلة سينتج عنه
) قالب string.Template( فئة
ينفذ استبدال القالب ،ويعيد سلسلة جديدة .التعيين هو أي كائن يشبه القاموس بمفاتيح تطابق العناصر النائبة في القالب .بدالً من ذلك ،
مع kwds يمكنك توفير وسيطات الكلمات األساسية ،حيث تكون الكلمات الرئيسية هي العناصر النائبة .عند إعطاء كل من التعيين و
kwds .وجود تكرارات ،تكون األولوية للعناصر النائبة من
استثناء ،سيظهر KeyErrorفبدالً من رفع kwds ،باستثناء أنه إذا كانت العناصر النائبة مفقودة من التعيين و substitute()،مثل
ضا ،على عكس مع ستعود أي مظاهر أخرى من substitute()، $العنصر النائب األصلي في السلسلة الناتجة سليمة .أي ً
ً
ValueError.المظهر$ بدال من الرفع
بينما قد تحدث استثناءات أخرى ،تسمى هذه الطريقة "آمنة" ألنها تحاول دائمًا إرجاع سلسلة قابلة لالستخدام بدالً من إثارة
قد يكون أي شيء بخالف األمان ،ألنه سيتجاهل بصمت القوالب المشوهة التي تحتوي )( ، safe_substituteاستثناء .بمعنى آخر
.صالحة Pythonعلى محددات متدلية أو أقواس غير متطابقة أو عناصر نائبة ليست معرّفاتL
:توفر األمثلة أي ً
ضا سمة بيانات عامة واحدةTemplate
template
.هذا هو الكائن الذي تم تمريره إلى وسيطة قالب المنشئ . بشكل عام ،ال يجب تغييره ،ولكن ال يتم فرض الوصول للقراءة فقط
>>>
)'>>> d = dict(who='tim
...
...
'KeyError: 'what
Pg. 281
)>>> Template('$who likes $what').safe_substitute(d
لتخصيص بناء جملة العنصر النائب أو حرف المحدد أو التعبير العادي Templateاالستخدام المتقدم :يمكنك اشتقاق الفئات الفرعية
:بأكمله المستخدم لتحليل سالسل القالب .للقيام بذلك ،يمكنك تجاوز سمات الفئة هذه
محدد - هذا هو السلسلة الحرفية التي تصف عنصرً ا نائبًا يقدم المحدد .القيمة االفتراضية هي .$ الحظ أن هذا ال ينبغي
هذه السلسلة حسب الحاجة .الحظ أيضً ا أنه ال يمكنك تغيير )( re.escapeأن يكون تعبيرً ا عاديًا ،ألن التنفيذ سيستدعي
.المحدد بعد إنشاء الفئة (أي يجب تعيين محدد مختلف في مساحة اسم فئة الفئة الفرعية)
هذا هو التعبير العادي الذي يصف نمط العناصر النائبة غير الداعمة .القيمة االفتراضية هي التعبير idpattern -
أن هذا النمط ينطبق أيضا على النائبة Noneهو braceidpattern إذا أعطيت هذه و (?a:[_a-z][_a-z0-9]*). العادي
.استعدت
ملحوظة
.تم التغيير في اإلصدار :3.7يمكن استخدام نمط الدعامة لتحديد أنماط منفصلة مستخدمة داخل األقواس وخارجها
التي Noneيشبه نمط الهوية ولكنه يصف النمط الخاص بالعناصر النائبة المجهزة . االفتراضيات braceidpattern -
تعني الرجوع إلى نمط الهوية( أي يتم استخدام نفس النمط في كل من األقواس الداخلية والخارجية) .إذا تم تقديمه ،فسيتيح
.لك ذلك تحديد أنماط مختلفة للعناصر النائبة المستقيمة وغير المستقرة
.تطابق هذه المجموعة تسلسل الهروب ،على سبيل المثال ،$$ في النمط االفتراضي escaped -
.مسمى - تتطابق هذه المجموعة مع اسم العنصر النائب غير المفصول ؛ ال ينبغي أن يتضمن المحدد في مجموعة االلتقاط
دعامة - تتطابق هذه المجموعة مع اسم العنصر النائب المضمن في قوس ؛ ال ينبغي أن يتضمن إما المحدد أو األقواس في
.مجموعة االلتقاط
غير صالح - تتطابق هذه المجموعة مع أي نمط محدد آخر (عاد ًة ما يكون محد ًدا واح ًدا) ،ويجب أن تظهر أخيرً ا في
.التعبير العادي
وظائف المساعد
وانضم إلى str.capitalize()،واستعمل األحرف الكبيرة في كل كلمة باستخدام str.split()،قسّم الحجة إلى كلمات باستخدام
تم استبدال None،غير موجودة أو sep إذا كانت الوسيطة الثانية االختيارية str.join(). الكلمات ذات األحرف الكبيرة باستخدام
Pg. 282
لتقسيم الكلمات sep مجموعات أحرف المسافات البيضاء بمسافة Lواحدة وإزالة المسافة البيضاء البادئة والخلفية ،وإال فسيتم استخدام
.وضمها
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يتسبب في تطابق
.تتطابق مع "أ" فقط
?
??*?, +?,
و'+' ،'*' و'?' التصفيات كلها الجشع . تتطابق مع أكبر قدر ممكن من النص .أحيا ًنا يكون هذا السلوك غير مرغوب
ضد ، فسوف تتطابق مع السلسلة بأكملها ،وليس فقط . اإلضافة بعد التصفيات تجعلها تؤدي المباراة 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:...
تستبعد بعضها البعض عندما تستخدم على النحو األعالم المضمنة ،بحيث ال يمكن الجمع أو متابعة .'-' بدالً من' 'uو' 'a'، 'Lالحروف
?( يتم Unicode ،ذلك ،عندما يظهر أحدهم في مجموعة مضمنة ،فإنه يتجاوز وضع المطابقة في مجموعة التضمين .في أنماط
يتحول إلى ) ، (?L:...في نمط البايت). افتراضي( Unicodeويتحول إلى مطابقة) ، (?u:...فقط ASCIIالتبديل إلى مطابقة)a:...
فقط (افتراضي) .هذا التجاوز ساري المفعول فقط ASCIIويتحول إلى مطابقة) ، (?a:...اإلعدادات المحلية بنا ًء على المطابقة
.للمجموعة الضيقة المضمنة ،ويتم استعادة وضع المطابقة األصلي خارج المجموعة
)(?P<name>...
تشبه األقواس العادية ،ولكن يمكن الوصول إلى السلسلة الفرعية المطابقة بواسطة المجموعة عبر اسم اسم المجموعة
صالحة ،ويجب تحديد اسم كل مجموعة مرة واحدة فقط في تعبير Pythonالرمزي . يجب أن تكون أسماء المجموعات معرّفاتL
.عادي .المجموعة الرمزية هي أيضً ا مجموعة مرقمة ،تمامًا كما لو لم يتم تسمية المجموعة
أي مطابقة سلسلة () (?P<quote>['"]).*?(?P=quoteيمكن اإلشارة إلى المجموعات المسماة Lفي ثالثة سياقات .إذا كان النمط هو
):مقتبسة بعالمات اقتباس مفردة أو مزدوجة
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عنها ؛ سترغب على األرجح في استخدام
>>>
)>>> m.group(0
''def
>>>
)>>> m.group(0
''egg
Pg. 287
.تم التغيير في اإلصدار :3.5تمت إضافة دعم لمراجع المجموعة ذات الطول الثابت
)(?<!...
يطابق إذا كان الموضع الحالي في السلسلة غير مسبوق بمطابقة لـ .... وهذا ما يسمى تأكيد البحث الخلفي السلبي . على غرار
تأكيدات البحث الخلفي اإليجابية ،يجب أن يتطابق النمط المضمن فقط مع سالسل ذات طول ثابت .قد تتطابق األنماط التي تبدأ
.بتأكيدات بحث خلفي سلبية في بداية السلسلة التي يتم البحث عنها
)(?(id/name)yes-pattern|no-pattern
الناتج 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األحرف الرقمية األخرى .إذا
Pg. 288
\D
.تم استخدام العلم يصبح هذا مكاف ًئا Lلـ ASCII]9-0^[ إذا \d. يتطابق مع أي حرف ليس رقمًا عشريًا .هذا هو عكس
\s
Unicode (str):ألنماط
البيضاء (التي تتضمن ، والعديد من األحرف األخرى أيضً ا ،على سبيل المثال المسافات غير Unicodeيطابق أحرف مسافاتL
.الفاصلة التي تفرضها قواعد الطباعة في العديد من اللغات) .إذا تم استخدام العلم ،فسيتم مطابقة فقط
][ \t\n\r\f\v]ASCII[ \t\n\r\f\v
] .[ \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والشرطة السفلية .إذا
تم استخدام LOCALEإذا [a-zA-Z0-9_]. ؛ هذا يعادل ASCIIاألحرف المتطابقة التي تعتبر أبجدية رقمية في مجموعة أحرف
.العالمة ،فستتطابق مع األحرف التي تعتبر أبجدية رقمية في اإلعدادات المحلية الحالية والشرطة السفلية
\W
[^a-zA-Z0-تم استخدام العلم يصبح هذا مكاف ًئا Lلـ ASCIIإذا \w. يتطابق مع أي حرف ليس حر ًفا من أحرف الكلمات .هذا هو عكس
تم استخدام العالمة ،فستتطابق مع األحرف التي ليست أبجدية رقمية في اإلعدادات المحلية الحالية وال الشرطة LOCALEإذا9_].
.السفلية
\Z
) .يُستخدم لتمثيل حدود الكلمات ،ويعني "مسافة للخلف" فقط داخل فئات األحرف \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
يعادل
وحفظ كائن التعبير العادي الناتج إلعادة االستخدام يكون أكثر كفاءة عندما يتم استخدام التعبير عدة )( 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<...>. تجاوزها ،أو داخل الرموز المميزة مثل:?( ،?* أو
.يسبقه خط مائل عكسي غير مهذب # ،يتم تجاهل جميع األحرف من أقصى اليسار مثل نهاية السطر
:هذا يعني أن كائني التعبير العادي التاليين اللذين يتطابقان مع رقم عشري متساويان وظيفيًا
)"*b = re.compile(r"\d+\.\d
Pg. 291
(?x).يتوافق مع العلم المضمن
) نمط ، سلسلة ، أعالمre.search( 0 =
إذا Noneامسح عبر سلسلةً
بحثا عن الموقع األول حيث يُنتج نمط التعبير العادي تطاب ًقا ،ثم قم بإرجاع كائن مطابقة مطابق . العودة
.لم يتطابق أي موضع في السلسلة مع النمط ؛ الحظ أن هذا يختلف عن العثور على تطابق صفري في نقطة ما في السلسلة
) نمط ، سلسلة ، أعالمre.match( 0 =
.سيتطابق فقط في بداية السلسلة وليس في بداية كل سطر)( ، re.matchالوضع MULTILINEالحظ أنه حتى في
بدالً من ذلك (انظر أيضًا البحث () مقابل المطابقة search() إذا كنت تريد تحديد موقع تطابق في أي مكان في السلسلة ، فاستخدمL
) )(.
) نمط ، سلسلة ، أعالمre.fullmatch( 0 =
ضا إرجاع نص جميع المجموعات في قسّم السلسلة حسب تكرارات النمط . إذا تم استخدام أقواس االلتقاط في النمط ، فسيتم أي ً
غير صفري ،تحدث االنقسامات Lفي أقصى حد ، ويتم إرجاع باقي السلسلة maxsplit النموذج كجزء من القائمة الناتجة .إذا كان
.كعنصر نهائي في القائمة
>>>
إذا كانت هناك مجموعات التقاط في الفاصل وكانت مطابقة في بداية السلسلة ،فستبدأ النتيجة بسلسلة فارغة .ينطبق األمر نفسه على
:نهاية السلسلة
>>>
.بهذه الطريقة ،يتم دائ ًم ا العثور على مكونات الفاصل في نفس المؤشرات النسبية ضمن قائمة النتائج
.المطابقات الفارغة للنمط تقسم السلسلة فقط عندما ال تكون متجاورة مع مطابقة فارغة سابقة
Pg. 292
>>>
]'' ['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '',
.تم التغيير في اإلصدار :3.7تمت إضافة دعم للتقسيم على نمط يمكن أن يتطابق مع سلسلة فارغة
) نمط ، سلسلة ، أعالمre.findall( 0 =
قم بإرجاع جميع التطابقات غير المتداخلة للنمط في سلسلة ، كقائمة سالسل أو مجموعات .في سلسلة يتم مسحها من اليسار إلى
.اليمين ،وعاد مباريات في الترتيب وجدت .يتم تضمين مباريات فارغة في النتيجة
تعتمد النتيجة على عدد مجموعات االلتقاط في النمط .إذا لم تكن هناك مجموعات ،فقم بإرجاع قائمة السالسل المطابقة للنمط
بأكمله .إذا كانت هناك مجموعة واحدة بالضبط ،فقم بإرجاع قائمة السالسل المطابقة لتلك المجموعة .في حالة وجود مجموعات
.متعددة ،قم بإرجاع قائمة مجموعات السالسل التي تطابق المجموعات .ال تؤثر المجموعات غير الملتقطة على شكل النتيجة
>>>
.تم التغيير في اإلصدار :3.7يمكن اآلن بدء المباريات غير الفارغة بعد مباراة فارغة سابقة
) نمط ، سلسلة ، أعالمre.finditer( 0 =
في السلسلة . في سلسلة يتم مسحها Lمن RE قم بإرجاع مكرر ينتج عنه كائنات مطابقة على جميع التطابقات غير المتداخلة لنمط
.اليسار إلى اليمين ،وعاد مباريات في الترتيب وجدت .يتم تضمين مباريات فارغة في النتيجة
.تم التغيير في اإلصدار :3.7يمكن اآلن بدء المباريات غير الفارغة بعد مباراة فارغة سابقة
العودة السلسلة التي تم الحصول عليها عن طريق استبدال تواجد أقصى اليسار غير متداخلة من نمط في سلسلة من
يمكن أن يكون سلسلة أو وظيفة .إذا كانت . 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{',
'{'static PyObject*\npy_myfunc(void)\n
هي وظيفة ،ويسمى كل قوع متداخلة غير من نمط . تأخذ الدالة وسيطة كائن مطابقة واحدة ، وتعيد سلسلة االستبدال .على REPL إذا
:سبيل المثال
>>>
''pro--gram files
)>>> re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE
عدد الوسيطة االختياري هو الحد األقصى لعدد تكرارات النمط المراد استبدالها ؛ العد يجب أن يكون عدد صحيح غير سالب .إذا تم
حذفها أو صفر ،فسيتم استبدال جميع التكرارات .يتم استبدال التطابقات الفارغة للنمط فقط عندما ال تكون مجاورة لمطابقة فارغة
' .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.5يتم استبدال المجموعات غير المتطابقة بسلسلة فارغة
.وأصبحت اآلن أخطاء ASCIIتم التغيير في اإلصدار :3.6عمليات الهروب غير المعروفة في نمط يتكون من'\' حرف
.تم التغيير في اإلصدار :3.7يتم استبدال التطابقات الفارغة للنمط عندما تكون مجاورة لمطابقة سابقة غير فارغة
.تم التغيير في اإلصدار :3.5يتم استبدال المجموعات غير المتطابقة بسلسلة فارغة
) نمط re.escape(
الهروب من الشخصيات Lالخاصة في النمط . يكون هذا ً
مفيد ا إذا كنت تريد مطابقة سلسلة حرفية عشوائية قد تحتوي على أحرف أولية
:للتعبير العادي .على سبيل المثال
Pg. 294
>>>
))'>>> print(re.escape('https://www.python.org
https://www\.python\.org
[abcdefghijklmnopqrstuvwxyz0123456789!\#\$%\&'\*\+\-\.\^_`\|\~:]+
*\|*\*\|/|\-|\+
يجب أن يتم تخطي الخطوط المائلة العكسية فقط .على سبيل subn()،و sub() يجب عدم استخدام هذه الوظيفة لسلسلة االستبدال في
:المثال
>>>
)(re.purge
يظهر االستثناء عندما ال تكون السلسلة التي تم تمريرها إلى إحدى الوظائف هنا تعبيرً ا عاديًا صالحً ا (على سبيل المثال ،قد تحتوي
على أقواس غير متطابقة) أو عند حدوث خطأ آخر أثناء التحويل البرمجي أو المطابقة .لن يكون خطأ ً
أبدا إذا كانت السلسلة ال
:تحتوي على تطابق للنمط .مثيل الخطأ له السمات Lاإلضافية التالية
msg
pattern
pos
Pg. 295
lineno
colno
يعطي فهر ًسا في السلسلة حيث يبدأ البحث ؛ انها افتراضية .0 هذا ال يكافئ تمامًا تقطيع pos المعامل الثاني االختياري
السلسلة ؛ و'^' تطابق شخصية نمط في بداية الحقيقية للسلسلة وفي المواقف بعد سطر جديد ،ولكن ليس بالضرورة في مؤشر حيث
.البحث هو أن تبدأ
طويلة endpos ،مدى البحث عن السلسلة ؛ سيكون األمر كما لو أن السلسلة تتكون من أحرف endpos تحدد المعلمة االختيارية
أقل من نقاط البيع ، فلن يتم العثور على تطابق endpos إلى عن تطابق .إذا كانت قيمة pos لذلك سيتم البحث فقط عن األحرف من
كائ ًنا مترجمًا للتعبير العادي ،فسيكون مكاف ًئا rx L؛ خال ًفا لذلك ،إذا كان
) .endpos - 1rx.search(string, 0, 50)rx.search(string[:50], 0لـ
>>>
إذا كانت Noneإذا صفر أو أكثر من الحروف في بداية ل سلسلة تطابق هذا التعبير العادي ،والعودة المقابلة الكائن المباراة . العودة
.السلسلة ال تتطابق مع النمط ؛ الحظ أن هذا يختلف عن المطابقة الصفرية
>>>
بدالً من ذلك (انظر أيضًا البحث () مقابل المطابقة )( searchإذا كنت تريد تحديد موقع تطابق في أي مكان في السلسلة ، فاستخدمL
) )(.
Pg. 296
[ ، pos [ ، endpos ] ] ) سلسلة Pattern.fullmatch(
إذا كانت السلسلة ال تتطابق مع Noneإذا كانت السلسلة بأكملها تطابق هذا التعبير العادي ،فقم بإرجاع كائن مطابقة مطابق . العودة
.النمط ؛ الحظ أن هذا يختلف عن المطابقة الصفرية
>>>
االختيارية التي تحد من منطقة endpos و pos الوظيفة ،باستخدام النمط المترجم ، ولكنه يقبل أيضًا معلمات )( findallعلى غرار
search().البحث مثل
االختيارية التي تحد من منطقة endpos و pos الوظيفة ،باستخدام النمط المترجم ، ولكنه يقبل أيضًا معلمات )( finditerعلى غرار
search().البحث مثل
) سلسلة ، العدPattern.sub( REPL ، 0 =
) سلسلة ، العدPattern.subn( REPL ، 0 =
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اختبار ما إذا كان هناك تطابق مع بسيطة
if match:
)process(match
) نموذج Match.expand(
يتم. \nالطريقة)( subأعد السلسلة التي تم الحصول عليها عن طريق استبدال الخط المائل العكسي في قالب سلسلة القالب ، كما فعلت
تحويل الهروب مثل إلى األحرف المناسبة ،ويتم استبدال المراجع الخلفية الرقمية ( )2\ ،1\ والمرجع الخلفي المسماةL
.بمحتويات المجموعة المقابلة )>( \g<1>، \g<name
.تم التغيير في اإلصدار :3.5يتم استبدال المجموعات غير المتطابقة بسلسلة فارغة
Match.group( [ group1 ، ... ] )
ُترجع مجموعة فرعية واحدة أو أكثر من المباراة .إذا كانت هناك وسيطة واحدة ،تكون النتيجة سلسلة واحدة ؛ إذا كانت هناك
وسيطات متعددة ،تكون النتيجة مجموعة تحتوي على عنصر واحد لكل وسيطة .بدون وسيطات ،يتم تعيين
تساوي صفرً ا ،فإن قيمة اإلرجاع groupNالمجموعة 1 االفتراضية على الصفر (يتم إرجاع المباراة بأكملها) .إذا كانت وسيطة
المقابلة هي سلسلة المطابقة بالكامل ؛ إذا كانت في النطاق الشامل [ ، ]99..1فهي السلسلة التي تطابق المجموعة المحاصرة
استثناء .إذا تم IndexErrorالمقابلة .إذا كان رقم المجموعة سالبًا أو أكبر من عدد المجموعات المحددة في النمط ،فسيتم إصدار
إذا تم تضمين مجموعة في جزء من النمط الذي تمتNone. تضمين مجموعة في جزء من النمط غير مطابق ،تكون النتيجة المقابلة
.مطابقته عدة مرات ،فسيتم إرجاع آخر تطابق
>>>
''Isaac Newton
''Isaac
''Newton
)'('Isaac', 'Newton
أي ً
ضا عبارة عن سالسل تحدد groupN بناء الجملة ،فقد تكون وسيطات) (?P<name>...إذا كان التعبير العادي يستخدم
.استثناء IndexError المجموعات حسب اسم المجموعة .إذا لم يتم استخدام وسيطة سلسلة كاسم Lمجموعة في النمط ،يظهر
Pg. 298
>>>
>>> m.group('first_name')
'Malcolm'
>>> m.group('last_name')
'Reynolds'
ً يمكن أي:
Lضا اإلشارة إلى المجموعات المسماة بواسطة فهرسها
>>>
>>> m.group(1)
'Malcolm'
>>> m.group(2)
'Reynolds'
فيمكن الوصول إلى آخر تطابق فقط، إذا تطابقت مجموعة عدة مرات:
>>>
'c3'
Match.__getitem__( ز )
هذا مطابق ل m.group(g). يتيح ذلك سهولة الوصول إلى مجموعة فردية من المباراة:
>>>
'Isaac Newton'
'Isaac'
'Newton'
وحتى العديد من المجموعات في1 بدءًا من، أعد مجموعة تحتوي على كل المجموعات الفرعية للمباراة
انها افتراضية .يستخدم حجة للمجموعات التي لم تشارك في المباراة االفتراضية و .النمط None.
Pg. 299
:على سبيل المثال
>>>
)(>>> m.groups
)'('24', '1632
إذا جعلنا المكان العشري وكل شيء بعده اختياريًا ،فلن تشارك جميع المجموعات في المباراة .ستتحول هذه المجموعات افتراضيًا
:ما لم يتم تقديم الوسيطة االفتراضية Noneإلى
>>>
)('24', None
)'('24', '0
قم بإرجاع قاموس يحتوي على جميع المجموعات الفرعية المسماة Lللمباراة ،والتي تم تمييزها بواسطة اسم المجموعة
:على سبيل المثال None. الفرعية .و االفتراضية يستخدم حجة للمجموعات التي لم تشارك في المباراة .انها افتراضية
>>>
)(>>> m.groupdict
] ) مجموعة Match.start( [
] ) مجموعة Match.end( [
إرجاع مؤشرات بداية ونهاية السلسلة الفرعية المطابقة للمجموعة ؛ يتم تعيين المجموعة االفتراضية على الصفر (بمعنى السلسلة
m ،الفرعية المتطابقة بالكامل) .العودة1- إذا كانت المجموعة موجودة ولكنها لم تساهم في المباراة .بالنسبة لكائن المطابقة
هي )) m.group(gتعادل( g التي ساهمت في المباراة ،فإن السلسلة الفرعية المطابقة للمجموعة g والمجموعة
])m.string[m.start(g):m.end(g
>>>
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
Match.lastindex
حالة عدم مطابقة أي مجموعة على اإلطالق .على سبيل المثال None،فهرس العدد الصحيح آلخر مجموعة التقاط متطابقة ،أو في
سيكون لها إذا تم تطبيقها على السلسلة ، في حين أن التعبير سيكون كذلك ، إذا تم تطبيقه على )) ، ((abو)) (a)b، ((a)(bالتعبيرات
.lastindex == 1'ab'(a)(b)lastindex == 2نفس السلسلة
Match.lastgroup
.إذا لم يكن للمجموعة اسم ،أو إذا لم يتم مطابقة أي مجموعة على اإلطالق Noneاسم آخر مجموعة التقاط متطابقة ،أو
Match.re
Match.string
.تعتبر كائنات المطابقة ذرية copy.deepcopy(). و)( copy.copyتم التغيير في اإلصدار :3.7تمت إضافة دعم لـ
:في هذا المثال ،سنستخدم الوظيفة المساعدة التالية لعرض الكائنات المتطابقة بشكل أكثر رشاقةL
def displaymatch(match):
return None
لـ " ، "aلنفترض أنك تكتب برنامج بوكر حيث يتم تمثيل يد الالعب على هيئة سلسلة مكونة من 5أحرف مع كل حرف يمثل بطاقة
.لـ ، 10و " "2إلى " "9تمثل البطاقة بهذه القيمة " ، "tلجاك " ، "jللملكة " ، "qللملك "ace ، "k
:لمعرفة ما إذا كانت سلسلة نصية معينة هي يد صالحة ،يمكن للمرء أن يقوم بما يلي
>>>
Pg. 301
>>> valid = re.compile(r"^[a2-9tjqk]{5}$")
727" تلك اليد األخيرةak"، يمكن للمرء، لمطابقة هذا مع تعبير عادي .تحتوي على زوج أو اثنتين من البطاقات ذات القيمة نفسها
استخدامbackreferences على هذا النحو:
>>>
يمكن للمرء استخدام، لمعرفة البطاقة التي يتكون منها الزوج group()طريقة كائن المطابقة بالطريقة التالية:
>>>
>>> pair.match("717ak").group(1)
'7'
# Error because re.match() returns None, which doesn't have a group() method:
>>> pair.match("718ak").group(1)
re.match(r".*(.).*\1", "718ak").group(1)
>>> pair.match("354aa").group(1)
'a'
Pg. 302
scanf () محاكاةL
تكون التعبيرات العادية بشكل عام أكثر قوة ،وإن كانت أيضً ا أكثر تفصيالً scanf(). ،ال يوجد في بايثون حاليًا ما يعادل
الرموز المميزة للتنسيق )( scanfسالسل التنسيق .يقدم الجدول أدناه بعض التعيينات المكافئة Lبشكل أو بآخر بين)( scanfمن
.والتعبيرات العادية
عمليات التحقق من التطابق فقط في بداية )(: re.matchعمليتين بدائيتين مختلفتين تستندان إلى التعبيرات العادية Pythonتقدم
).افتراضيًا Perlهذا ما يفعله( تتحقق من وجود تطابق في أي مكان في السلسلة)( re.searchالسلسلة ،بينما
>>>
Pg. 303
>>>
الحظ مع ذلك أنه في MULTILINEالوضع match() بينما يتطابق االستخدام، يتطابق فقط مع بداية السلسلة search() مع تعبير
'^'في بداية كل سطر عادي يبدأ بـ.
>>>
صنع دليل
split() هذه الطريقة ال تقدر بثمن لتحويل البيانات النصية إلى هياكل .يقسم سلسلة إلى قائمة محددة بواسطة النمط الذي تم تمريره
بيانات يمكن قراءتها بسهولة وتعديلها بواسطةPython كما هو موضح في المثال التالي الذي ينشئ دفتر هاتف.
وهنا نستخدم بناء جملة ثالثي بين عالمات االقتباس، عادة قد يأتي من ملف . هذا هو المدخل، أوال
>>>
...
...
...
نقوم اآلن بتحويل السلسلة إلى قائمة بها إدخال خاص لكل سطر غير فارغ .يتم فصل اإلدخاالت بسطر جديد واحد أو أكثر:
>>>
>>> entries
Pg. 304
نستخدم . باالسم األول واسم العائلة ورقم الهاتف والعنوانL قسّم كل إدخال إلى قائمة، أخيرً ا maxsplitالمعلمة split() ألن العنوان
بداخله، ونمط التقسيم الخاص بنا، Lيحتوي على مسافات:
>>>
مع . بحيث ال يحدث في قائمة النتائج،?نمط يطابق القولون بعد اسم آخر: على maxsplit ونحن يمكن فصل رقم المنزل من،4 من
اسم الشارع:
>>>
نصMunging
sub()يوضح هذا المثال استخدام .يستبدل كل تكرار لنمط بسلسلة أو نتيجة دالة sub() أو ترتيب جميع األحرف، دالة "لدمج" النص
عشوائيًا في كل كلمة من الجملة باستثناء الحرفين األول واألخير:
>>>
... random.shuffle(inner_word)
إيجاد كل الظروف
findall() وليس األول فقط كما، تكرارات النمط جميع يطابق search() إذا أراد كاتب العثور على جميع، على سبيل المثال .يفعل
L فقد يستخدمها، الظروف في بعض النصوص findall()بالطريقة التالية:
Pg. 305
>>>
">>> text = "He was carefully disguised but captured quickly by police.
]'['carefully', 'quickly
فهذا مفيد ألنه )( ، finditerإذا أراد المرء المزيد من المعلومات حول جميع تطابقات النمط أكثر من النص المطابق
يوفر كائنات متطابقة بدالً من السالسل .االستمرار في المثال السابق ،إذا كان الكاتب يريد أن تجد كل من االحوال ومواقفهم في
:على النحو التالي)( finditerبعض النصوص ،فإنها تستخدم
>>>
">>> text = "He was carefully disguised but captured quickly by police.
07-16: carefully
40-47: quickly
يحافظ على التعابير العادية .بدونها ،كل شرطة مائلة للخلف ( )'\' في تعبير عادي يجب أن تكون )" ( r"textتدوين السلسلة الخام
:مسبوقة بواحدة أخرى للهروب منها .على سبيل المثال ،سطرا الكود التاليان متطابقان وظيفيا ً
>>>
عندما يريد المرء مطابقة شرطة مائلة عكسية حرفية ،يجب تخطيه في التعبير العادي .مع تدوين السلسلة الخام ،هذا
:بدون تدوين السلسلة األولية ،يجب على المرء أن يستخدم ،"\\\\" مما يجعل سطور الكود التالية متطابقة وظيفيًا r"\\". يعني
>>>
أو الماسح الضوئي بتحليل سلسلة لتصنيف مجموعات األحرف .هذه خطوة أولى مفيدة في كتابة المترجم أو tokenizerيقوم جهاز
.المترجم الفوري
Pg. 306
تتمثل الطريقة في دمج هذه العناصر في تعبير عادي رئيسي واحد وتكرار .يتم تحديد فئات النص باستخدام التعبيرات العادية
التطابقات المتتالية:
import re
class Token(NamedTuple):
type: str
value: str
line: int
column: int
def tokenize(code):
token_specification = [
line_num = 1
line_start = 0
kind = mo.lastgroup
value = mo.group()
if kind == 'NUMBER':
Pg. 307
value = float(value) if '.' in value else int(value)
kind = value
line_start = mo.end()
line_num += 1
continue
continue
statements = '''
IF quantity THEN
ENDIF;
'''
print(token)
Pg. 308
)Token(type='OP', value='*', line=3, column=31
الجمعة 09
الطبعة الثالثة من الكتاب لم تعد تغطي لغة ، O'Reilly Media ، 2009.فريدل ،جيفري .إتقان التعبيرات العادية .الطبعة الثالثة
.على اإلطالق ،لكن الطبعة األولى غطت كتابة أنماط التعبير المنتظم الجيدة بتفصيل كبير Python
توفر هذه الوحدة فئات ووظائف لمقارنة التسلسالت .يمكن استخدامه على سبيل المثال ،لمقارنة الملفات ،ويمكن أن ينتج معلومات
والسياق والفوارق الموحدة .لمقارنة الدالئل والملفات ،انظر HTMLحول اختالفات الملفات في تنسيقات مختلفة ،بما في ذلك
.الوحدة النمطية filecmpأيضًا
difflib.SequenceMatcherصف دراسي
هذه فئة مرنة لمقارنة أزواج التسلسالت من أي نوع ،طالما أن عناصر التسلسل قابلة للتجزئة . تسبق الخوارزمية األساسية
خوارزمية تم نشرها في أواخر الثمانينيات من قبل راتكليف وأوبرشيلب تحت االسم الزائدي "مطابقة نمط الجشطالت" ، Lوهي أكثر
روعة من خوارزمية .والفكرة هي العثور على أطول نتيجة مطابقة متجاورة ال تحتوي على عناصر "خردة" ؛ هذه العناصر "غير
يعتبر التعامل مع البريد غير (. المرغوب فيها" هي تلك العناصر غير المهمة إلى حد ما ،مثل األسطر الفارغة أو المسافات البيضاء
ثم يتم تطبيق نفس الفكرة بشكل متكرر على قطع التسلسالت Lالموجودة ) Obershelp.و Ratcliffالمرغوب فيه امتدا ًدا لخوارزمية
على يسار ويمين التسلسالت الالحقة المطابقة .ال ينتج عن هذا الحد األدنى من تسلسالت التحرير ،ولكنه ينتج عنه مطابقات "تبدو
.مناسبة" لألشخاص
األساسية Lهي الوقت المكعب في أسوأ الحاالت والوقت التربيعي في الحالة Ratcliff-Obershelpالتوقيت :خوارزمية
هو وقت تربيعي ألسوأ حالة وله سلوك متو ّقع يعتمد بطريقة معقدة على عدد العناصر المشتركة بين. SequenceMatcherالمتوقعة
.التسلسالت ؛ أفضل وقت خطي
يدعم االستدالل الذي يتعامل تلقائيًا مع عناصر تسلسل : SequenceMatcher االستدالل التلقائي للمخلفات غير المرغوب فيه
معينة على أنها غير مهمة .يحسب االستدالل عدد المرات التي يظهر فيها كل عنصر فردي في التسلسل .إذا كانت تكرارات عنصر
ما (بعد العنصر األول) تمثل أكثر من ٪1من التسلسل وكان التسلسل بطول 200عنصر على األقل ،فسيتم تمييز هذا العنصر على
autojunkأنه "شائع" ويتم التعامل معه على أنه غير هام لغرض مطابقة التسلسل .يمكن إيقاف هذا االستدالل عن طريق تعيين
SequenceMatcher.عند إنشاء Falseالحجة
Pg. 309
difflib.Differفئة
هذه فئة لمقارنة تسلسالت سطور النص ،وإنتاج اختالفات أو دلتا يمكن قراءتها من قبل اإلنسان .استخدامات
.لمقارنة تسلسل السطور ،ولمقارنة تسلسل األحرف داخل أسطر متشابهة (شبه مطابقة) SequenceMatcher مختلفة
الشفرة المعنى
الخطوط التي تبدأ بـ "? محاولة لتوجيه العين إلى االختالفات الداخلية ،ولم تكن موجودة في أي من تسلسل اإلدخال .يمكن أن تكون
.هذه األسطر محيرة إذا كانت التسلسالت تحتوي على أحرف جدولة
difflib.HtmlDiffفئة
يعرض مقارنة النص جنبًا إلى جنب )كامل يحتوي على الجدول HTMLأو ملف( HTMLيمكن استخدام هذه الفئة إلنشاء جدول
.وسطرً ا بسطر مع تمييزات التغيير بين السطور وداخل السطر .يمكن إنشاء الجدول إما في وضع االختالف الكامل أو السياقي
حيث ال يتم Noneهي كلمة أساسية اختيارية لتحديد رقم العمود حيث يتم تقسيم األسطر وتغليفها ،وافتراضياتwrapcolumn
.التفاف األسطر
كامل يحتوي على جدول يعرض االختالفات HTMLويعيد سلسلة عبارة عن ملف )قوائم السالسل( tolines و fromlines يقارن
.سطراً بسطر مع تمييز التغييرات بين السطور وداخل السطر
وسيطات أساسية اختيارية للتحديد من /إلى سالسل رأس عمود الملف (كالهما افتراضي لسلسلة todesc و fromdesc تعد
.فارغة)
Pg. 310
استخدام االرتباطات التشعبية "التالية" (قد يتسبب اإلعداد على الصفر في أن تضع االرتباطات التشعبية "التالية" االختالف التالي في
.الجزء العلوي من المتصفح بدون أي سياق رئيسي )
ملحوظة
لم يتم تجاوزه ويجب تخطيهما بشكل صحيح أثناء تلقي مدخالت من مصادر HTMLعلى أنهما todesc و fromdesc يتم تفسير
.غير موثوق بها
تم تغيير مجموعة األحرف االفتراضية لمستند charset . تم التغيير في اإلصدار :3.5تمت إضافة وسيطة الكلمات Lاألساسية فقط
'utf-8'.إلى' 'ISO-8859-1من HTML
كامل يعرض االختالفات Lسطراً بسطر مع HTMLويعيد سلسلة عبارة عن جدول )قوائم السالسل( tolines و fromlines يقارن
.تمييز التغييرات بين السطور وداخل السطر
.هي واجهة سطر أوامر لهذه الفئة وتحتوي على مثال جيد الستخدامهاTools/scripts/diff.py L
.قارن أ و ب( قوائم السالسل) ؛ إرجاع دلتا ( مولد يولد خطوط دلتا) في تنسيق فرق السياق
تعد االختالفات في السياق طريقة مضغوطة إلظهار الخطوط التي تغيرت فقط باإلضافة إلى بضعة أسطر من السياق .تظهر
.والذي يتم تعيينه افتراضيًا إلى ثالثة n التغييرات بأسلوب قبل /بعد .يتم تعيين عدد سطور السياق بواسطة
بشكل افتراضي ،يتم إنشاء خطوط التحكم في الفروق (تلك التي تحتوي على*** أو )--- بسطر جديد الحق .هذا مفيد بحيث تكون
)( io.IOBase.writelinesالنتيجة في االختالفات المناسبة لالستخدام مع)( io.IOBase.readlinesالمدخالت Lالتي تم إنشاؤها من
.كل من المدخالت والمخرجات Lلها خطوط جديدة الحقة
على"" بحيث يكون اإلخراج خاليًا من السطر lineterm بالنسبة للمدخالت التي ال تحتوي على أسطر جديدة الحقة ،اضبط وسيطة
.الجديد بشكل موحد
يحتوي تنسيق فرق السياق عاد ًة على رأس ألسماء الملفات وأوقات التعديل .يمكن تحديد أي من هذه العناصر أو جميعها باستخدام
إذا لم ISO 8601. عادة ما يتم التعبير عن أوقات التعديل بتنسيق tofiledate . و fromfiledate و tofile و fromfile سالسل لـ
.يتم تحديدها ،فإن السالسل افتراضية إلى الفراغات
>>>
*** before.py
--- after.py
***************
! bacon
Pg. 311
! eggs
! ham
guido
! python
! eggy
! hamster
guido
.راجع واجهة سطر أوامر للنسخة للحصول على مثال أكثر تفصيالً
قم بإرجاع قائمة بأفضل التطابقات "جيدة بما يكفي" .الكلمة هي تسلسل مطلوب من أجله التطابقات القريبة (عاد ًة سلسلة
.نصية) ،واإلمكانيات هي قائمة من التسلسالت Lالتي يمكن مطابقة الكلمة على أساسها( Lعاد ًة قائمة من السالسل)
.أكبر من n 0 هي الحد األقصى لعدد المطابقات القريبة التي يمكن إرجاعها ؛ يجب أن يكون )افتراضيًا n (3 الوسيطة االختيارية
قطع الوسيطة االختياري( افتراضي )0.6 هو عدد عشري في النطاق [ .]1 ، 0يتم تجاهل االحتماالت التي ال تسجل على األقل تلك
.المشابهة Lللكلمة
.من التطابقات من بين االحتماالت في قائمة ، Lمرتبة حسب Lدرجة التشابه ،واألكثر تشابهًا أوالً ) n ليس أكثر من( يتم إرجاع أفضل
>>>
]'['apple', 'ape
]'['while
][
]'['except
دالة تقبل وسيطة سلسلة واحدة ،وتعيد صحيحً ا إذا كانت السلسلة غير مهمة ، Lأو خطأ إذا لم تكن كذلك .االفتراضي linejunk :
ضا وظيفة على مستوى الوحدة النمطية None. هو والتي تقوم بتصفية األسطر بدون أحرف مرئية IS_LINE_JUNK()، ،هناك أي ً
الفئة األساسية بإجراء تحليل ديناميكي SequenceMatcherباستثناء حرف واحد على األكثر رطل ( - )'#' ومع ذلك ،تقوم
.لألسطر التي تكون متكررة ج ًد ا لتشكيل ضوضاء ،وهذا عادة ما ينجح أفضل من استخدام هذه الوظيفة
Pg. 312
charjunk : الوظيفة االفتراضية . أو خطأ إذا لم يكن كذلك، و ُت رجع إذا كان الحرف غير هام، )1 دالة تقبل حر ًفا (سلسلة طولها
هي وظيفة على مستوى الوحدة النمطية IS_CHARACTER_JUNK()، والتي تقوم بتصفية أحرف المسافات البيضاء (فارغة أو
ً
)!جديدا في هذا عالمة تبويب ؛ إنها فكرة سيئة أن تتضمن سطرً ا.
>>>
... 'ore\ntree\nemu\n'.splitlines(keepends=True))
- one
? ^
+ ore
? ^
- two
- three
? -
+ tree
+ emu
difflib.restore( الذي ، تسلسل )
إنتاجه بواسطة تسلسل تم بالنظر إلى Differ.compare()أو ndiff()، 2 أو1 قم باستخراج األسطر الناشئة من الملف
وإزالة بادئات السطر، ) التي (المعلمة.
مثال:
>>>
... 'ore\ntree\nemu\n'.splitlines(keepends=True))
one
two
three
ore
Pg. 313
tree
emu
.قارن أ و ب( قوائم السالسل) ؛ إرجاع دلتا ( مولد يولد خطوط دلتا) بتنسيق فرق موحد
تعد االختالفات الموحدة طريقة مضغوطة إلظهار الخطوط التي تغيرت فقط باإلضافة إلى بضعة أسطر من السياق .تظهر التغييرات
.والذي يتم تعيينه افتراضيًا إلى ثالثة n بأسلوب مضمّن (بدالً من الكتل المنفصلة قبل /بعد) .يتم تعيين عدد سطور السياق بواسطة
افتراضيا ،خطوط السيطرة فرق (أولئك مع+++ ،--- أو )@@ يتم إنشاؤها مع السطر الجديد زائدة .هذا مفيد بحيث تكون
)( io.IOBase.writelinesالنتيجة في االختالفات المناسبة لالستخدام مع)( io.IOBase.readlinesالمدخالت Lالتي تم إنشاؤها من
.كل من المدخالت والمخرجات Lلها خطوط جديدة الحقة
على"" بحيث يكون اإلخراج خاليًا من السطر lineterm بالنسبة للمدخالت التي ال تحتوي على أسطر جديدة الحقة ،اضبط وسيطة
.الجديد بشكل موحد
يحتوي تنسيق فرق السياق عاد ًة على رأس ألسماء الملفات وأوقات التعديل .يمكن تحديد أي من هذه العناصر أو جميعها باستخدام
إذا لم ISO 8601. عادة ما يتم التعبير عن أوقات التعديل بتنسيق tofiledate . و fromfiledate و tofile و fromfile سالسل لـ
.يتم تحديدها ،فإن السالسل افتراضية إلى الفراغات
>>>
--- before.py
+++ after.py
-bacon
-eggs
-ham
+python
+eggy
+hamster
guido
.راجع واجهة سطر أوامر للنسخة للحصول على مثال أكثر تفصيالً
Pg. 314
عبارة عن كائنات بايت n يسمح لك بمقارنة البيانات بترميز غير معروف أو غير متسق .يجب أن تكون جميع المدخالت Lباستثناء
مرة dfunc واستدعاء . يتم تحويل ناتج str ،إلى ) n باستثناء( يعمل عن طريق تحويل جميع المدخالت بدون خسارة str. وليس
أخرى إلى بايت ،وبالتالي فإن خطوط دلتا التي تتلقاها لها نفس الترميزات غير المعروفة /غير المتناسقة
) b .dfunc(a, b, fromfile, tofile, fromfiledate, tofiledate, n, linetermو a مثل
) خط difflib.IS_LINE_JUNK(
للخطوط الجاهلة .خط خط هو تجاهلها إذا خط فارغ أو يحتوي على واحد ،'#' وإال فإنه ليس تجاهلها .يُستخدم كخيار Trueالعودة
.اإلصدارات األقدم)( ndiffفي linejunk افتراضي للمعلمة
) الفصل difflib.IS_CHARACTER_JUNK(
مسافة أو عالمة تبويب ،وإال فإنه ال يمكن ch إذا كان ch لألحرف التي يمكن تجاهلها .يمكن تجاهل الحرف Trueالعودة
ndiff().في charjunk تجاهله .يتم استخدامه كخيار افتراضي للمعلمة
أنظر أيضا
مطابقة األنماط :نهج الجشطالت
.مناقشة Lخوارزمية مماثلة بواسطة جون دبليو راتكليف و دي ميتزينرُ .نشر هذا في مجلة دكتور دوب في يوليو 1988 ،
SequenceMatcher كائنات
إذا وفقط trueأو دالة ذات وسيطة واحدة تأخذ عنصر تسلسل وتعيد )االفتراضي( isjunkNone يجب أن تكون الوسيطة االختيارية
يعادل التمرير ؛ بمعنى آخر ،ال يتم تجاهل أي isjunk أجل Noneإذا كان العنصر "غير هام" ويجب تجاهله .التمرير من
:lambda x: Falseعناصر .على سبيل المثال ،قم بتمرير
.إذا كنت تقارن األسطر كتسلسل من األحرف ،وال تريد المزامنة في الفراغات أو عالمات التبويب الصلبة
عبارة عن تسلسالت يجب مقارنتها ؛ كالهما افتراضي لسالسل فارغة .يجب أن تكون عناصر كال b و a الوسيطات االختيارية
.التسلسلين قابلة للتجزئة
) أ ، ب set_seqs(
Pg. 315
يحسب ويخزن معلومات مفصلة حول التسلسل الثاني ،لذلك إذا كنت تريد مقارنة تسلسل واحد مقابل العديد SequenceMatcher
بشكل متكرر ،مرة )( set_seq1لتعيين التسلسل الشائع االستخدام مرة واحدة واستدعاء)( set_seq2من التسلسالت ،فاستخدمL
.واحدة لكل من التسلسالت Lاألخرى
) أ set_seq1(
) ب set_seq2(
>>>
فسيتم أوالً تحديد أطول كتلة مطابقة على النحو الوارد أعاله ،ولكن مع التقييد اإلضافي الذي ال يظهر فيه أي isjunk ، إذا تم توفير
عنصر غير هام في الكتلة .ثم يتم تمديد تلك الكتلة إلى أقصى حد ممكن عن طريق مطابقة (فقط) العناصر غير المرغوب فيها على
كال الجانبين .لذا فإن الكتلة الناتجة ال تتطابق أب ًد ا مع البريد غير المرغوب فيه باستثناء وجود خردة متطابقة مجاورة لمباراة مثيرة
.لالهتمام
إليك نفس المثال السابق ،ولكن اعتبار الفراغات خردة .يمنع ذلك من مطابقة الطرف الخلفي للتسلسل الثاني مباشرة .بدالً من
':' abcd'' abcd''abcd''abcdذلك ،يمكن أن تتطابق فقط وتتطابق مع أقصى اليسار في التسلسل الثاني
>>>
)(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.get_matching_blocks
)(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
'
>>>
">>> a = "qabxcd
">>> b = "abycdf
) نget_grouped_opcodes( 3 =
Pg. 317
.من أسطر السياق n قم بإرجاع منشئ المجموعات مع ما يصل إلى
تقسم هذه الطريقة مجموعات التغيير األصغر وتزيل النطاقات 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هذه الحالة قد ترغب في المحاولة
ملحوظة
>>>
0.25
0.5
)(quick_ratio
)(real_quick_ratio
الطرق الثالثة التي ترجع نسبة مطابقة لمجموع األحرف يمكن أن تعطي نتائج مختلفة نظرا لمستويات تقريب مختلفة ،على الرغم
ratio():دائما ما ال يقل عن قدر كبير)( real_quick_ratioو)( quick_ratioمن
>>>
)(>>> s.ratio
0.75
)(>>> s.quick_ratio
0.75
)(>>> s.real_quick_ratio
1.0
SequenceMatcher أمثلة على
Pg. 318
":يقارن هذا المثال بين سلسلتين ،مع اعتبار الفراغات "غير مهمة
>>>
تعني القيمة التي تزيد عن 0.6أن )( ، ratioإرجاع عدد عشري في [ ، ]1 ، 0لقياس تشابه المتواليات .كقاعدة عامة)(ratio
:التسلسالت متطابقة متقاربة
>>>
0.866
>>>
هي دائمًا مجموعة وهمية ،وهذه هي الحالة الوحيدة التي يكون )( get_matching_blocksالحظ أن آخر مجموعة تم إرجاعها
.(len(a), len(b), 0)0فيها آخر عنصر مجموعة (عدد العناصر المطابقة)
get_opcodes():إذا كنت تريد معرفة كيفية تغيير التسلسل األول إلى الثاني ،فاستخدمL
>>>
أنظر أيضا
يمكن SequenceMatcherظيفة في هذه الوحدة التي تبين مدى بساطة قانون البناء على)( get_close_matchesو
.استخدامها للقيام بعمل مفيد
كائنات مختلفة
Pg. 319
تجعل تعلن أي جهة على أن يكون الحد األدنى بيانات االختالف .على العكس من ذلك ،غالبًا ما -generatedدلتا Differعلما بأن
تكون الفروق الدنيا غير بديهية ،ألنها تتزامن في أي مكان ممكن ،وأحيا ًنا تتطابق عرضيًا مع 100صفحة على حدة .تقييد نقاط
.التزامن على المطابقات المتجاورة يحافظ على بعض فكرة الموقع ،على حساب تكلفة عرضية إلنتاج فرق أطول
مما يعني أنه ال None،دالة تقبل وسيطة سلسلة واحدة وترجع صحيحً ا إذا كانت السلسلة غير مهمة .االفتراضي هو linejunk :
.يوجد خط يعتبر غير هام
دالة تقبل وسيطة ذات حرف واحد (سلسلة طولها ، )1و ُترجع صحيحً ا إذا كان الحرف غير هام .االفتراضي charjunk :
.مما يعني أنه ال يتم اعتبار أي حرف غير هام None،هو
تعمل وظائف تصفية البريد غير الهام هذه على تسريع المطابقة للعثور على االختالفات وال تتسبب في تجاهل أي سطور أو أحرف
.معلمة تفسيرا لذلك isjunk طريقة ل)( find_longest_matchمختلفة .قراءة وصف
) أ ، ب compare(
يجب أن يحتوي كل تسلسل على سالسل فردية من سطر واحد تنتهي بأسطر جديدة .يمكن الحصول على مثل هذه التسلسالت
طريقة الكائنات التي تشبه الملفات .تتكون الدلتا التي تم إنشاؤها أيضً ا من سالسل منتهية بالسطر الجديد ،جاهزة )( readlinesمن
.طريقة كائن يشبه الملف)( writelinesللطباعة كما هي عبر
مثال مختلف
يمكن أيضًا ( هذا المثال يقارن بين نصين .أوالً قمنا بإعداد النصوص ،تسلسل سالسل فردية من سطر واحد تنتهي بخطوط جديدة
):طريقة الكائنات التي تشبه الملفات)( readlinesالحصول على مثل هذه التسلسالت من
>>>
)... '''.splitlines(keepends=True
)>>> len(text1
4
]>>> text1[0][-1
''\n
Pg. 320
... 5. Flat is better than nested.
... '''.splitlines(keepends=True)
>>>
>>> d = Differ()
الحظ أنه عند إنشاء Differراجع ." قد نقوم بتمرير وظائف لتصفية السطر والحرف "غير المرغوب فيه، كائن Differ() المنشئ
للحصول على التفاصيل.
>>>
>>>
>>> pprint(result)
'? ++\n',
>>>
>>> sys.stdout.writelines(result)
Pg. 321
+ 3. Simple is better than complex.
? ++
? ^ ---- ^
? ++++ ^ ^
يوضح هذا المثال كيفية استخدامdifflib إلنشاء diffيتم تضمينه أيضً ا في توزيع مصدر . أداة مشابهةPython ،
مثل Tools/scripts/diff.py.
#!/usr/bin/env python3
"""
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,
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)
fromlines = ff.readlines()
tolines = tf.readlines()
if options.u:
elif options.n:
elif options.m:
Pg. 323
)diff = difflib.HtmlDiff().make_file(fromlines,tolines,fromfile,tofile,context=options.c,numlines=n
else:
)sys.stdout.writelines(diff
)(main
الفئة التي يعمل كل عمل .إذا كنت تقوم فقط بلف أو ملء TextWrapper،توفر وحدة بعض وظائف الراحة ،وكذلك textwrapو
سلسلة نصية واحدة أو اثنتين ،فيجب أن تكون الوظائف المالئمة جيدة بما فيه الكفاية ؛ وإال ،يجب عليك استخدام مثيل
.أجل الكفاءة TextWrapperمن
التفاف الفقرة المفردة في نص( سلسلة) بحيث يكون طول كل سطر بأحرف عرض على األكثر . إرجاع قائمة بأسطر اإلخراج ،
.بدون أسطر جديدة نهائية
هو اختصار ل)(. fillالتفاف الفقرة المفردة في النص ، وإرجاع سلسلة واحدة تحتوي على الفقرة الملتفة
))"\n".join(wrap(text, ...
wrap().يقبل بالضبط نفس وسيطات الكلمات الرئيسية مثل)( ، fillعلى وجه الخصوص
.طي النص المحدد واقتطاعه ليالئم العرض المحدد
أوالً يتم طي المسافة البيضاء في النص( يتم استبدال كل المسافات بمسافات Lمفردة) .إذا كانت النتيجة تتناسب مع العرض ، يتم
placeholderإرجاعها .خالف ذلك ،يتم إسقاط عدد كافٍ من الكلمات من النهاية بحيث تكون الكلمات Lالمتبقية باإلضافة إلى
width:المالءمة Lالداخلية
>>>
Pg. 324
'!'Hello world
']'Hello [...
''Hello...
الموثقة أدناه .علما بأن وانهار بيضاء قبل أن يتم TextWrapper،تتوافق وسيطات الكلمات الرئيسية االختيارية مع سمات Lمثيل
تمرير النص إلى وظيفة ،لذلك تغيير قيمة ، ، ، و سيكون لها أي
.TextWrapper fill()tabsizeexpand_tabsdrop_whitespacereplace_whitespaceتأثير
) نص textwrap.dedent(
يمكن استخدام هذا لجعل السالسل الثالثية بين عالمات االقتباس تصطف مع الحافة اليسرى من الشاشة ،مع االستمرار في عرضها
.في الكود المصدري في شكل مسافة Lبادئة
الحظ أنه يتم التعامل مع عالمات الجدولة والمسافات Lعلى أنها مسافات بيضاء ،ولكنها ليست متساوية :األسطر وال يُنظر إليها على
"." hello""\thelloأنها تحتوي على مسافة بادئة مشتركة
.يتم تجاهل األسطر التي تحتوي على مسافة بيضاء فقط في اإلدخال وتسويتها إلى حرف سطر جديد واحد في اإلخراج
def test():
\''' = s
hello
world
'''
.بشكل افتراضي ،تتم إضافة البادئة إلى جميع األسطر التي ال تتكون فقط من مسافات بيضاء (بما في ذلك أي نهايات سطر)
>>>
Pg. 325
'' hello\n\n \n world
يمكن استخدام وسيطة المسند االختيارية للتحكم في األسطر التي تم وضع مسافة Lبادئة لها .على سبيل المثال ،من السهل
:إضافة بادئة حتى إلى األسطر الفارغة والمسافات البيضاء فقط
>>>
+ hello
+
+
+ world
المثال واستدعاء أسلوب واحد على ذلك .ال يتم إعادة استخدام TextWrapperالعمل عن طريق إنشاء)( shortenو)(wrap()، fill
قد يكون fill()،و /أو)( wrapهذا المثال ،لذلك بالنسبة للتطبيقات التي تعالج العديد من السالسل النصية باستخدام
.الكائن الخاص بك أكثر كفاءة TextWrapperإنشاء
يُفضل أن يُلف النص على مسافات Lبيضاء وبعد الواصالت مباشر ًة في الكلمات الموصولة ؛ عندها فقط سيتم كسر الكلمات الطويلة
.يتم ضبطها على خطأ TextWrapper.break_long_wordsإذا لزم األمر ،ما لم
textwrap.TextWrapper( ** kwargs ) فئة
منشئ يقبل عددا من الحجج الكلمة اختيارية .تتوافق كل وسيطة كلمة رئيسية مع سمة مثيل ،على سبيل المثال TextWrapperو
بالضبط مثل
)(wrapper = TextWrapper
الكائن عدة مرات ،ويمكنك تغيير أي من خياراته من خالل التعيين المباشر لسمات TextWrapper Lيمكنك إعادة استخدام نفس
.المثيل بين االستخداماتL
:سمات Lسبيل المثال (والحجج الكلمة إلى منشئ) على النحو التالي TextWrapperو
width
70أقصى طول للخطوط الملفوفة .طالما ال توجد كلمات فردية في نص اإلدخال أطول من :) افتراضي(
.األحرف widthيضمن عدم وجود سطر إخراج أطول من width، TextWrapperذلك
expand_tabs
.طريقة النص )( expandtabsفسيتم توسيع كل أحرف الجدولة في النص إلى مسافات باستخدام true ، إذا كان:) Trueافتراضيًا(
tabsize
هذا صحيحً ا ،فسيتم توسيع كل أحرف الجدولة في النص إلى صفر أو مسافات أكثر ،اعتما ًدا 8 expand_tabsإذا كان:) افتراضيًا(
.على العمود الحالي وحجم عالمة التبويب المحدد
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." الخوارزمية في أنها غير قادرة على اكتشاف الفرق بين
و "بقعة" .في
.خطأ افتراضيًا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 افتراضيًا(
.نهاية اإلخراج
placeholder
:يوفر أيضً ا بعض الطرق العامة ،المشابهة Lلوظائف الراحة على مستوى الوحدةTextWrapper
) نص wrap(
األحرف .جميع خيارات االلتفاف widthالتفاف الفقرة المفردة في النص( سلسلة) بحيث يكون طول كل سطر على األكثر من
المثيل .إرجاع قائمة بأسطر اإلخراج ،بدون أسطر جديدة نهائية .إذا كان اإلخراج الملتف ال TextWrapperمأخوذة من سماتL
.يحتوي على محتوى ،فإن القائمة التي تم إرجاعها تكون فارغة
) نص fill(
.التفاف الفقرة المفردة في النص ، وإرجاع سلسلة واحدة تحتوي على الفقرة الملتفة
تم Unicode. التي تحدد خصائص األحرف لجميع أحرف ) Unicode (UCDتوفر هذه الوحدة الوصول إلى قاعدة بيانات أحرف
UCD .تجميع البيانات الواردة في قاعدة البيانات هذه من اإلصدار 13.0.0من
القياسي رقم " ، 44قاعدة بيانات أحرف Unicodeتستخدم الوحدة نفس األسماء Lوالرموز كما تم تعريفها بواسطة ملحق
:تحدد الوظائف التاليةUnicode" .
) االسم unicodedata.lookup(
ابحث عن الحرف باالسم .إذا تم العثور على حرف يحمل االسم المحدد ،فقم بإرجاع الحرف المقابل .إذا لم يتم العثور
.يتم رفعها ، KeyErrorعليها
] ) افتراضيunicodedata.name( chr [ ،
كسلسلة .إذا لم يتم تعريف أي اسم ،فسيتم إرجاع االفتراضي ، أو إذا لم يتم chr إرجاع االسم المخصص للحرف
.فسيتم رفعه ، ValueErrorتقديمه
] ) افتراضيunicodedata.decimal( chr [ ،
كعدد صحيح .إذا لم يتم تحديد مثل هذه القيمة ،يتم إرجاع القيمة االفتراضية ، أو إذا ُ chrترجع القيمة العشرية المخصصة للحرف
.يتم رفعها ، ValueErrorلم يتم تحديدها
Pg. 328
] ) افتراضيunicodedata.digit( chr [ ،
كعدد صحيح .إذا لم يتم تحديد مثل هذه القيمة ،يتم إرجاع القيمة االفتراضية ، أو إذا لم يتم ُ chrترجع قيمة الرقم المعينة للحرف
.يتم رفعها ، ValueErrorتحديدها
على هيئة عائم .إذا لم يتم تحديد مثل هذه القيمة ،يتم إرجاع القيمة االفتراضية ، أو إذا ُ chrترجع القيمة الرقمية المعينة إلى الحرف
.يتم رفعها ، ValueErrorلم يتم تحديدها
.كسلسلة .إذا لم يتم تحديد مثل هذه القيمة ،يتم إرجاع سلسلة فارغة chr ترجع الفئة ثنائية االتجاه المعينة إلى الحرف
.كعدد صحيحُ .ترجع0 إذا لم يتم تحديد فئة مدمجة ُ chrترجع فئة الدمج األساسية المعينة إلى الحرف
كعدد صحيحُ .ترجع1 إذا تم تحديد الحرف على أنه حرف "معكوس" في نص ُ chrترجع الخاصية المعكوسة Lالمعينة إلى الحرف
.ثنائي االتجاه 0 ،وإال
.كسلسلة .يتم إرجاع سلسلة فارغة في حالة عدم تحديد مثل هذا التعيينُ chr ترجع تعيين تحليل األحرف المعين إلى
"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للقارئ البشري ،إذا كانت إحداهما تحتوي على أحرف مجمعة واألخرى ال ،فقد
.ال تقارنان بالتساوي
Pg. 329
و " "NFDو " "NFKCو " "NFCفي شكل طبيعي شكل . القيم الصالحة للنموذج هي Unicode unistr عودة إذا كانت سلسلة
"NFKD".
unicodedata.unidata_version
unicodedata.ucd_3_2_0
بدالً من ذلك ،للتطبيقات التي Unicodeهذا كائن له نفس أساليب الوحدة بأكملها ،ولكنه يستخدم اإلصدار 3.2من قاعدة بيانات
IDNA).مثل( Unicodeتتطلب هذا اإلصدار المحدد من قاعدة بيانات
:أمثلة
>>>
'{'
)'>>> unicodedata.name('/
''SOLIDUS
)'>>> unicodedata.decimal('9
9
)'>>> unicodedata.decimal('a
''Lu
''AN
عند تحديد أشياء (مثل أسماء المضيف) في اإلنترنت ،غالبًا ما يكون من الضروري مقارنة هذه التعريفات من أجل "المساواة" .قد
تعتمد كيفية تنفيذ هذه المقارنة بالضبط على مجال التطبيق ،على سبيل المثال ما إذا كان يجب أن يكون غير حساس لحالة األحرف
".أم ال .قد يكون من الضروري أي ً
ض ا تقييد التعريفات المحتملة ،للسماح فقط بالتعريفات التي تتكون من أحرف "قابلة للطباعة
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(
) كود stringprep.map_table_b3(
).تعيين لطي الحالة المستخدم بدون تسوية( B.3قم بإرجاع القيمة المعينة للكود وف ًقا للجدول
) كود stringprep.in_table_c11(
) كود stringprep.in_table_c12(
) كود stringprep.in_table_c11_c12(
) كود stringprep.in_table_c21(
) كود stringprep.in_table_c22(
) كود stringprep.in_table_c21_c22(
) كود stringprep.in_table_c3(
Pg. 331
) كود stringprep.in_table_c4(
).نقاط الرموز غير المكونة من أحرف( C.4حدد ما إذا كان الرمز موجو ًدا في الجدول
) كود stringprep.in_table_c5(
) كود stringprep.in_table_c6(
) كود stringprep.in_table_c7(
) كود stringprep.in_table_c8(
) كود stringprep.in_table_c9(
) كود stringprep.in_table_d1(
"AL").أو " "Rأحرف ذات خاصية ثنائية االتجاه( D.1حدد ما إذا كان الكود موجو ًدا في الجدول
) كود stringprep.in_table_d2(
"L").أحرف ذات خاصية ثنائية االتجاه( D.2حدد ما إذا كان الكود موجو ًدا في الجدول
حدة تحدد عددا من الوظائف لتسهيل إنجاز والقراءة /الكتابة من ملفات التاريخ من مترجم بايثون .يمكن استخدام هذه 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
الملف
) سلسلة readline.parse_and_bind(
في المكتبة )( rl_read_init_fileاسم الملف االفتراضي هو اسم الملف األخير المستخدم .هذا يدعو readline. قم بتنفيذ ملف تهيئة
.األساسيةL
)(readline.get_line_buffer
) سلسلة readline.insert_text(
في المكتبة األساسية ،لكنه يتجاهل )( rl_insert_textأدخل النص في المخزن المؤقت للسطر عند موضع المؤشر .هذا يستدعي
.القيمة المعادة
)(readline.redisplay
في المكتبة )( rl_redisplayقم بتغيير ما يتم عرضه على الشاشة Lليعكس المحتويات الحالية لمخزن الخط المؤقت .هذا يدعو
.األساسيةL
ملف التاريخ
هذا ~/.history. وألحقه بقائمة المحفوظات .اسم الملف االفتراضي هو readline ،قم بتحميل ملف محفوظات
.في المكتبة األساسية)( read_historyيدعو
هذا ~/.history. احفظ قائمة المحفوظات في ملف محفوظات للقراءة ،واستبدل أي ملف موجود .اسم الملف االفتراضي هو
.في المكتبة األساسية)( write_historyيدعو
)(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.add_history(
.في المكتبة األساسية)( add_historyإلحاق سطر بمخزن المحفوظات المؤقت ،كما لو كان آخر سطر تمت كتابته .هذا يدعو
) تمكين readline.set_auto_history(
ل تمكين ينبغي أن يكون حجة قيمة منطقية readline. عند قراءة اإلدخال عبر)( add_historyتمكين أو تعطيل المكالمات Lالتلقائية
.أنه عندما صحيح ،وتمكن تاريخ السيارات ،وأنه عندما كاذبة ،تعطيل تاريخ السيارات
.يتم تمكين السجل التلقائي افتراضيًا ،وال تستمر التغييرات على هذا عبر جلسات متعددة 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التالي المحتمل بدءًا من النص
)(readline.get_completer
)(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
try:
readline.read_history_file(histfile)
readline.set_history_length(1000)
except FileNotFoundError:
pass
atexit.register(readline.write_history_file, histfile)
يتم تشغيل هذا الرمز تلقائيًا عند تشغيلPython الوضع التفاعلي في (تكوين انظرReadline ).
عن طريق إلحاق المحفوظات الجديدة فقط، يحقق المثال التالي نفس الهدف ولكنه يدعم الجلسات التفاعلية المتزامنة.
import atexit
import os
import readline
try:
readline.read_history_file(histfile)
h_len = readline.get_current_history_length()
except FileNotFoundError:
open(histfile, 'wb').close()
h_len = 0
new_h_len = readline.get_current_history_length()
readline.set_history_length(1000)
Pg. 336
import atexit
import code
import os
import readline
class HistoryConsole(code.InteractiveConsole):
histfile=os.path.expanduser("~/.console-history")):
self.init_history(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)
readline.set_history_length(1000)
readline.write_history_file(histfile)
و rlcompleterحدة تعرف وظيفة االنتهاء مناسبة ل readlineوحدة من خالل استكمال معرفات بيثون صالحة والكلمات الرئيسية.
عندما يتم استيراد هذه الوحدة على نظام أساسيUnix مع readline يتم إنشاء مثيل، توفر الوحدة النمطية Completer للفئة
تلقائيًا complete()ويتم تعيين طريقتها readlineكمكمل.
مثال:
>>>
Pg. 337
>>> import rlcompleter
__readline.__name (readline.parse_and_bind
>>> readline.
الخيار ،يتم استيراد الوحدة -Sمع Pythonتم تصميم وحدة لالستخدام مع بايثون طريقة تفاعلية . ما لم يتم تشغيل rlcompleterو
Readline ).انظر تكوين( وتكوينها تلقائيًا
ال يزال من الممكن استخدام الفئة المحددة بواسطة هذه الوحدة لألغراض readline، Completerعلى األنظمة األساسية بدون
.المخصصة
استكمال الكائنات
) نص ، حالة Completer.complete(
.قم بإرجاع حالة اإلكمال للنص
__main__، builtinsإذا تم استدعاؤه للنص الذي ال يتضمن حرف نقطة ( ، )'.' فسيتم إكماله من األسماء المحددة حاليًا في
).الوحدة النمطية keywordكما هو محدد بواسطة( والكلمات الرئيسية
لن يتم تقييم الوظائف ،ولكن يمكنه إنشاء مكالمات ( إذا تم استدعاؤه السم منقط ،فسيحاول تقييم أي شيء بدون آثار جانبية واضحة
الوظيفة .يتم ضبط أي استثناء يُثار أثناء تقييم )( dirحتى الجزء األخير ،والعثور على مطابقات للباقي عبر ))(__ __getattrإلى
.وإعادته Noneالتعبير وإسكاته
توفر الوحدات الموصوفة في هذا الفصل بعض عمليات الخدمات األساسية Lلمعالجة البيانات الثنائية .العمليات األخرى على البيانات
.الثنائية ،خاصة فيما يتعلق بتنسيقات الملفات وبروتوكوالت الشبكة ،موصوفة في األقسام ذات الصلة
في أنواع التسلسل الثنائي -بايت ،بايت Python ،باإلضافة إلى ذلك ،راجع الوثائق الخاصة بأنواع البيانات الثنائية المضمنة في
.عرض الذاكرة
Pg. 338