اشیاء ماژول¶
-
PyTypeObject PyModule_Type¶
- قسمتی از ABI پایدار.
این نمونه از
PyTypeObjectمعرف نوع ماژول پایتون است. این نوع به برنامههای پایتون بهصورتtypes.ModuleTypeارائه میشود.
-
int PyModule_Check(PyObject *p)¶
اگر p یک شیء ماژول یا زیرنوعی از یک شیء ماژول باشد، مقدار true برمیگرداند. این تابع همیشه موفق میشود.
-
int PyModule_CheckExact(PyObject *p)¶
اگر p یک شیء ماژول باشد، اما زیرنوعی از
PyModule_Typeنباشد، مقدار درست را برمیگرداند. این تابع همیشه با موفقیت اجرا میشود.
-
PyObject *PyModule_NewObject(PyObject *name)¶
- مقدار بازگشتی: مرجع جدید. قسمتی از ABI پایدار از نسخهی 3.7.
یک شیء ماژول جدید با
module.__name__تنظیمشده بر name برمیگرداند. ویژگیهای__name__،__doc__،__package__و__loader__ماژول پر میشوند (همه بهجز__name__برNoneتنظیم میشوند). تنظیم ویژگی__file__بر عهدهی فراخواننده است.در صورت خطا،
NULLبه همراه استثنای تنظیمشده برمیگرداند.اضافه شده در نسخهی 3.3.
تغییر یافته در نسخهی 3.4:
__package__و__loader__اکنون بهNoneتنظیم میشوند.
-
PyObject *PyModule_New(const char *name)¶
- مقدار بازگشتی: مرجع جدید. قسمتی از ABI پایدار.
مشابه
PyModule_NewObject()، اما نام به جای یک شیء یونیکد، یک رشته کدگذاریشده با UTF-8 است.
-
PyObject *PyModule_GetDict(PyObject *module)¶
- مقدار بازگشتی: مرجع امانتی. قسمتی از ABI پایدار.
شیء دیکشنریای را که فضای نام module را پیادهسازی میکند برمیگرداند؛ این شیء همان ویژگی
__dict__شیء ماژول است. اگر module یک شیء ماژول (یا زیرنوعی از شیء ماژول) نباشد،SystemErrorبرخاسته میشود وNULLبازگردانده میشود.توصیه میشود ماژولهای توسعهای بهجای دستکاری مستقیم
__dict__یک ماژول، از سایر توابعPyModule_*وPyObject_*استفاده کنند.ارجاع بازگرداندهشده، ارجاعی امانتی از ماژول است؛ این ارجاع تا زمانی که ماژول نابود شود معتبر است.
-
PyObject *PyModule_GetNameObject(PyObject *module)¶
- مقدار بازگشتی: مرجع جدید. قسمتی از ABI پایدار از نسخهی 3.7.
مقدار
__name__module را برمیگرداند. اگر ماژول آن را ارائه نکند یا اگر رشته نباشد، استثنایSystemErrorمطرح میشود وNULLبرگردانده میشود.اضافه شده در نسخهی 3.3.
-
const char *PyModule_GetName(PyObject *module)¶
- قسمتی از ABI پایدار.
مشابه
PyModule_GetNameObject()است، اما نام را با کدگذاری'utf-8'برمیگرداند.بافر بازگشتی تنها تا زمانی معتبر است که نام ماژول تغییر کند یا ماژول نابود شود. توجه داشته باشید که کد پایتون میتواند نام یک ماژول را با تنظیم ویژگی
__name__آن تغییر دهد.
-
PyModuleDef *PyModule_GetDef(PyObject *module)¶
- قسمتی از ABI پایدار.
اشارهگر به ساختار
PyModuleDefکه ماژول از آن ایجاد شده است را برمیگرداند، یاNULLاگر ماژول از یک تعریف ایجاد نشده باشد.در صورت خطا،
NULLرا همراه با استثنای تنظیمشده برگردانید. ازPyErr_Occurred()برای تمایز این حالت از نبودPyModuleDefاستفاده کنید.
-
PyObject *PyModule_GetFilenameObject(PyObject *module)¶
- مقدار بازگشتی: مرجع جدید. قسمتی از ABI پایدار.
نام پروندهای را که module از آن بارگذاری شده است، با استفاده از ویژگی
__file__مربوط به module برمیگرداند. اگر این ویژگی تعریف نشده باشد یا رشته نباشد، استثنایSystemErrorرا مطرح میکند وNULLبرمیگرداند؛ در غیر این صورت، ارجاعی به یک شیء یونیکد برمیگرداند.اضافه شده در نسخهی 3.2.
-
const char *PyModule_GetFilename(PyObject *module)¶
- قسمتی از ABI پایدار.
مشابه
PyModule_GetFilenameObject()است، اما نام پرونده را با کدگذاری 'utf-8' برمیگرداند.بافر بازگشتی تنها تا زمانی معتبر است که ویژگی
__file__ماژول دوباره مقداردهی شود یا ماژول نابود شود.PyModule_GetFilename()برای نامهای پروندهی غیرقابل کدگذاری، استثنایUnicodeEncodeErrorرا مطرح میکند؛ بهجای آن ازPyModule_GetFilenameObject()استفاده کنید.
Module definition¶
Modules created using the C API are typically defined using an
array of PySlot structs, which provides a "description" of how a
module should be created.
See Definition slots for more information on slots in general.
تغییر یافته در نسخهی 3.15: Previously, a PyModuleDef struct was necessary to define modules.
The older way of defining modules is still available: consult either the
Module definition struct section or earlier versions of this documentation
if you plan to support earlier Python versions.
The slots array is usually used to define an extension module's “main” module object (see تعریف ماژولهای توسعهای for details). It can also be used to create extension modules dynamically.
Unless specified otherwise, the same slot ID may not be repeated in an array of slots.
Metadata slots¶
-
Py_mod_name¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Slot IDfor the name of the new module, as a NUL-terminated UTF8-encodedconst char *.Note that modules are typically created using a
ModuleSpec, and when they are, the name from the spec will be used instead ofPy_mod_name. However, it is still recommended to include this slot for introspection and debugging purposes.اضافه شده در نسخهی 3.15: Use
PyModuleDef.m_nameinstead to support previous versions.
-
Py_mod_doc¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Slot IDfor the docstring of the new module, as a NUL-terminated UTF8-encodedconst char *.Usually it is set to a variable created with
PyDoc_STRVAR.اضافه شده در نسخهی 3.15: Use
PyModuleDef.m_docinstead to support previous versions.
Feature slots¶
-
Py_mod_abi¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Slot IDwhose value points to aPyABIInfostructure describing the ABI that the extension is using.A suitable
PyABIInfovariable can be defined using thePyABIInfo_VARmacro, as in:PyABIInfo_VAR(abi_info); static PySlot mymodule_slots[] = { PySlot_DATA(Py_mod_abi, &abi_info), ... };
When creating a module, Python checks the value of this slot using
PyABIInfo_Check().This slot is required, except for modules created from
PyModuleDef.اضافه شده در نسخهی 3.15.
-
Py_mod_multiple_interpreters¶
- قسمتی از ABI پایدار از نسخهی 3.12.
Slot IDwhose value is one of:-
Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED¶
این ماژول از ایمپورت شدن در زیرمفسرها (subinterpreters) پشتیبانی نمیکند.
-
Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED¶
این ماژول از ایمپورت شدن در زیرمفسرها پشتیبانی میکند، اما تنها زمانی که آنها قفل مفسر سراسری (GIL) مفسر اصلی را به اشتراک بگذارند. (به جداسازی ماژولهای توسعه مراجعه کنید.)
-
Py_MOD_PER_INTERPRETER_GIL_SUPPORTED¶
این ماژول از ایمپورت شدن در زیرمفسرها پشتیبانی میکند، حتی زمانی که آنها قفل مفسر سراسری خود را دارند. (به جداسازی ماژولهای توسعه مراجعه کنید.)
این جایگاه تعیین میکند که آیا ایمپورت کردن این ماژول در یک زیرمفسر شکست میخورد یا خیر.
اگر
Py_mod_multiple_interpretersمشخص نشده باشد، سازوکار ایمپورت بهصورت پیشفرض ازPy_MOD_MULTIPLE_INTERPRETERS_SUPPORTEDاستفاده میکند.For historical reasons, the values are declared as pointers (
void *). When usingPySlotarrays, usePySlot_DATAforPy_mod_multiple_interpreters:PySlot_DATA(Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED)
اضافه شده در نسخهی 3.12.
-
Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED¶
-
Py_mod_gil¶
- قسمتی از ABI پایدار از نسخهی 3.13.
Slot IDwhose value is one of:-
Py_MOD_GIL_USED¶
این ماژول به وجود قفل مفسر سراسری (GIL) وابسته است و ممکن است بدون همگامسازی به وضعیت سراسری دسترسی داشته باشد.
-
Py_MOD_GIL_NOT_USED¶
اجرای این ماژول بدون قفل مفسر سراسریِ فعال، ایمن است.
این جایگاه توسط ساختهای پایتون که با
--disable-gilپیکربندی نشدهاند نادیده گرفته میشود. در غیر این صورت، تعیین میکند که آیا ایمپورت کردن این ماژول باعث میشود قفل مفسر سراسری (GIL) بهطور خودکار فعال شود یا خیر. برای جزئیات بیشتر به سیپایتون نخآزاد مراجعه کنید.اگر
Py_mod_gilمشخص نشده باشد، سازوکار ایمپورت بهطور پیشفرض ازPy_MOD_GIL_USEDاستفاده میکند.For historical reasons, the values are declared as pointers (
void *). When usingPySlotarrays, usePySlot_DATAforPy_mod_gil:PySlot_DATA(Py_mod_gil, Py_MOD_GIL_NOT_USED)
اضافه شده در نسخهی 3.13.
-
Py_MOD_GIL_USED¶
Creation and initialization slots¶
-
Py_mod_create¶
- قسمتی از ABI پایدار از نسخهی 3.5.
Slot IDfor a function that creates the module object itself. The function must have the signature:-
PyObject *create_module(PyObject *spec, PyModuleDef *def)¶
The function will be called with:
spec: a
ModuleSpec-like object, meaning that any attributes defined forimportlib.machinery.ModuleSpechave matching semantics. However, any of the attributes may be missing.def:
NULL, or the module definition if the module is created from one.
The function should return a new module object, or set an error and return
NULL.این تابع باید در حداقل ممکن نگه داشته شود. بهویژه، نباید کد دلخواه پایتون را فراخوانی کند، زیرا تلاش برای ایمپورت کردن مجدد همان ماژول ممکن است به حلقه بینهایت منجر شود.
اگر
Py_mod_createمشخص نشده باشد، مکانیزم ایمپورت با استفاده ازPyModule_New()یک شیء ماژول معمولی ایجاد میکند. نام از مشخصه گرفته میشود، نه از تعریف، تا ماژولهای توسعهای بتوانند بهطور پویا با جایگاه خود در سلسلهمراتب ماژول سازگار شوند و از طریق پیوندهای نمادین با نامهای مختلف ایمپورت شوند، در حالی که همگی یک تعریف ماژول واحد را به اشتراک میگذارند.There is no requirement for the returned object to be an instance of
PyModule_Type. However, some slots may only be used withPyModule_Typeinstances; in particular:module state slots (
Py_mod_state_*),
اضافه شده در نسخهی 3.5.
تغییر یافته در نسخهی 3.15: The slots argument may be a
ModuleSpec-like object, rather than a trueModuleSpecinstance. Note that previous versions of CPython did not enforce this.The def argument may now be
NULL, since modules are not necessarily made from definitions. -
PyObject *create_module(PyObject *spec, PyModuleDef *def)¶
-
Py_mod_exec¶
- قسمتی از ABI پایدار از نسخهی 3.5.
Slot IDfor a function that will execute, or initialize, the module. This function does the equivalent to executing the code of a Python module: typically, it adds classes and constants to the module. The signature of the function is:See the توابع پشتیبانی section for some useful functions to call.
For backwards compatibility, the
PyModuleDef.m_slotsarray may contain multiplePy_mod_execslots; these are processed in the order they appear in the array. Elsewhere (that is, in arguments toPyModule_FromSlotsAndSpec()and in return values ofPyModExport_<name>), repeating the slot is not allowed.اضافه شده در نسخهی 3.5.
تغییر یافته در نسخهی 3.15: Repeated
Py_mod_execslots are disallowed, except inPyModuleDef.m_slots.
-
Py_mod_methods¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Slot IDfor a table of module-level functions, as an array ofPyMethodDefvalues suitable as the functions argument toPyModule_AddFunctions().Like other slot IDs, a slots array may only contain one
Py_mod_methodsentry. To add functions from multiplePyMethodDefarrays, callPyModule_AddFunctions()in thePy_mod_execfunction.The table must be statically allocated (or otherwise guaranteed to outlive the module object).
اضافه شده در نسخهی 3.15: Use
PyModuleDef.m_methodsinstead to support previous versions.
Module state¶
Extension modules can have module state -- a piece of memory that is allocated on module creation, and freed when the module object is deallocated. The module state is specified using dedicated slots.
A typical use of module state is storing an exception type -- or indeed any type object defined by the module --
Unlike the module's Python attributes, Python code cannot replace or delete data stored in module state.
Keeping per-module information in attributes and module state, rather than in static globals, makes module objects isolated and safer for use in multiple sub-interpreters. It also helps Python do an orderly clean-up when it shuts down.
Extensions that keep references to Python objects as part of module state must
implement Py_mod_state_traverse and Py_mod_state_clear
functions to avoid reference leaks.
To retrieve the state from a given module, use the following functions:
-
void *PyModule_GetState(PyObject *module)¶
- قسمتی از ABI پایدار.
Return the "state" of the module, that is, a pointer to the block of memory allocated at module creation time, or
NULL. SeePy_mod_state_size.On error, return
NULLwith an exception set. UsePyErr_Occurred()to tell this case apart from missing module state.
-
int PyModule_GetStateSize(PyObject *module, Py_ssize_t *result)¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Set *result to the size of module's state, as specified using
Py_mod_state_size(orPyModuleDef.m_size), and return 0.On error, set *result to -1, and return -1 with an exception set.
اضافه شده در نسخهی 3.15.
Slots for defining module state¶
The following slot IDs are available for
defining the module state.
-
Py_mod_state_size¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Slot IDfor the size of the module state, in bytes.Setting the value to a non-negative value means that the module can be re-initialized and specifies the additional amount of memory it requires for its state.
برای جزئیات بیشتر به PEP 3121 مراجعه کنید.
Use
PyModule_GetStateSize()to retrieve the size of a given module.اضافه شده در نسخهی 3.15: Use
PyModuleDef.m_sizeinstead to support previous versions.
-
Py_mod_state_traverse¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Slot IDfor a traversal function to call during GC traversal of the module object.The signature of the function, and meanings of the arguments, is similar as for
PyTypeObject.tp_traverse:This function is not called if the module state was requested but is not allocated yet. This is the case immediately after the module is created and before the module is executed (
Py_mod_execfunction). More precisely, this function is not called if the state size (Py_mod_state_size) is greater than 0 and the module state (as returned byPyModule_GetState()) isNULL.اضافه شده در نسخهی 3.15: Use
PyModuleDef.m_traverseinstead to support previous versions.
-
Py_mod_state_clear¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Slot IDfor a clear function to call during GC clearing of the module object.The signature of the function is:
This function is not called if the module state was requested but is not allocated yet. This is the case immediately after the module is created and before the module is executed (
Py_mod_execfunction). More precisely, this function is not called if the state size (Py_mod_state_size) is greater than 0 and the module state (as returned byPyModule_GetState()) isNULL.Like
PyTypeObject.tp_clear, this function is not always called before a module is deallocated. For example, when reference counting is enough to determine that an object is no longer used, the cyclic garbage collector is not involved and thePy_mod_state_freefunction is called directly.اضافه شده در نسخهی 3.15: Use
PyModuleDef.m_clearinstead to support previous versions.
-
Py_mod_state_free¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Slot IDfor a function to call during deallocation of the module object.The signature of the function is:
This function is not called if the module state was requested but is not allocated yet. This is the case immediately after the module is created and before the module is executed (
Py_mod_execfunction). More precisely, this function is not called if the state size (Py_mod_state_size) is greater than 0 and the module state (as returned byPyModule_GetState()) isNULL.اضافه شده در نسخهی 3.15: Use
PyModuleDef.m_freeinstead to support previous versions.
Module token¶
Each module may have an associated token: a pointer-sized value intended to identify of the module state's memory layout. This means that if you have a module object, but you are not sure if it “belongs” to your extension, you can check using code like this:
PyObject *module = <the module in question>
void *module_token;
if (PyModule_GetToken(module, &module_token) < 0) {
return NULL;
}
if (module_token != your_token) {
PyErr_SetString(PyExc_ValueError, "unexpected module")
return NULL;
}
// This module's state has the expected memory layout; it's safe to cast
struct my_state state = (struct my_state*)PyModule_GetState(module)
A module's token -- and the your_token value to use in the above code -- is:
For modules created with
PyModuleDef: the address of thatPyModuleDef;For modules defined with the
Py_mod_tokenslot: the value of that slot;For modules created from an
PyModExport_*export hook: the slots array that the export hook returned (unless overridden withPy_mod_token).
-
Py_mod_token¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Slot IDfor the module token.If you use this slot to set the module token (rather than rely on the default), you must ensure that:
The pointer outlives the class, so it's not reused for something else while the class exists.
It "belongs" to the extension module where the class lives, so it will not clash with other extensions.
If the token points to a
PyModuleDefstruct, the module should behave as if it was created from thatPyModuleDef. In particular, the module state must have matching layout and semantics.
Modules created from
PyModuleDefalways use the address of thePyModuleDefas the token. This means thatPy_mod_tokencannot be used inPyModuleDef.m_slots.اضافه شده در نسخهی 3.15.
-
int PyModule_GetToken(PyObject *module, void **result)¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Set *result to the module token for module and return 0.
On error, set *result to NULL, and return -1 with an exception set.
اضافه شده در نسخهی 3.15.
See also PyType_GetModuleByToken().
ایجاد ماژولهای توسعهای بهصورت پویا¶
The following functions may be used to create an extension module dynamically, rather than from an extension's export hook.
-
PyObject *PyModule_FromSlotsAndSpec(const PySlot *slots, PyObject *spec)¶
- مقدار بازگشتی: مرجع جدید. قسمتی از ABI پایدار از نسخهی 3.15.
Create a new module object, given an array of slots and the
ModuleSpecspec.The slots argument must point to an array of
PySlotstructures, terminated by an entry with slot ID of 0 (typically written asPySlot_END). The array must include aPy_mod_abientry.The spec argument may be any
ModuleSpec-like object, as described inPy_mod_createdocumentation. Currently, the spec must have anameattribute.On success, return the new module. On error, return
NULLwith an exception set.Note that this does not process the module's execution slot (
Py_mod_exec). BothPyModule_FromSlotsAndSpec()andPyModule_Exec()must be called to fully initialize a module. (See also مقداردهی اولیه چندمرحلهای.)اضافه شده در نسخهی 3.15.
-
int PyModule_Exec(PyObject *module)¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Execute the
Py_mod_execslot(s) of module.On success, return 0. On error, return -1 with an exception set.
For clarity: If module has no slots, for example if it uses legacy single-phase initialization, this function does nothing and returns 0.
اضافه شده در نسخهی 3.15.
Module definition struct¶
Traditionally, extension modules were defined using a module definition as the “description" of how a module should be created. Rather than using an array of slots directly, the definition has dedicated members for most common functionality, and allows additional slots as an extension mechanism.
This way of defining modules is still available and there are no plans to remove it.
-
type PyModuleDef¶
- قسمتی از ABI پایدار (see below).
The module definition struct, which holds information needed to create a module object.
This structure must be statically allocated (or be otherwise guaranteed to be valid while any modules created from it exist). Usually, there is only one variable of this type for each extension module defined this way.
The struct, including all members, is part of the Stable ABI for non-free-threaded builds (
abi3). In the Stable ABI for free-threaded builds (abi3t), this struct is opaque, and unusable in practice; see Module definition for a replacement.-
PyModuleDef_Base m_base¶
Always initialize this member to
PyModuleDef_HEAD_INIT:-
type PyModuleDef_Base¶
- قسمتی از ABI پایدار (see below).
The type of
PyModuleDef.m_base.The struct is part of the Stable ABI for non-free-threaded builds (
abi3). In the Stable ABI for Free-Threaded Builds (abi3t), this struct is opaque, and unusable in practice.
-
PyModuleDef_HEAD_INIT¶
The required initial value for
PyModuleDef.m_base.
-
type PyModuleDef_Base¶
-
const char *m_name¶
Corresponds to the
Py_mod_nameslot.
-
const char *m_doc¶
These members correspond to the
Py_mod_docslot. Setting this to NULL is equivalent to omitting the slot.
-
Py_ssize_t m_size¶
Corresponds to the
Py_mod_state_sizeslot. Setting this to zero is equivalent to omitting the slot.When using legacy single-phase initialization or when creating modules dynamically using
PyModule_Create()orPyModule_Create2(),m_sizemay be set to -1. This indicates that the module does not support sub-interpreters, because it has global state.
-
PyMethodDef *m_methods¶
Corresponds to the
Py_mod_methodsslot. Setting this to NULL is equivalent to omitting the slot.
-
PyModuleDef_Slot *m_slots¶
An array of additional slots, terminated by a
{0, NULL}entry. Note that the entries use the olderPyModuleDef_Slotstructure, rather thanPySlot.If the array contains slots corresponding to
PyModuleDefmembers, the values must match. For example, if you usePy_mod_nameinm_slots,PyModuleDef.m_namemust be set to the same pointer (not just an equal string).تغییر یافته در نسخهی 3.5: پیش از نسخه 3.5، این عضو همیشه روی
NULLتنظیم میشد و به این صورت تعریف میشد:-
type PyModuleDef_Slot¶
- قسمتی از ABI پایدار شامل تمام اعضا از نسخهی 3.5.
Older structure defining additional slots of a module.
Note that a
PyModuleDef_Slotarray may be included in aPySlotarray usingPy_mod_slots, and vice versa usingPy_slot_subslots.Each
PyModuleDef_Slotstructuremodslotis interpreted as the followingPySlotstructure:(PySlot){ .sl_id=modslot.slot, .sl_flags=PySlot_INTPTR | sub_static, .sl_ptr=modslot.value }
where
sub_staticisPySlot_STATICif the slot requires the flag (such as forPy_mod_methods), or if this flag is present on the "parent"Py_mod_slotsslot (if any).-
int slot¶
Corresponds to
PySlot.sl_id.
-
void *value¶
Corresponds to
PySlot.sl_ptr.
اضافه شده در نسخهی 3.5.
-
int slot¶
-
type PyModuleDef_Slot¶
-
traverseproc m_traverse¶
-
inquiry m_clear¶
-
freefunc m_free¶
These members correspond to the
Py_mod_state_traverse,Py_mod_state_clear, andPy_mod_state_freeslots, respectively.Setting these members to NULL is equivalent to omitting the corresponding slots.
تغییر یافته در نسخهی 3.9:
m_traverse,m_clearandm_freefunctions are no longer called before the module state is allocated.
-
PyModuleDef_Base m_base¶
-
PyTypeObject PyModuleDef_Type¶
- قسمتی از ABI پایدار از نسخهی 3.5.
نوع اشیاء
PyModuleDef.
-
Py_mod_slots¶
- قسمتی از ABI پایدار از نسخهی 3.15.
Slot IDthat works likePy_slot_subslots, except it specifies an array ofPyModuleDef_Slotstructures.اضافه شده در نسخهی 3.15.
The following API can be used to create modules from a PyModuleDef
struct:
-
PyObject *PyModule_Create(PyModuleDef *def)¶
- مقدار بازگشتی: مرجع جدید.
بر اساس تعریف دادهشده در def، یک شیء ماژول جدید ایجاد میکند. این یک ماکرو است که
PyModule_Create2()را با module_api_version برابر باPYTHON_API_VERSION، یا در صورت استفاده از API محدود برابر باPYTHON_ABI_VERSION، فراخوانی میکند.
-
PyObject *PyModule_Create2(PyModuleDef *def, int module_api_version)¶
- مقدار بازگشتی: مرجع جدید. قسمتی از ABI پایدار.
یک شیء ماژول جدید، بر اساس تعریف موجود در def و با فرض نسخه API module_api_version، ایجاد میکند. اگر این نسخه با نسخه مفسر در حال اجرا مطابقت نداشته باشد، یک
RuntimeWarningنشان داده میشود.در صورت خطا،
NULLبه همراه استثنای تنظیمشده برمیگرداند.این تابع از جایگاهها پشتیبانی نمیکند. عضو
m_slotsاز def بایدNULLباشد.توجه
در بیشتر موارد، به جای این تابع باید از
PyModule_Create()استفاده شود؛ تنها زمانی از آن استفاده کنید که مطمئن باشید به آن نیاز دارید.
-
PyObject *PyModule_FromDefAndSpec(PyModuleDef *def, PyObject *spec)¶
- مقدار بازگشتی: مرجع جدید.
این ماکرو
PyModule_FromDefAndSpec2()را با module_api_version تنظیمشده رویPYTHON_API_VERSION، یا رویPYTHON_ABI_VERSIONدر صورت استفاده از API محدود فراخوانی میکند.اضافه شده در نسخهی 3.5.
منسوخسازی نرم <Soft deprecated> از نسخهی 3.15: Prefer
PyModule_FromSlotsAndSpec()in new code.
-
PyObject *PyModule_FromDefAndSpec2(PyModuleDef *def, PyObject *spec, int module_api_version)¶
- مقدار بازگشتی: مرجع جدید. قسمتی از ABI پایدار از نسخهی 3.7.
با توجه به تعریف موجود در def و ModuleSpec spec، و با فرض نسخه API module_api_version، یک شیء ماژول جدید ایجاد میکند. اگر آن نسخه با نسخه مفسر در حال اجرا مطابقت نداشته باشد، یک
RuntimeWarningمنتشر میشود.در صورت خطا،
NULLبه همراه استثنای تنظیمشده برمیگرداند.توجه داشته باشید که این، جایگاههای اجرا (
Py_mod_exec) را پردازش نمیکند. برای مقداردهی اولیهی کامل یک ماژول، باید هر دوPyModule_FromDefAndSpecوPyModule_ExecDefفراخوانی شوند.توجه
در بیشتر موارد، بهجای این تابع باید از
PyModule_FromDefAndSpec()استفاده کرد؛ تنها در صورتی از این تابع استفاده کنید که مطمئن باشید به آن نیاز دارید.اضافه شده در نسخهی 3.5.
منسوخسازی نرم <Soft deprecated> از نسخهی 3.15: Prefer
PyModule_FromSlotsAndSpec()in new code.
-
int PyModule_ExecDef(PyObject *module, PyModuleDef *def)¶
- قسمتی از ABI پایدار از نسخهی 3.7.
پردازش هر جایگاه اجرا (
Py_mod_exec) که در def داده شده است.اضافه شده در نسخهی 3.5.
منسوخسازی نرم <Soft deprecated> از نسخهی 3.15: To run a module's own execution slots, prefer
PyModule_Exec(), which works on modules that were not created from aPyModuleDefstructure.
توابع پشتیبانی¶
The following functions are provided to help initialize a module object.
They are intended for a module's execution slot (Py_mod_exec),
the initialization function for legacy single-phase initialization,
or code that creates modules dynamically.
-
int PyModule_AddObjectRef(PyObject *module, const char *name, PyObject *value)¶
- قسمتی از ABI پایدار از نسخهی 3.10.
یک شیء را با نام name به module اضافه میکند. این تابع برای راحتی کار فراهم شده و میتوان از آن در تابع مقداردهی اولیهی ماژول استفاده کرد.
در صورت موفقیت،
0را برمیگرداند. در صورت خطا، یک استثنا ایجاد میکند (raise) و-1را برمیگرداند.نمونه استفاده:
static int add_spam(PyObject *module, int value) { PyObject *obj = PyLong_FromLong(value); if (obj == NULL) { return -1; } int res = PyModule_AddObjectRef(module, "spam", obj); Py_DECREF(obj); return res; }
برای سهولت، تابع مقدار
NULLرا همراه با استثنای تنظیمشده میپذیرد. در این حالت،-1را برگردانید و استثنای ایجادشده را دستنخورده بگذارید.این مثال را میتوان بدون بررسی صریح اینکه آیا obj برابر
NULLاست یا نه نیز نوشت:static int add_spam(PyObject *module, int value) { PyObject *obj = PyLong_FromLong(value); int res = PyModule_AddObjectRef(module, "spam", obj); Py_XDECREF(obj); return res; }
توجه داشته باشید که در این مورد باید از
Py_XDECREF()به جایPy_DECREF()استفاده شود، زیرا obj میتواندNULLباشد.تعداد رشتههای name متفاوتی که به این تابع پاس داده میشوند باید کم نگه داشته شود؛ این کار معمولاً با استفاده فقط از رشتههای با تخصیص ایستا بهعنوان name انجام میشود. برای نامهایی که در زمان کامپایل معلوم نیستند، ترجیح دهید
PyUnicode_FromString()وPyObject_SetAttr()را مستقیماً فراخوانی کنید. برای جزئیات بیشتر،PyUnicode_InternFromString()را ببینید که ممکن است بهطور داخلی برای ایجاد یک شیء کلید استفاده شود.اضافه شده در نسخهی 3.10.
-
int PyModule_Add(PyObject *module, const char *name, PyObject *value)¶
- قسمتی از ABI پایدار از نسخهی 3.13.
مشابه
PyModule_AddObjectRef()، اما ارجاعی به value را "میدزدد" (حتی در صورت خطا). میتوان آن را با نتیجهی تابعی که ارجاع جدیدی برمیگرداند فراخوانی کرد، بدون نیاز به بررسی نتیجهی آن یا حتی ذخیرهی آن در متغیری.نمونه استفاده:
if (PyModule_Add(module, "spam", PyBytes_FromString(value)) < 0) { goto error; }
اضافه شده در نسخهی 3.13.
-
int PyModule_AddObject(PyObject *module, const char *name, PyObject *value)¶
- قسمتی از ABI پایدار.
مشابه
PyModule_AddObjectRef()است، اما در صورت موفقیت (اگر0را برگرداند) ارجاع به value را میدزدد.استفاده از توابع جدید
PyModule_Add()یاPyModule_AddObjectRef()توصیه میشود، زیرا استفاده نادرست از تابعPyModule_AddObject()بهراحتی میتواند منجر به نشتی ارجاع شود.توجه
برخلاف سایر توابعی که ارجاعها را میدزدند،
PyModule_AddObject()ارجاع به value را تنها در صورت موفقیت آزاد میکند.این بدان معناست که مقدار بازگشتی آن باید بررسی شود و کد فراخواننده باید در صورت خطا،
Py_XDECREF()را بهصورت دستی روی value فراخوانی کند.نمونه استفاده:
PyObject *obj = PyBytes_FromString(value); if (PyModule_AddObject(module, "spam", obj) < 0) { // If 'obj' is not NULL and PyModule_AddObject() failed, // 'obj' strong reference must be deleted with Py_XDECREF(). // If 'obj' is NULL, Py_XDECREF() does nothing. Py_XDECREF(obj); goto error; } // PyModule_AddObject() stole a reference to obj: // Py_XDECREF(obj) is not needed here.
منسوخسازی نرم <Soft deprecated> از نسخهی 3.13.
-
int PyModule_AddIntConstant(PyObject *module, const char *name, long value)¶
- قسمتی از ABI پایدار.
یک ثابت عدد صحیح را با نام name به module اضافه میکند. میتوان از این تابع کمکی در تابع مقداردهی اولیهی ماژول استفاده کرد. در صورت خطا،
-1همراه با تنظیم یک استثنا و در صورت موفقیت0برمیگرداند.این یک تابع کمکی است که
PyLong_FromLong()وPyModule_AddObjectRef()را فراخوانی میکند؛ برای جزئیات به مستندات آنها مراجعه کنید.
-
int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value)¶
- قسمتی از ABI پایدار.
یک ثابت رشتهای را با نام name به module اضافه میکند. از این تابع کمکی میتوان در تابع مقداردهی اولیهی ماژول استفاده کرد. رشتهی value باید با
NULLپایان یابد. در صورت خطا-1همراه با تنظیم یک استثنا، و در صورت موفقیت0برمیگرداند.این یک تابع کمکی است که
PyUnicode_InternFromString()وPyModule_AddObjectRef()را فراخوانی میکند؛ برای جزئیات به مستندات آنها مراجعه کنید.
-
PyModule_AddIntMacro(module, macro)¶
یک ثابت صحیح به module اضافه میکند. نام و مقدار از macro گرفته میشوند. برای مثال،
PyModule_AddIntMacro(module, AF_INET)ثابت صحیح AF_INET را با مقدار AF_INET به module اضافه میکند. در صورت خطا-1همراه با تنظیم یک استثنا و در صورت موفقیت0را برمیگرداند.
-
PyModule_AddStringMacro(module, macro)¶
افزودن یک ثابت رشتهای به module.
-
int PyModule_AddType(PyObject *module, PyTypeObject *type)¶
- قسمتی از ABI پایدار از نسخهی 3.10.
یک شیء نوع به module اضافه میکند. شیء نوع با فراخوانی داخلی
PyType_Ready()نهاییسازی میشود. نام شیء نوع از آخرین جزءtp_nameپس از نقطه گرفته میشود. در صورت خطا-1همراه با یک استثنای تنظیمشده و در صورت موفقیت0برمیگرداند.اضافه شده در نسخهی 3.9.
-
int PyModule_AddFunctions(PyObject *module, PyMethodDef *functions)¶
- قسمتی از ABI پایدار از نسخهی 3.7.
توابع را از آرایهی functions که با
NULLپایان مییابد به module اضافه میکند. برای جزئیات مربوط به ورودیهای منفرد به مستنداتPyMethodDefمراجعه کنید (به دلیل نبود فضای نام ماژول مشترک، «توابع» سطح ماژول که در C پیادهسازی میشوند معمولاً ماژول را بهعنوان نخستین پارامتر خود دریافت میکنند که این امر آنها را مشابه متدهای نمونه در کلاسهای پایتون میسازد).این تابع هنگام ایجاد یک ماژول از
PyModuleDef(مانند زمانی که از مقداردهی اولیه چندمرحلهای،PyModule_CreateیاPyModule_FromDefAndSpecاستفاده میشود) بهطور خودکار فراخوانی میشود. برخی از نویسندگان ماژول ممکن است ترجیح دهند توابع را در چندین آرایهیPyMethodDefتعریف کنند؛ در این صورت باید این تابع را مستقیماً فراخوانی کنند.آرایهی functions باید بهصورت ایستا تخصیص داده شود (یا به نحوی دیگر تضمین شود که عمرش از شیء ماژول طولانیتر باشد).
اضافه شده در نسخهی 3.5.
-
int PyModule_SetDocString(PyObject *module, const char *docstring)¶
- قسمتی از ABI پایدار از نسخهی 3.7.
رشته مستند module را به docstring تنظیم میکند. این تابع هنگام ایجاد ماژول از روی
PyModuleDef(مانند زمان استفاده از مقداردهی اولیه چندمرحلهای،PyModule_CreateیاPyModule_FromDefAndSpec) بهطور خودکار فراخوانی میشود.در صورت موفقیت
0را برمیگرداند. در صورت خطا-1همراه با تنظیم یک استثنا برمیگرداند.اضافه شده در نسخهی 3.5.
-
int PyUnstable_Module_SetGIL(PyObject *module, void *gil)¶
- این است API ناپایداراین ممکن است بدون هشدار در نسخههای جزئی تغییر کند.
با استفاده از یکی از مقادیر
Py_mod_gilنشان میدهد که module از اجرا بدون قفل مفسر سراسری (GIL) پشتیبانی میکند یا نمیکند. هنگام استفاده از مقداردهی اولیه تکمرحلهای قدیمی، این تابع باید در طول تابع مقداردهی اولیهی module فراخوانی شود. اگر این تابع در طول مقداردهی اولیه ماژول فراخوانی نشود، سازوکار ایمپورت فرض میکند که ماژول از اجرا بدون GIL پشتیبانی نمیکند. این تابع فقط در ساختهای پایتون که با--disable-gilپیکربندی شدهاند در دسترس است. در صورت خطا-1را همراه با تنظیم یک استثنا و در صورت موفقیت0را برمیگرداند.اضافه شده در نسخهی 3.13.
جستجوی ماژول (مقداردهی اولیه تکفازی)¶
طرح مقداردهی اولیهی مقداردهی اولیه تکمرحلهای قدیمی، ماژولهای تکنمونه ایجاد میکند که میتوان آنها را در زمینهی مفسر جاری جستجو کرد. این امکان را فراهم میکند که شیء ماژول بعداً تنها با یک ارجاع به تعریف ماژول بازیابی شود.
این توابع روی ماژولهایی که با استفاده از مقداردهی اولیه چندمرحلهای (multi-phase initialization) ایجاد شدهاند کار نخواهند کرد، زیرا میتوان چندین ماژول از این نوع را از یک تعریف واحد ایجاد کرد.
-
PyObject *PyState_FindModule(PyModuleDef *def)¶
- مقدار بازگشتی: مرجع امانتی. قسمتی از ABI پایدار.
شیء ماژولی که از def برای مفسر فعلی ایجاد شده است را برمیگرداند. این متد مستلزم آن است که شیء ماژول از قبل با
PyState_AddModule()به وضعیت مفسر متصل شده باشد. در صورتی که شیء ماژول مربوطه یافت نشود یا هنوز به وضعیت مفسر متصل نشده باشد،NULLرا برمیگرداند.
-
int PyState_AddModule(PyObject *module, PyModuleDef *def)¶
- قسمتی از ABI پایدار از نسخهی 3.3.
شیء ماژولِ پاسدادهشده به تابع را به وضعیت مفسر متصل میکند. این کار امکان دسترسی به شیء ماژول از طریق
PyState_FindModule()را فراهم میکند.تنها بر ماژولهایی که با استفاده از مقداردهی اولیه تکمرحلهای ایجاد شدهاند مؤثر است.
پایتون پس از ایمپورت کردن ماژولی که از راهاندازی تکفازی استفاده میکند،
PyState_AddModuleرا بهطور خودکار فراخوانی میکند؛ بنابراین فراخوانی آن از کد راهاندازی ماژول ضروری نیست (اما بیضرر است). تنها در صورتی به فراخوانی صریح آن نیاز است که کد راهاندازی خودِ ماژول در ادامهPyState_FindModuleرا فراخوانی کند. این تابع عمدتاً برای پیادهسازی سازوکارهای ایمپورت جایگزین در نظر گرفته شده است (چه با فراخوانی مستقیم آن، چه با مراجعه به پیادهسازی آن برای جزئیات بهروزرسانیهای وضعیت موردنیاز).اگر پیشتر ماژولی با استفاده از همان def پیوست شده باشد، با module جدید جایگزین میشود.
فراخوانکننده باید یک attached thread state داشته باشد.
در صورت خطا،
-1همراه با استثنای تنظیمشده و در صورت موفقیت0برمیگرداند.اضافه شده در نسخهی 3.3.
-
int PyState_RemoveModule(PyModuleDef *def)¶
- قسمتی از ABI پایدار از نسخهی 3.3.
شیء ماژول ایجادشده از def را از وضعیت مفسر حذف میکند. در صورت خطا
-1همراه با استثنای تنظیمشده و در صورت موفقیت0برمیگرداند.فراخوانکننده باید یک attached thread state داشته باشد.
اضافه شده در نسخهی 3.3.