الفرق بين المراجعتين لصفحة: «Python/functools/partial»

من موسوعة حسوب
لا ملخص تعديل
 
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:الدالة <code>functools.partial()‎</code> في بايثون}}</noinclude>
تعيد الدّالة <code>functools.partial()‎</code> كائن <code>partial</code> يتصرّف كالدّالة المُعطاة عند استدعائها بما مُرّر من مُعاملات (arguments) ومُعاملات كلمات مفتاحيّة (keyword arguments، أي المُعاملات التي تُمرّر مع ذكر أسمائها إضافةً إلى قيمها). إن استُدعيَ الكائن بمُعاملات إضافيّة، فستُضاف إلى مُعاملات الدّالة، و إن استُدعيَ الكائن بمُعاملات كلمات مفتاحيّة إضافيّة، فستُوسّع وتُعوّض معاملات الكلمات المفتاحيّة السّابقة.
تعيد الدّالة <code>functools.partial()‎</code> كائن <code>partial</code> يتصرّف كالدّالة المُعطاة عند استدعائها بما مُرّر من مُعاملات (arguments) ومُعاملات كلمات مفتاحيّة (keyword arguments، أي المُعاملات التي تُمرّر مع ذكر أسمائها إضافةً إلى قيمها). إن استُدعيَ الكائن بمُعاملات إضافيّة، فستُضاف إلى مُعاملات الدّالة، و إن استُدعيَ الكائن بمُعاملات كلمات مفتاحيّة إضافيّة، فستُوسّع وتُعوّض معاملات الكلمات المفتاحيّة السّابقة.


سطر 10: سطر 9:


== المعاملات ==
== المعاملات ==
=== <code>func</code> ===
=== <code>func</code> ===
الدّالة المرغوب إنشاء دالّة جزئيّة منها.
الدّالة المرغوب إنشاء دالّة جزئيّة منها.
سطر 33: سطر 33:
مُعاملات الكلمات المفتاحيّة التي ستُمرّر عندما يُستدعى الكائن <code>partial</code>.
مُعاملات الكلمات المفتاحيّة التي ستُمرّر عندما يُستدعى الكائن <code>partial</code>.


كائنات <code>partial</code> مثلُها مثل الدّوال، إذ تكون كائناتٍ قابلة للاستدعاء، وذات إحالة ضعيفة (weak referencable)، ويُمكن لها أن تمتلك خاصيّات مُعيّنة. لكن هناك بعض الفروقات المُهمّة، على سبيل المثال، الخاصيّتان <code>‎__name__‎</code> و<code>‎__doc__‎</code> لا تُنشآن تلقائيًّا. إضافةً إلى أنّ كائنات <code>partial</code> المُعرفّة في الأصناف تتصرّف مثل التّوابع السّاكنة ولا تتحوّل إلى توابع مُرتبطة (bound methods) عند البحث عن خاصيّات النّسخة.
كائنات <code>partial</code> مثلُها مثل الدّوال، إذ تكون كائناتٍ قابلة للاستدعاء، وذات إحالة ضعيفة (weak referencable)، ويُمكن لها أن تمتلك خاصيّات مُعيّنة. لكن هناك بعض الفروقات المُهمّة، على سبيل المثال، الخاصيّتان <code>‎__name__‎</code> (التي تحمل اسم الدّالة) و<code>‎__doc__‎</code> (التي تُمثّل [[Python/documentation strings|سلسلة التّوثيق النّصيّة]]) لا تُنشآن تلقائيًّا. إضافةً إلى أنّ كائنات <code>partial</code> المُعرفّة في الأصناف تتصرّف مثل [[Python/staticmethod|التّوابع السّاكنة]] ولا تتحوّل إلى توابع مُرتبطة (bound methods) عند البحث عن خاصيّات النّسخة.


== أمثلة ==
== أمثلة ==
تُستخدم الدّالة <code>functools.partial()‎</code> لإنشاء دالّة جزئيّة تُجمّد جزءًا ممّا يُمرّر إلى الدّالة من مُعاملات، ما يُنشئُ كائنًا ذا توقيع أبسط. على سبيل المثال، يُمكن استعمال الدّالة  <code>functools.partial()‎</code> لإنشاء كائن قابل للاستدعاء يتصرّف مثل الدّالة <code>int()‎</code> بمُعامل أساس (base) يُساوي افتراضيًّا القيمة 2:
تُستخدم الدّالة <code>functools.partial()‎</code> لإنشاء دالّة جزئيّة تُجمّد جزءًا ممّا يُمرّر إلى الدّالة من مُعاملات، ما يُنشئُ كائنًا ذا توقيع أبسط. على سبيل المثال، يُمكن استعمال الدّالة  <code>functools.partial()‎</code> لإنشاء كائن قابل للاستدعاء يتصرّف مثل الدّالة <code>[[Python/int|int()‎]]</code> بمُعامل أساس (base) يُساوي افتراضيًّا القيمة 2:<syntaxhighlight lang="python3">
 
<syntaxhighlight lang="python3">
>>> from functools import partial
>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo = partial(int, base=2)
سطر 46: سطر 44:


