أساليب Python STD مكالمات التسلسل الهرمي موثقة؟

StackOverflow https://stackoverflow.com/questions/4053662

  •  27-09-2019
  •  | 
  •  

سؤال

واجهت مجرد مشكلة في التصنيف الفرعي "نوع". لقد تجاوزت طريقة __iter__ وتوقعت أنها ستؤثر على طرق أخرى مثل iterkeys ، والمفاتيح وما إلى ذلك. لأنني اعتقدت أنهم يطلقون على طريقة __iter__ للحصول على القيم ولكن يبدو أنها يتم تنفيذها بشكل مستقل وعلي أن أتغلب عليها جميعًا.

هل هذا خطأ أو نية لا يستخدمون طرقًا أخرى ويسترجعون القيم بشكل منفصل؟

لم أجد في وصف وثائق بيثون القياسية للمكالمات التبعية بين طرق الفئات القياسية. سيكون من المفيد للعمل Sublassing والتوجيه ما هي الأساليب المطلوبة لتجاوز السلوك المناسب. هل هناك بعض الوثائق الإضافية حول أنواع/فئات قاعدة بيثون الداخلية؟

هل كانت مفيدة؟

المحلول

الفئة الفرعية Mapping أو MuteableMapping من وحدة المجموعات بدلاً من dict وستحصل على كل هذه الطرق مجانًا.

فيما يلي مثال على الحد الأدنى من التعيين وبعض الطرق التي تحصل عليها مجانًا:

import collections
class MinimalMapping(collections.Mapping):
    def __init__(self, *items ):
        self.elements = dict(items)
    def __getitem__(self, key):
        return self.elements[key]
    def __len__(self):
        return len(self.elements)
    def __iter__(self):
        return iter(self.elements)

t = MinimalMapping()
print (t.iteritems, t.keys, t.itervalues, t.get)

لتصنيف أي من الحاويات المصممة ، يجب عليك دائمًا استخدام الأساس المناسبة من وحدة المجموعات.

نصائح أخرى

إذا لم يتم تحديده في الوثائق ، فهو كذلك التنفيذ محدد. التطبيقات الأخرى التي قد يعيد استخدام Cpython iter طريقة للتنفيذ iterkeys و اخرين. لن أعتبر هذا خطأ ، ولكن ببساطة القليل من الحرية للمنفذين.

أظن أن هناك عامل أداء في تنفيذ الأساليب بشكل مستقل ، خاصة وأن القواميس تستخدم على نطاق واسع في بيثون.

لذلك في الأساس ، يجب عليك تنفيذها.

أنت تعرف القول: "أنت تعرف ماذا يحدث عندما تفترض." :-)

إنهم لا يوثقون هذه الأشياء رسميًا لأنهم قد يقررون تغييرها في المستقبل. أي وثائق غير رسمية قد تجدها ستجد ببساطة توثيق السلوك الحالي لتطبيق Python ، والاعتماد عليه سيؤدي إلى أن يكون رمزك هشًا للغاية.

عندما يكون هناك وثائق رسمية للطرق الخاصة ، فإنها تميل إلى وصف سلوك المترجم الفوري فيما يتعلق بفصولك الخاصة ، مثل استخدام __len__() متى __nonzero__() لم يتم تنفيذها ، أو تحتاج فقط __lt()__ للفرز.

نظرًا لأن Python يستخدم كتابة البط ، فعادةً ما لا تحتاج فعليًا إلى الوراثة من فئة مدمجة لجعل صفك الخاص يتصرف مثل واحد. لذلك يمكنك إعادة النظر فيما إذا كان التصنيف الفرعي dict هو حقا ما تريد القيام به. يمكنك اختيار فصل مختلف ، مثل شيء من collections الوحدة ، أو للتغليف بدلاً من الوراثة. (ال UserString يستخدم الفصل التغليف.) أو فقط ابدأ من الصفر.

بدلا من التصنيف الفرعي dict, ، يمكنك بدلاً من ذلك إنشاء فصلك الخاص بالضبط الخصائص التي تريدها دون الكثير من المتاعب. ها هو مقالات انشر مع مثال على كيفية القيام بذلك. ال __str__() الطريقة في الأمر ليست الأعظم ، ولكن هذا يتم تصحيحه بسهولة ، يوفر الباقي الوظائف التي تبحث عنها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top