मेरे पास ऐसी विधियां हैं जो उन वस्तुओं से प्राप्त करने के लिए डिक्ट्स या अन्य ऑब्जेक्ट्स और "फ़ील्ड्स" के नाम स्वीकार करती हैं। यदि ऑब्जेक्ट एक नियम है तो नामित कुंजी पुनर्प्राप्त करने के लिए विधि __getitem__
का उपयोग करती है, अन्यथा यह नामित विशेषता पुनर्प्राप्त करने के लिए getattr
का उपयोग करती है। वेब टेम्पलेटिंग भाषाओं में यह बहुत आम है। उदाहरण के लिए, एक Chameleon टेम्पलेट में आप हो सकता है:पायथन में हाइब्रिड गेटैटर + __getitem__ क्यों बनाया गया है?
<p tal:content="foo.keyname">Stuff goes here</p>
आप {'keyname':'bar'}
की तरह एक dict के रूप में foo
में पास है, तो foo.keyname
'बार' पाने के लिए 'कीनेम' कुंजी को हासिल करेगा। यदि foo
एक वर्ग की तरह का एक उदाहरण है:
class Foo(object):
keyname = 'baz'
तो foo.keyname
keyname
विशेषता से मूल्य को हासिल करेगा।
def lookup_attr(obj, key):
try:
return getattr(obj, key)
except AttributeError as exc:
try:
get = obj.__getitem__
except AttributeError:
raise exc
try:
return get(key)
except KeyError:
raise exc
मैं की तरह my own package में इसे लागू किया गया है:: गिरगिट ही है कि समारोह (chameleon.py26
मॉड्यूल में) इस तरह लागू करता
try:
value = obj[attribute]
except (KeyError, TypeError):
value = getattr(obj, attribute)
बात है, कि एक बहुत आम पैटर्न है। मैंने उस विधि को देखा है या बहुत सारे मॉड्यूल में इसके साथ बहुत ही समान है। तो भाषा के मूल में, या कम से कम कोर मॉड्यूल में ऐसा कुछ क्यों नहीं है? यह असफल रहा, क्या यह एक निश्चित तरीका है कि लिखा जाना चाहिए?
मैं दृढ़ता से ऑब्जेक्ट करता हूं कि "बात यह है कि यह एक सुंदर आम पैटर्न है"। स्पष्ट से स्पष्ट स्पष्ट है। विशेषता पहुंच पूरी तरह से कुछ है जो कुंजी द्वारा उपयोग ... –
हां, लेकिन पेज टेम्पलेट भाषाओं जैसे कुछ संदर्भों में यह अभी भी काफी आम है। मैंने इसे देखा है (और इसे लागू करने की आवश्यकता है) अक्सर यह इच्छा करने के लिए पर्याप्त है कि इसे मूल या एक सामान्य मॉड्यूल में दोहराया गया हो। –
ऐसा कुछ भी नहीं है - संभवतः क्योंकि पाइथन डेवलपर खराब प्रोग्रामिंग शैली को लागू नहीं करना चाहता .... प्वाइंट..फिर आप खराब कोड लिखना चाहते हैं तो आपको इसे स्पष्ट रूप से लिखना होगा .... स्पष्ट रूप से स्पष्ट है । –