ساختارهای مشترک اشیاء¶
تعداد زیادی ساختار وجود دارند که در تعریف نوعهای شیء برای پایتون استفاده میشوند. این بخش این ساختارها و نحوهی استفاده از آنها را شرح میدهد.
نوعهای شیء پایه و ماکروها¶
همهی اشیاء پایتون در نهایت تعداد اندکی فیلد را در ابتدای بازنمایی شیء در حافظه به اشتراک میگذارند. این فیلدها با نوعهای PyObject و PyVarObject بازنمایی میشوند که آن نوعها نیز به نوبهی خود توسط بسط برخی ماکروها تعریف میشوند؛ ماکروهایی که چه بهطور مستقیم و چه بهطور غیرمستقیم، در تعریف همهی اشیاء دیگر پایتون نیز به کار رفتهاند. ماکروهای دیگر را میتوانید در شمارش ارجاع بیابید.
-
type PyObject¶
- قسمتی از API محدود. (تنها برخی از اعضا قسمتی از ABI پایدار هستند.)
همهی نوعهای شیء توسعههایی از این نوع هستند. این نوعی است که اطلاعات مورد نیاز پایتون برای در نظر گرفتن یک اشارهگر به یک شیء بهعنوان یک شیء را در بر میگیرد. در یک ساختِ «انتشار» معمولی، این نوع تنها شمارش ارجاع شیء و یک اشارهگر به شیء نوع متناظر را در بر دارد. در واقع هیچچیز بهعنوان یک
PyObjectاعلام نمیشود، اما هر اشارهگر به یک شیء پایتون را میتوان به PyObject* قالبریزی کرد.اعضا نباید بهطور مستقیم مورد دسترسی قرار گیرند؛ در عوض از ماکروهایی مانند
Py_REFCNTوPy_TYPEاستفاده کنید.-
Py_ssize_t ob_refcnt¶
- قسمتی از ABI پایدار.
شمارش ارجاع شیء، همانطور که توسط
Py_REFCNTبرگردانده میشود. از این فیلد مستقیماً استفاده نکنید؛ در عوض از توابع و ماکروهایی مانندPy_REFCNT،Py_INCREF()وPy_DecRef()استفاده کنید.نوع فیلد ممکن است بسته به پیکربندی ساخت و پلتفرم، از
Py_ssize_tمتفاوت باشد.
-
PyTypeObject *ob_type¶
- قسمتی از ABI پایدار.
نوع شیء. از این فیلد مستقیماً استفاده نکنید؛ بهجای آن از
Py_TYPEوPy_SET_TYPE()استفاده کنید.
-
Py_ssize_t ob_refcnt¶
-
type PyVarObject¶
- قسمتی از API محدود. (تنها برخی از اعضا قسمتی از ABI پایدار هستند.)
توسعهای از
PyObjectکه فیلدob_sizeرا به آن میافزاید. این برای شیءهایی در نظر گرفته شده است که نوعی مفهوم از طول دارند.همانطور که در مورد
PyObjectصادق است، نباید به اعضا مستقیماً دسترسی داشته باشید؛ در عوض از ماکروهایی مانندPy_SIZE،Py_REFCNTوPy_TYPEاستفاده کنید.-
Py_ssize_t ob_size¶
- قسمتی از ABI پایدار.
فیلد اندازه، که محتوای آن باید بهعنوان جزئیات داخلی پیادهسازی یک شیء در نظر گرفته شود.
از این فیلد بهطور مستقیم استفاده نکنید؛ در عوض از
Py_SIZEاستفاده کنید.توابع ایجاد شیء مانند
PyObject_NewVar()بهطور کلی این فیلد را به اندازهی درخواستی (تعداد آیتمها) تنظیم میکنند. پس از ایجاد، میتوان مقادیر دلخواه را درob_sizeبا استفاده ازPy_SET_SIZEذخیره کرد.برای بهدستآوردن طولِ عمومیِ در دسترسِ یک شیء، که تابع پایتونی
len()بازمیگرداند، بهجای آن ازPyObject_Length()استفاده کنید.
-
Py_ssize_t ob_size¶
-
PyObject_HEAD¶
این ماکرو هنگام اعلان نوعهای جدیدی که اشیاء بدون طول متغیر را بازنمایی میکنند، به کار میرود. ماکرو PyObject_HEAD به شکل زیر بسط مییابد:
PyObject ob_base;
به مستندات
PyObjectدر بالا مراجعه کنید.
-
PyObject_VAR_HEAD¶
این ماکرو هنگام اعلان نوعهای جدیدی به کار میرود که شیءهایی را نمایندگی میکنند که طولشان از نمونهای به نمونهای دیگر تغییر میکند. ماکرو PyObject_VAR_HEAD به شکل زیر بسط مییابد:
PyVarObject ob_base;
به مستندات
PyVarObjectدر بالا مراجعه کنید.
-
PyTypeObject PyBaseObject_Type¶
- قسمتی از ABI پایدار.
کلاس پایهی همهی اشیاء دیگر، همانند
objectدر پایتون.
-
int Py_Is(PyObject *x, PyObject *y)¶
- قسمتی از ABI پایدار از نسخهی 3.10.
بررسی میکند که آیا شیء x همان شیء y است، همانند
x is yدر پایتون.اضافه شده در نسخهی 3.10.
-
int Py_IsNone(PyObject *x)¶
- قسمتی از ABI پایدار از نسخهی 3.10.
بررسی میکند که آیا یک شیء، تکنمونهی
Noneاست یا نه؛ همانندx is Noneدر پایتون.اضافه شده در نسخهی 3.10.
-
int Py_IsTrue(PyObject *x)¶
- قسمتی از ABI پایدار از نسخهی 3.10.
بررسی میکند که آیا یک شیء تکنمونهی
Trueاست یا نه؛ همانندx is Trueدر پایتون.اضافه شده در نسخهی 3.10.
-
int Py_IsFalse(PyObject *x)¶
- قسمتی از ABI پایدار از نسخهی 3.10.
بررسی میکند که آیا یک شیء، تکنمونهی
Falseاست، همانندx is Falseدر پایتون.اضافه شده در نسخهی 3.10.
-
PyTypeObject *Py_TYPE(PyObject *o)¶
- مقدار بازگشتی: مرجع امانتی. قسمتی از ABI پایدار از نسخهی 3.14.
نوع شیء پایتون o را به دست میآورد.
ارجاع بازگرداندهشده از o امانی است. آن را با
Py_DECREF()یا مشابه آن آزاد نکنید.
-
int Py_IS_TYPE(PyObject *o, PyTypeObject *type)¶
اگر نوع شیء o برابر با type باشد، مقدار غیرصفر برمیگرداند. در غیر این صورت صفر برمیگرداند. معادل با:
Py_TYPE(o) == type.اضافه شده در نسخهی 3.9.
-
void Py_SET_TYPE(PyObject *o, PyTypeObject *type)¶
نوع شیء o را بدون هیچ بررسی یا شمارش ارجاع، به type تنظیم میکند.
این یک عملیات بسیار سطحپایین است. بهجای این کار، تنظیم ویژگی پایتونی
__class__با استفاده ازPyObject_SetAttrString()یا مشابه آن را در نظر بگیرید.توجه داشته باشید که انتساب یک نوع ناسازگار میتواند منجر به رفتار تعریفنشده شود.
اگر type یک نوع هیپ باشد، فراخوانکننده باید یک ارجاع جدید به آن ایجاد کند. بهطور مشابه، اگر نوع قبلی o یک نوع هیپ باشد، فراخوانکننده باید یک ارجاع به آن نوع را آزاد کند.
اضافه شده در نسخهی 3.9.
-
Py_ssize_t Py_SIZE(PyVarObject *o)¶
گرفتن فیلد
ob_sizeاز o.تغییر یافته در نسخهی 3.11:
Py_SIZE()به یک تابع ایستای درونخطی تغییر یافته است. نوع پارامتر دیگر const PyVarObject* نیست.
-
void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)¶
فیلد
ob_sizeاز o را برابر size قرار میدهد.اضافه شده در نسخهی 3.9.
-
PyObject_HEAD_INIT(type)¶
این یک ماکرو است که به مقادیر مقداردهی اولیه برای یک نوع جدید
PyObjectبسط مییابد. این ماکرو به صورت زیر بسط مییابد:_PyObject_EXTRA_INIT 1, type,
-
PyVarObject_HEAD_INIT(type, size)¶
این یک ماکرو است که به مقادیر مقداردهی اولیه برای یک نوع جدید
PyVarObjectبسط مییابد و فیلدob_sizeرا نیز در بر میگیرد. این ماکرو به این صورت بسط مییابد:_PyObject_EXTRA_INIT 1, type, size,
پیادهسازی توابع و متدها¶
-
type PyCFunction¶
- قسمتی از ABI پایدار.
نوع توابعی که برای پیادهسازی بیشتر فراخوانیپذیرهای پایتون در C به کار میروند. توابع از این نوع دو پارامتر PyObject* میگیرند و یک مقدار از این نوع برمیگردانند. اگر مقدار بازگشتی
NULLباشد، یک استثنا باید تنظیم شده باشد. اگرNULLنباشد، مقدار بازگشتی بهعنوان مقدار بازگشتی تابع از دید پایتون تفسیر میشود. تابع باید یک ارجاع جدید برگرداند.امضای تابع به این صورت است:
PyObject *PyCFunction(PyObject *self, PyObject *args);
-
type PyCFunctionWithKeywords¶
- قسمتی از ABI پایدار.
نوع توابعی که برای پیادهسازی فراخوانیپذیرهای پایتون در C با امضای METH_VARARGS | METH_KEYWORDS استفاده میشوند. امضای تابع به این صورت است:
PyObject *PyCFunctionWithKeywords(PyObject *self, PyObject *args, PyObject *kwargs);
-
type PyCFunctionFast¶
- قسمتی از ABI پایدار از نسخهی 3.13.
نوع توابعی که برای پیادهسازی فراخوانیپذیرهای پایتون در C با امضای
METH_FASTCALLاستفاده میشوند. امضای تابع چنین است:PyObject *PyCFunctionFast(PyObject *self, PyObject *const *args, Py_ssize_t nargs);
-
type PyCFunctionFastWithKeywords¶
- قسمتی از ABI پایدار از نسخهی 3.13.
نوع توابعی که برای پیادهسازی فراخوانیپذیرهای پایتون در C با امضای METH_FASTCALL | METH_KEYWORDS استفاده میشوند. امضای تابع به این صورت است:
PyObject *PyCFunctionFastWithKeywords(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames);
-
type PyCMethod¶
نوع توابعی که برای پیادهسازی فراخوانیپذیرهای پایتون در C با امضای METH_METHOD | METH_FASTCALL | METH_KEYWORDS استفاده میشوند. امضای تابع چنین است:
PyObject *PyCMethod(PyObject *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
اضافه شده در نسخهی 3.9.
-
type PyMethodDef¶
- قسمتی از ABI پایدار شامل تمام اعضا.
ساختاری که برای توصیف متد یک نوع توسعهای استفاده میشود. این ساختار چهار فیلد دارد:
-
const char *ml_name¶
نام متد.
-
PyCFunction ml_meth¶
اشارهگر به پیادهسازی C.
-
int ml_flags¶
بیتهای پرچم که مشخص میکنند فراخوانی چگونه باید ساخته شود.
-
const char *ml_doc¶
به محتوای رشته مستند اشاره میکند.
-
const char *ml_name¶
ml_meth یک اشارهگر به تابع C است. توابع ممکن است از نوعهای مختلفی باشند، اما همیشه PyObject* برمیگردانند. اگر تابع از نوع PyCFunction نباشد، کامپایلر در جدول متدها به قالبریزی نیاز خواهد داشت. هرچند PyCFunction پارامتر اول را بهصورت PyObject* تعریف میکند، رایج است که پیادهسازی متد از نوع مشخص C شیء self استفاده کند.
فیلد ml_flags یک میدان بیتی (bitfield) است که میتواند شامل پرچمهای زیر باشد. هر یک از پرچمها نشاندهندهی یک قرارداد فراخوانی یا یک قرارداد مقیدسازی است.
قراردادهای فراخوانی عبارتاند از:
-
METH_VARARGS¶
- قسمتی از ABI پایدار.
این قرارداد فراخوانی متداول است که در آن متدها از نوع
PyCFunctionهستند. این تابع دو مقدار PyObject* دریافت میکند. مقدار نخست، شیء self برای متدهاست؛ برای توابع ماژول، این مقدار شیء ماژول است. پارامتر دوم (که اغلب args نامیده میشود) یک شیء تاپل است که تمام آرگومانها را نمایندگی میکند. این پارامتر معمولاً با استفاده ازPyArg_ParseTuple()یاPyArg_UnpackTuple()پردازش میشود.
-
METH_KEYWORDS¶
فقط میتواند در ترکیبهای خاصی با پرچمهای دیگر استفاده شود: METH_VARARGS | METH_KEYWORDS، METH_FASTCALL | METH_KEYWORDS و METH_METHOD | METH_FASTCALL | METH_KEYWORDS.
- METH_VARARGS | METH_KEYWORDS
متدهای دارای این پرچمها باید از نوع
PyCFunctionWithKeywordsباشند. این تابع سه پارامتر میپذیرد: self، args و kwargs که در آن kwargs دیکشنریای از تمام آرگومانهای کلیدواژهای است یا در صورت نبود آرگومانهای کلیدواژهای ممکن استNULLباشد. این پارامترها معمولاً با استفاده ازPyArg_ParseTupleAndKeywords()پردازش میشوند.
-
METH_FASTCALL¶
- قسمتی از ABI پایدار از نسخهی 3.10.
قرارداد فراخوانی سریع که فقط از آرگومانهای جایگاهی پشتیبانی میکند. متدها از نوع
PyCFunctionFastهستند. پارامتر اول self است، پارامتر دوم یک آرایه C از مقادیر PyObject* است که آرگومانها را نشان میدهد و پارامتر سوم تعداد آرگومانها است (طول آرایه).اضافه شده در نسخهی 3.7.
تغییر یافته در نسخهی 3.10:
METH_FASTCALLاکنون بخشی از رابط دودویی پایدار است.
- METH_FASTCALL | METH_KEYWORDS
توسعهای از
METH_FASTCALLکه از آرگومانهای کلیدواژهای نیز پشتیبانی میکند، با متدهایی از نوعPyCFunctionFastWithKeywords. آرگومانهای کلیدواژهای به همان شیوهی پروتکل vectorcall منتقل میشوند: یک پارامتر چهارم اضافی از نوع PyObject* وجود دارد که یک تاپل است و نامهای آرگومانهای کلیدواژهای را نشان میدهد (که تضمین میشود رشته باشند) یا در صورت نبود کلیدواژهها ممکن استNULLباشد. مقادیر آرگومانهای کلیدواژهای در آرایهی args، پس از آرگومانهای جایگاهی، ذخیره میشوند.اضافه شده در نسخهی 3.7.
-
METH_METHOD¶
- قسمتی از ABI پایدار از نسخهی 3.7.
تنها میتواند در ترکیب با سایر پرچمها استفاده شود: METH_METHOD | METH_FASTCALL | METH_KEYWORDS.
- METH_METHOD | METH_FASTCALL | METH_KEYWORDS
توسعهای از METH_FASTCALL | METH_KEYWORDS است که از کلاس تعریفکننده پشتیبانی میکند؛ یعنی کلاسی که متد مورد نظر در آن قرار دارد. کلاس تعریفکننده ممکن است ابرکلاس
Py_TYPE(self)باشد.متد باید از نوع
PyCMethodباشد، همانطور که برایMETH_FASTCALL | METH_KEYWORDSاست، با آرگومانdefining_classکه پس ازselfاضافه میشود.اضافه شده در نسخهی 3.9.
-
METH_NOARGS¶
- قسمتی از ABI پایدار.
متدهای بدون پارامتر، در صورتی که با پرچم
METH_NOARGSفهرست شده باشند، لازم نیست بررسی کنند که آیا آرگومانی داده شده است یا خیر. آنها باید از نوعPyCFunctionباشند. پارامتر اول معمولاً self نام دارد و ارجاعی به ماژول یا نمونهی شیء را نگه میدارد. در همهی موارد، پارامتر دومNULLخواهد بود.تابع باید ۲ پارامتر داشته باشد. از آنجا که پارامتر دوم استفاده نمیشود، میتوان از
Py_UNUSEDبرای جلوگیری از هشدار کامپایلر استفاده کرد.
-
METH_O¶
- قسمتی از ABI پایدار.
میتوان متدهایی که تنها یک آرگومان شیء دارند، با پرچم
METH_Oفهرست کرد، بهجای فراخوانیPyArg_ParseTuple()با آرگومان"O". این متدها از نوعPyCFunctionهستند و پارامتر self و پارامتری از نوع PyObject* دارند که نمایانگر تنها آرگومان است.
این دو ثابت هنگامی که با متدهای کلاسها استفاده میشوند، برای نشان دادن قرارداد فراخوانی (calling convention) به کار نمیروند، بلکه مقیدسازی را نشان میدهند. از این ثابتها نمیتوان برای توابع تعریفشده برای ماژولها استفاده کرد. برای هر متد معین، حداکثر یکی از این پرچمها میتواند تنظیم شود.
-
METH_CLASS¶
- قسمتی از ABI پایدار.
به این متد، به جای نمونهای از نوع، شیء نوع به عنوان اولین پارامتر پاس داده خواهد شد. از این برای ایجاد متدهای کلاس استفاده میشود، مشابه آنچه هنگام استفاده از دکوراتور توکار
@classmethodایجاد میشود.
-
METH_STATIC¶
- قسمتی از ABI پایدار.
به این متد،
NULLبهعنوان پارامتر اول ارسال میشود، نه نمونهای از آن نوع. این برای ایجاد متدهای ایستا استفاده میشود، مشابه آنچه هنگام استفاده از دکوراتور توکار@staticmethodایجاد میشود.
یک ثابت دیگر کنترل میکند که آیا یک متد بهجای تعریف دیگری با همان نام متد بارگذاری شود یا خیر.
-
METH_COEXIST¶
- قسمتی از ABI پایدار.
این متد به جای تعریفهای موجود بارگذاری خواهد شد. بدون METH_COEXIST، حالت پیشفرض، صرفنظر کردن از تعریفهای تکراری است. از آنجا که پوششهای جایگاه (slot wrapper) پیش از جدول متد بارگذاری میشوند، مثلاً وجود یک جایگاه sq_contains متدی پوششی به نام
__contains__()تولید میکند و مانع از بارگذاری یک PyCFunction متناظر با همان نام میشود. با تعریف این پرچم، PyCFunction به جای شیء پوششی بارگذاری خواهد شد و در کنار جایگاه همزیستی خواهد کرد. این مفید است زیرا فراخوانیهای PyCFunction نسبت به فراخوانیهای شیء پوششی بهینهسازی بیشتری دارند.
-
PyTypeObject PyCMethod_Type¶
شیء نوع متناظر با اشیاء متد C در پایتون. این بهصورت
types.BuiltinMethodTypeدر لایه پایتون در دسترس است.
-
int PyCMethod_Check(PyObject *op)¶
اگر op نمونهای از نوع
PyCMethod_Typeیا زیرنوعی از آن باشد، مقدار true را برمیگرداند. این تابع همیشه موفق میشود.
-
int PyCMethod_CheckExact(PyObject *op)¶
این همان
PyCMethod_Check()است، اما زیرنوعها را در نظر نمیگیرد.
-
PyObject *PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)¶
- مقدار بازگشتی: مرجع جدید. قسمتی از ABI پایدار از نسخهی 3.9.
ml را به یک شیء callable پایتون تبدیل میکند. فراخواننده باید اطمینان حاصل کند که ml بیشتر از callable زنده میماند. معمولاً ml بهصورت یک متغیر ایستا تعریف میشود.
پارامتر self هنگام فراخوانی، به عنوان آرگومان self به تابع C در
ml->ml_methمنتقل میشود. self میتواندNULLباشد.ویژگی
__module__شیء فراخوانیپذیر را میتوان از آرگومان module دادهشده تنظیم کرد. module باید یک رشته پایتونی باشد که بهعنوان نام ماژولی که تابع در آن تعریف شده است استفاده میشود. اگر در دسترس نباشد، میتوان آن را رویNoneیاNULLتنظیم کرد.همچنین ملاحظه نمائید
پارامتر cls بهعنوان آرگومان defining_class به تابع C ارسال میشود. اگر
METH_METHODرویml->ml_flagsتنظیم شده باشد، باید مقداردهی شود.اضافه شده در نسخهی 3.9.
-
PyTypeObject PyCFunction_Type¶
- قسمتی از ABI پایدار.
شیء نوع متناظر با شیءهای تابع C پایتون. این شیء در لایه پایتون بهصورت
types.BuiltinFunctionTypeدر دسترس است.
-
int PyCFunction_Check(PyObject *op)¶
اگر op نمونهای از نوع
PyCFunction_Typeیا زیرنوعی از آن باشد، مقدار درست را برمیگرداند. این تابع همیشه موفق میشود.
-
int PyCFunction_CheckExact(PyObject *op)¶
این همان
PyCFunction_Check()است، اما زیرنوعها را در نظر نمیگیرد.
-
PyObject *PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)¶
- مقدار بازگشتی: مرجع جدید. قسمتی از ABI پایدار.
معادل
PyCMethod_New(ml, self, module, NULL)است.
-
PyObject *PyCFunction_New(PyMethodDef *ml, PyObject *self)¶
- مقدار بازگشتی: مرجع جدید. قسمتی از ABI پایدار از نسخهی 3.4.
معادل
PyCMethod_New(ml, self, NULL, NULL)است.
-
int PyCFunction_GetFlags(PyObject *func)¶
- قسمتی از ABI پایدار.
پرچمهای تابع روی func را، همانطور که به
ml_flagsپاس دادهشدهاند، دریافت میکند.اگر func یک شیء تابع C نباشد، این کار با یک استثنا شکست میخورد. func نباید
NULLباشد.این تابع در صورت موفقیت، پرچمهای تابع را برمیگرداند و در صورت شکست،
-1به همراه یک استثنای تنظیمشده برمیگرداند.
-
int PyCFunction_GET_FLAGS(PyObject *func)¶
این همان
PyCFunction_GetFlags()است، اما بدون بررسی خطا یا بررسی نوع.
-
PyCFunction PyCFunction_GetFunction(PyObject *func)¶
- قسمتی از ABI پایدار.
گرفتن اشارهگر تابع روی func، همانطور که به
ml_methپاس داده شده است.اگر func یک شیء تابع C نباشد، این کار با یک استثنا شکست میخورد. func نباید
NULLباشد.این تابع در صورت موفقیت، اشارهگر تابع را برمیگرداند و در صورت شکست،
NULLرا همراه با یک استثنای تنظیمشده برمیگرداند.
-
int PyCFunction_GET_FUNCTION(PyObject *func)¶
این همان
PyCFunction_GetFunction()است، اما بدون بررسی خطا یا بررسی نوع.
-
PyObject *PyCFunction_GetSelf(PyObject *func)¶
- قسمتی از ABI پایدار.
گرفتن شیء "self" روی func. این همان شیئی است که به آرگومان اول یک
PyCFunctionپاس داده میشود. برای اشیاء تابع C که از طریق یکPyMethodDefروی یکPyModuleDefایجاد شدهاند، این همان شیء ماژول حاصل است.اگر func یک شیء تابع C نباشد، این کار با یک استثنا شکست میخورد. func نباید
NULLباشد.این تابع در صورت موفقیت، یک ارجاع امانتی به شیء "self" برمیگرداند و در صورت شکست،
NULLرا همراه با استثنای تنظیمشده برمیگرداند.
-
PyObject *PyCFunction_GET_SELF(PyObject *func)¶
این همان
PyCFunction_GetSelf()است، اما بدون بررسی خطا و نوع.
دسترسی به ویژگیهای نوعهای توسعهای¶
-
type PyMemberDef¶
- قسمتی از ABI پایدار شامل تمام اعضا.
ساختاری که ویژگیای از یک نوع را توصیف میکند که متناظر با عضوی از ساختار C است. هنگام تعریف یک کلاس، آرایهای خاتمهیافته با NULL از این ساختارها را در جایگاه
tp_membersقرار دهید.فیلدهای آن به ترتیب عبارتاند از:
-
const char *name¶
نام عضو. مقدار NULL پایان یک آرایه
PyMemberDef[]را مشخص میکند.رشته باید ایستا باشد، هیچ کپیای از آن ساخته نمیشود.
-
int type¶
نوع عضو در ساختار C. برای مقادیر ممکن، نوعهای عضو را ببینید.
-
Py_ssize_t offset¶
آفست بر حسب بایتی که عضو در ساختار شیء نوع در آن قرار دارد.
-
int flags¶
صفر یا بیشتر از پرچمهای عضو، که با استفاده از OR بیتی ترکیب شدهاند.
-
const char *doc¶
رشته مستند، یا NULL. این رشته باید ایستا باشد؛ هیچ کپیای از آن تهیه نمیشود. معمولاً این رشته با استفاده از
PyDoc_STRتعریف میشود.
بهطور پیشفرض (زمانی که
flagsبرابر0باشد)، اعضا هم اجازهی خواندن و هم اجازهی نوشتن را میدهند. برای دسترسی فقطخواندنی از پرچمPy_READONLYاستفاده کنید. برخی نوعها، مانندPy_T_STRING، مستلزمPy_READONLYهستند. فقط اعضایPy_T_OBJECT_EX(وT_OBJECTقدیمی) قابل حذف هستند.برای نوعهای تخصیصیافته در هیپ (که با استفاده از
PyType_FromSpec()یا مشابه آن ایجاد میشوند)،PyMemberDefمیتواند تعریفی برای عضو ویژهی"__vectorcalloffset__"داشته باشد که متناظر باtp_vectorcall_offsetدر شیءهای نوع است. این عضو باید باPy_T_PYSSIZETو یکی ازPy_READONLYیاPy_READONLY | Py_RELATIVE_OFFSETتعریف شود. برای مثال:static PyMemberDef spam_type_members[] = { {"__vectorcalloffset__", Py_T_PYSSIZET, offsetof(Spam_object, vectorcall), Py_READONLY}, {NULL} /* Sentinel */ };
(ممکن است برای
offsetof()به#include <stddef.h>نیاز داشته باشید.)آفستهای قدیمی
tp_dictoffsetوtp_weaklistoffsetرا میتوان بهطور مشابه با استفاده از اعضای"__dictoffset__"و"__weaklistoffset__"تعریف کرد، اما به ماژولهای توسعهای بهشدت توصیه میشود که بهجای آنها ازPy_TPFLAGS_MANAGED_DICTوPy_TPFLAGS_MANAGED_WEAKREFاستفاده کنند.تغییر یافته در نسخهی 3.12:
PyMemberDefهمیشه در دسترس است. پیش از این، نیازمند درج"structmember.h"بود.تغییر یافته در نسخهی 3.14:
Py_RELATIVE_OFFSETاکنون برای"__vectorcalloffset__"،"__dictoffset__"و"__weaklistoffset__"مجاز است. -
const char *name¶
-
PyObject *PyMember_GetOne(const char *obj_addr, struct PyMemberDef *m)¶
- قسمتی از ABI پایدار.
یک ویژگی متعلق به شیء موجود در نشانی obj_addr را بازیابی میکند. این ویژگی توسط
PyMemberDefm توصیف میشود. در صورت خطاNULLرا برمیگرداند.تغییر یافته در نسخهی 3.12:
PyMember_GetOneهمیشه دسترسپذیر است. پیشتر، نیازمند گنجاندن"structmember.h"بود.
-
int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o)¶
- قسمتی از ABI پایدار.
یک ویژگی متعلق به شیءِ واقع در نشانی obj_addr را برابر شیء o قرار میدهد. ویژگیِ تنظیمشونده توسط
PyMemberDefm توصیف میشود. در صورت موفقیت0و در صورت شکست مقدار منفی برمیگرداند.تغییر یافته در نسخهی 3.12:
PyMember_SetOneهمیشه در دسترس است. پیشتر، نیازمند گنجاندن"structmember.h"بود.
پرچمهای عضو¶
از پرچمهای زیر میتوان با PyMemberDef.flags استفاده کرد:
-
Py_READONLY¶
- قسمتی از ABI پایدار از نسخهی 3.12.
قابل نوشتن نیست.
-
Py_AUDIT_READ¶
- قسمتی از ABI پایدار از نسخهی 3.12.
پیش از خواندن، یک رویداد حسابرسی
object.__getattr__منتشر میکند.
-
Py_RELATIVE_OFFSET¶
- قسمتی از ABI پایدار از نسخهی 3.12.
نشان میدهد که
offsetاین ورودیPyMemberDefآفستی از دادههای خاص زیرکلاس را مشخص میکند، نه ازPyObject.هنگام ایجاد کلاس با استفاده از
basicsizeمنفی، تنها میتواند بهعنوان بخشی ازجایگاهPy_tp_membersاستفاده شود. استفاده از آن در چنین حالتی الزامی است. هنگام تنظیمtp_membersاز جایگاه در طول ایجاد کلاس، پایتون پرچم را پاک میکند وPyMemberDef.offsetرا برابر با آفست نسبت به ساختارPyObjectقرار میدهد.
تغییر یافته در نسخهی 3.10: ماکروهای RESTRICTED، READ_RESTRICTED و WRITE_RESTRICTED که با #include "structmember.h" در دسترس هستند، منسوخ شدهاند. READ_RESTRICTED و RESTRICTED معادل Py_AUDIT_READ هستند؛ WRITE_RESTRICTED هیچ کاری انجام نمیدهد.
تغییر یافته در نسخهی 3.12: ماکروی READONLY به Py_READONLY تغییر نام یافت. ماکروی PY_AUDIT_READ با پیشوند Py_ تغییر نام یافت. نامهای جدید اکنون همیشه در دسترس هستند. پیشتر، این موارد نیازمند #include "structmember.h" بودند. سرآیند هنوز در دسترس است و نامهای قدیمی را فراهم میکند.
نوعهای عضو¶
PyMemberDef.type میتواند یکی از ماکروهای زیر باشد که متناظر با نوعهای مختلف C هستند. هنگامی که در پایتون به این عضو دسترسی پیدا شود، به نوع معادل پایتونی تبدیل میشود. هنگامی که از پایتون مقداردهی شود، دوباره به نوع C تبدیل میشود. اگر این کار ممکن نباشد، استثنایی مانند TypeError یا ValueError ایجاد میشود.
ویژگیهای تعریفشده به این روش را نمیتوان با استفاده از مثلاً del یا delattr() حذف کرد، مگر آنکه با (D) علامتگذاری شده باشند.
نام ماکرو |
نوع C |
نوع پایتون |
|---|---|---|
|
char |
|
|
short |
|
|
int |
|
|
long |
|
|
long long |
|
|
unsigned char |
|
|
unsigned int |
|
|
unsigned short |
|
|
unsigned long |
|
|
unsigned long long |
|
|
||
|
float |
|
|
double |
|
|
char (بهصورت ۰ یا ۱ نوشته میشود) |
|
|
const char* (*) |
|
|
const char[] (*) |
|
|
char (0-127) |
|
|
|
(*): رشتهی C پایانیافته با صفر و کدگذاریشده با UTF8. با
Py_T_STRINGنمایش C یک اشارهگر است؛ باPy_T_STRING_INPLACEرشته مستقیماً در ساختار ذخیره میشود.(**): رشتهای به طول ۱. فقط اسکی پذیرفته میشود.
(RO): مستلزم
Py_READONLYاست.(D): قابل حذف است؛ در این صورت اشارهگر به
NULLتنظیم میشود. خواندن اشارهگرNULLاستثنایAttributeErrorرا ایجاد میکند.
اضافه شده در نسخهی 3.12: در نسخههای پیشین، ماکروها تنها با #include "structmember.h" در دسترس بودند و بدون پیشوند Py_ نامگذاری میشدند (مثلاً بهصورت T_INT). این سرآیند همچنان در دسترس است و شامل نامهای قدیمی، بههمراه نوعهای منسوخ زیر است:
-
T_OBJECT¶
مانند
Py_T_OBJECT_EXاست، اماNULLبهNoneتبدیل میشود. این امر در پایتون به رفتاری غافلگیرکننده منجر میشود: حذف ویژگی عملاً آن را بهNoneتنظیم میکند.
-
T_NONE¶
همیشه
Noneاست. باید همراه باPy_READONLYاستفاده شود.
تعریف getterها و setterها¶
-
type PyGetSetDef¶
- قسمتی از ABI پایدار شامل تمام اعضا.
ساختاری برای تعریف دسترسی شبیه به پراپرتی برای یک نوع. همچنین توضیحات جایگاه
PyTypeObject.tp_getsetرا ببینید.-
const char *name¶
نام ویژگی
-
const char *doc¶
رشته مستند اختیاری
-
void *closure¶
اشارهگر اختیاری دادههای کاربر، که دادههای اضافی را برای getter و setter فراهم میکند.
-
const char *name¶
-
typedef PyObject *(*getter)(PyObject*, void*)¶
- قسمتی از ABI پایدار.
تابع
getیک پارامتر PyObject* (نمونه) و یک اشارهگر دادهی کاربر (closureمرتبط) را میپذیرد:باید در صورت موفقیت یک ارجاع جدید و در صورت شکست
NULLهمراه با یک استثنای تنظیمشده بازگرداند.
-
typedef int (*setter)(PyObject*, PyObject*, void*)¶
- قسمتی از ABI پایدار.
توابع
setدو پارامتر PyObject* (نمونه و مقداری که باید تنظیم شود) و یک اشارهگر داده کاربر (closureمرتبط) را دریافت میکنند:در صورتی که ویژگی باید حذف شود، پارامتر دوم
NULLاست. باید در صورت موفقیت0و در صورت شکست-1به همراه استثنای تنظیمشده برگرداند.