اشیاء ماژول

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__ ماژول دوباره مقداردهی شود یا ماژول نابود شود.

منسوخ شده از نسخه‌ی 3.2: 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 ID for the name of the new module, as a NUL-terminated UTF8-encoded const char *.

Note that modules are typically created using a ModuleSpec, and when they are, the name from the spec will be used instead of Py_mod_name. However, it is still recommended to include this slot for introspection and debugging purposes.

اضافه شده در نسخه‌ی 3.15: Use PyModuleDef.m_name instead to support previous versions.

Py_mod_doc
قسمتی از ABI پایدار از نسخه‌ی 3.15.

Slot ID for the docstring of the new module, as a NUL-terminated UTF8-encoded const char *.

Usually it is set to a variable created with PyDoc_STRVAR.

اضافه شده در نسخه‌ی 3.15: Use PyModuleDef.m_doc instead to support previous versions.

Feature slots

Py_mod_abi
قسمتی از ABI پایدار از نسخه‌ی 3.15.

Slot ID whose value points to a PyABIInfo structure describing the ABI that the extension is using.

A suitable PyABIInfo variable can be defined using the PyABIInfo_VAR macro, 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 ID whose 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 using PySlot arrays, use PySlot_DATA for Py_mod_multiple_interpreters:

PySlot_DATA(Py_mod_multiple_interpreters,
            Py_MOD_PER_INTERPRETER_GIL_SUPPORTED)

اضافه شده در نسخه‌ی 3.12.

Py_mod_gil
قسمتی از ABI پایدار از نسخه‌ی 3.13.

Slot ID whose 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 using PySlot arrays, use PySlot_DATA for Py_mod_gil:

PySlot_DATA(Py_mod_gil, Py_MOD_GIL_NOT_USED)

اضافه شده در نسخه‌ی 3.13.

Creation and initialization slots

Py_mod_create
قسمتی از ABI پایدار از نسخه‌ی 3.5.

Slot ID for 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 for importlib.machinery.ModuleSpec have 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 with PyModule_Type instances; in particular:

اضافه شده در نسخه‌ی 3.5.

تغییر یافته در نسخه‌ی 3.15: The slots argument may be a ModuleSpec-like object, rather than a true ModuleSpec instance. 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.

Py_mod_exec
قسمتی از ABI پایدار از نسخه‌ی 3.5.

Slot ID for 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:

int exec_module(PyObject *module)

See the توابع پشتیبانی section for some useful functions to call.

For backwards compatibility, the PyModuleDef.m_slots array may contain multiple Py_mod_exec slots; these are processed in the order they appear in the array. Elsewhere (that is, in arguments to PyModule_FromSlotsAndSpec() and in return values of PyModExport_<name>), repeating the slot is not allowed.

اضافه شده در نسخه‌ی 3.5.

تغییر یافته در نسخه‌ی 3.15: Repeated Py_mod_exec slots are disallowed, except in PyModuleDef.m_slots.

Py_mod_methods
قسمتی از ABI پایدار از نسخه‌ی 3.15.

Slot ID for a table of module-level functions, as an array of PyMethodDef values suitable as the functions argument to PyModule_AddFunctions().

Like other slot IDs, a slots array may only contain one Py_mod_methods entry. To add functions from multiple PyMethodDef arrays, call PyModule_AddFunctions() in the Py_mod_exec function.

The table must be statically allocated (or otherwise guaranteed to outlive the module object).

اضافه شده در نسخه‌ی 3.15: Use PyModuleDef.m_methods instead 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. See Py_mod_state_size.

On error, return NULL with an exception set. Use PyErr_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 (or PyModuleDef.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 ID for 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_size instead to support previous versions.

Py_mod_state_traverse
قسمتی از ABI پایدار از نسخه‌ی 3.15.

Slot ID for 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:

int traverse_module_state(PyObject *module, visitproc visit, void *arg)

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_exec function). 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 by PyModule_GetState()) is NULL.

اضافه شده در نسخه‌ی 3.15: Use PyModuleDef.m_traverse instead to support previous versions.

Py_mod_state_clear
قسمتی از ABI پایدار از نسخه‌ی 3.15.

Slot ID for a clear function to call during GC clearing of the module object.

The signature of the function is:

int clear_module_state(PyObject *module)

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_exec function). 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 by PyModule_GetState()) is NULL.

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 the Py_mod_state_free function is called directly.

اضافه شده در نسخه‌ی 3.15: Use PyModuleDef.m_clear instead to support previous versions.

Py_mod_state_free
قسمتی از ABI پایدار از نسخه‌ی 3.15.

Slot ID for a function to call during deallocation of the module object.

The signature of the function is:

