अजगर में, जब एक दृश्य प्रकार को लागू करने, मैं अक्सर (अपेक्षाकृत बोल) अपने आप को इस तरह कोड लिखने लगता है:__getitem__ को साफ तरीके से कैसे लिखें?
class FooSequence(collections.abc.Sequence):
# Snip other methods
def __getitem__(self, key):
if isinstance(key, int):
# Get a single item
elif isinstance(key, slice):
# Get a whole slice
else:
raise TypeError('Index must be int, not {}'.format(type(key).__name__))
कोड isinstance()
साथ स्पष्ट रूप से अपने तर्क के प्रकार की जाँच करता है। पायथन समुदाय के भीतर यह regarded as an antipattern है। मैं इससे कैसे बचूं?
- मैं,
functools.singledispatch
उपयोग नहीं कर सकते क्योंकि वह quite deliberately तरीकों के साथ असंगत (यहself
पर प्रेषण करने के लिए है, जो पूरी तरह से बेकार है, क्योंकि हम पहले से ही OOP बहुरूपता के माध्यम सेself
पर भेजने का प्रयास करेंगे रहे हैं)। यह@staticmethod
के साथ काम करता है, लेकिन अगर मुझेself
से सामान प्राप्त करने की आवश्यकता है तो क्या होगा? int()
पर कास्ट करना और फिरTypeError
को पकड़ना, एक टुकड़ा की जांच करना, और संभवतः फिर से उठाना अभी भी बदसूरत है, हालांकि शायद थोड़ा कम है।- यह पूर्णांक को एक-तत्व स्लाइस में परिवर्तित करने के लिए क्लीनर हो सकता है और दोनों स्थितियों को एक ही कोड के साथ संभाल सकता है, लेकिन इसकी अपनी समस्याएं हैं (
0
या[0]
वापस करें?)।
बेशक, भाषा * * __getslice__' के साथ हमारे लिए यह करने के लिए * का उपयोग किया जाता है, लेकिन यह बहिष्कृत है, जो मुझे पूरी तकनीक की सुदृढ़ता के बारे में आश्चर्यचकित करता है। – Kevin
@ केविन, इसे विभिन्न कारणों से बहिष्कृत किया गया था। वे 'स्लाइस' ऑब्जेक्ट बनाना चाहते थे, लेकिन '__getslice__' ने' i' और 'j' तर्क लिया। यह पिछड़ा संगतता टूट गया होगा। –