== ملاحظات ==
== ملاحظات ==
الدّالة مُكافئة تقريبًا لما يلي:
الدّالة مُكافئة تقريبًا لما يلي:<syntaxhighlight lang="python3">
<syntaxhighlight lang="python3">
def partial(func, *args, **keywords):
def partial(func, *args, **keywords):
     def newfunc(*fargs, **fkeywords):
     def newfunc(*fargs, **fkeywords):
سطر 60: سطر 57:


== انظر أيضًا ==
== انظر أيضًا ==
* [[Python/functools/partialmethod|functools.partialmethod]]: لتابعٍ جزئيّ عوضًا عن دالّة.
* [[Python/functools/partialmethod|<code>functools.partialmethod</code>]]: لتابعٍ جزئيّ عوضًا عن دالّة.
* [[Python/int|الأعداد الصّحيحة في بايثون]].
* [[Python/int|الأعداد الصّحيحة في بايثون]].
* [[Python/defining-functions|تعريف الدوال في بايثون]].
* [[Python/defining-functions|تعريف الدوال في بايثون]].


== مصادر ==
== مصادر ==
* [https://docs.python.org/3/library/functools.html#functools.partial قسم الدالة functools.partial في توثيق Python الرسمي].
* [https://docs.python.org/3/library/functools.html#functools.partial قسم الدالة functools.partial في توثيق Python الرسمي.]<noinclude>{{DISPLAYTITLE:الدالة <code>functools.partial()‎</code> في بايثون}}</noinclude>
[[تصنيف:Python]]
[[تصنيف:Python]]
[[تصنيف:Python Function]]
[[تصنيف:Python Function]]
[[تصنيف:Python functools]]
[[تصنيف:Python functools]]

المراجعة الحالية بتاريخ 18:58، 22 يونيو 2018

تعيد الدّالة functools.partial()‎ كائن partial يتصرّف كالدّالة المُعطاة عند استدعائها بما مُرّر من مُعاملات (arguments) ومُعاملات كلمات مفتاحيّة (keyword arguments، أي المُعاملات التي تُمرّر مع ذكر أسمائها إضافةً إلى قيمها). إن استُدعيَ الكائن بمُعاملات إضافيّة، فستُضاف إلى مُعاملات الدّالة، و إن استُدعيَ الكائن بمُعاملات كلمات مفتاحيّة إضافيّة، فستُوسّع وتُعوّض معاملات الكلمات المفتاحيّة السّابقة.

تُستعمل لإنشاء دالّة جزئيّة من دالّة بتمرير قيم افتراضيّة ثابتة لها.

البنية العامة

functools.partial(func, *args, **keywords)

المعاملات

func

الدّالة المرغوب إنشاء دالّة جزئيّة منها.

args

المُعاملات التي ستُمرّر.

keywords

المُعاملات المفتاحيّة التي ستُمرّر.

القيمة المعادة

كائن partial يتصرّف كالدّالة المُعطاة عند استدعائها بما مُرّر من مُعاملات ومُعاملات مفتاحيّة ويُعدّ دالّة جزئيّة من الدّالة الأصليّة ذات قيم ثابتة مُمرّرة مُسبقًا.

كائنات partial تملك ثلاث خاصيّات قابلة للقراءة فقط (read-only):

partial.func

كائن قابل للاستدعاء أو دالّة. ستُوجّه استدعاءات partial إلى الكائن partial.func مع مُعاملات وكلمات مفتاحيّة جديدة.

partial.args

المُعاملات المكانيّة (positional arguments، أي المُعاملات التي تُمرّر قيَمُها دون ذكر اسمها) التي ستُضاف إلى أقصى يسار المُعاملات التي تُمرّر إلى الكائن partial.

partial.keywords

مُعاملات الكلمات المفتاحيّة التي ستُمرّر عندما يُستدعى الكائن partial.

كائنات partial مثلُها مثل الدّوال، إذ تكون كائناتٍ قابلة للاستدعاء، وذات إحالة ضعيفة (weak referencable)، ويُمكن لها أن تمتلك خاصيّات مُعيّنة. لكن هناك بعض الفروقات المُهمّة، على سبيل المثال، الخاصيّتان ‎__name__‎ (التي تحمل اسم الدّالة) و‎__doc__‎ (التي تُمثّل سلسلة التّوثيق النّصيّة) لا تُنشآن تلقائيًّا. إضافةً إلى أنّ كائنات partial المُعرفّة في الأصناف تتصرّف مثل التّوابع السّاكنة ولا تتحوّل إلى توابع مُرتبطة (bound methods) عند البحث عن خاصيّات النّسخة.

أمثلة

تُستخدم الدّالة functools.partial()‎ لإنشاء دالّة جزئيّة تُجمّد جزءًا ممّا يُمرّر إلى الدّالة من مُعاملات، ما يُنشئُ كائنًا ذا توقيع أبسط. على سبيل المثال، يُمكن استعمال الدّالة functools.partial()‎ لإنشاء كائن قابل للاستدعاء يتصرّف مثل الدّالة int()‎ بمُعامل أساس (base) يُساوي افتراضيًّا القيمة 2:

>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo('10010')
18

ملاحظات

الدّالة مُكافئة تقريبًا لما يلي:

def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*args, *fargs, **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

انظر أيضًا

مصادر