int free_module_state(PyObject *module)

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_exec function). 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 by PyModule_GetState()) is NULL.

اضافه شده در نسخه‌ی 3.15: Use PyModuleDef.m_free instead 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 that PyModuleDef;

  • For modules defined with the Py_mod_token slot: the value of that slot;

  • For modules created from an PyModExport_* export hook: the slots array that the export hook returned (unless overridden with Py_mod_token).

Py_mod_token
قسمتی از ABI پایدار از نسخه‌ی 3.15.

Slot ID for 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 PyModuleDef struct, the module should behave as if it was created from that PyModuleDef. In particular, the module state must have matching layout and semantics.

Modules created from PyModuleDef always use the address of the PyModuleDef as the token. This means that Py_mod_token cannot be used in PyModuleDef.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 ModuleSpec spec.

The slots argument must point to an array of PySlot structures, terminated by an entry with slot ID of 0 (typically written as PySlot_END). The array must include a Py_mod_abi entry.

The spec argument may be any ModuleSpec-like object, as described in Py_mod_create documentation. Currently, the spec must have a name attribute.

On success, return the new module. On error, return NULL with an exception set.

Note that this does not process the module's execution slot (Py_mod_exec). Both PyModule_FromSlotsAndSpec() and PyModule_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_exec slot(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.

const char *m_name

Corresponds to the Py_mod_name slot.

const char *m_doc

These members correspond to the Py_mod_doc slot. Setting this to NULL is equivalent to omitting the slot.

Py_ssize_t m_size

Corresponds to the Py_mod_state_size slot. Setting this to zero is equivalent to omitting the slot.

When using legacy single-phase initialization or when creating modules dynamically using PyModule_Create() or PyModule_Create2(), m_size may 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_methods slot. 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 older PyModuleDef_Slot structure, rather than PySlot.

If the array contains slots corresponding to PyModuleDef members, the values must match. For example, if you use Py_mod_name in m_slots, PyModuleDef.m_name must be set to the same pointer (not just an equal string).

تغییر یافته در نسخه‌ی 3.5: پیش از نسخه 3.5، این عضو همیشه روی NULL تنظیم می‌شد و به این صورت تعریف می‌شد:

inquiry m_reload
type PyModuleDef_Slot
قسمتی از ABI پایدار شامل تمام اعضا از نسخه‌ی 3.5.

Older structure defining additional slots of a module.

Note that a PyModuleDef_Slot array may be included in a PySlot array using Py_mod_slots, and vice versa using Py_slot_subslots.

Each PyModuleDef_Slot structure modslot is interpreted as the following PySlot structure:

(PySlot){
   .sl_id=modslot.slot,
   .sl_flags=PySlot_INTPTR | sub_static,
   .sl_ptr=modslot.value
}

where sub_static is PySlot_STATIC if the slot requires the flag (such as for Py_mod_methods), or if this flag is present on the "parent" Py_mod_slots slot (if any).

int slot

Corresponds to PySlot.sl_id.

void *value

Corresponds to PySlot.sl_ptr.

اضافه شده در نسخه‌ی 3.5.

traverseproc m_traverse
inquiry m_clear
freefunc m_free

These members correspond to the Py_mod_state_traverse, Py_mod_state_clear, and Py_mod_state_free slots, respectively.

Setting these members to NULL is equivalent to omitting the corresponding slots.

تغییر یافته در نسخه‌ی 3.9: m_traverse, m_clear and m_free functions are no longer called before the module state is allocated.

PyTypeObject PyModuleDef_Type
قسمتی از ABI پایدار از نسخه‌ی 3.5.

نوع اشیاء PyModuleDef.

Py_mod_slots
قسمتی از ABI پایدار از نسخه‌ی 3.15.

Slot ID that works like Py_slot_subslots, except it specifies an array of PyModuleDef_Slot structures.

اضافه شده در نسخه‌ی 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.

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.

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 a PyModuleDef structure.

PYTHON_API_VERSION
PYTHON_API_STRING

The C API version, as an integer (1013) and string ("1013"), respectively. Defined for backwards compatibility.

در حال حاضر، این ثابت در نسخه‌های جدید پایتون به‌روزرسانی نمی‌شود و برای نسخه‌بندی مفید نیست. این ممکن است در آینده تغییر کند.

PYTHON_ABI_VERSION
PYTHON_ABI_STRING

Defined as 3 and "3", respectively, for backwards compatibility.

در حال حاضر، این ثابت در نسخه‌های جدید پایتون به‌روزرسانی نمی‌شود و برای نسخه‌بندی مفید نیست. این ممکن است در آینده تغییر کند.

توابع پشتیبانی

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.
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.