एक भयानक हैक जो अनियंत्रित, कार्यान्वयन-विशिष्ट पायथन सुविधाओं का उपयोग करता है, निम्नानुसार है। आपको कभी भी कभी भी ऐसा कुछ नहीं करना चाहिए।
यह पाइथन 2.6.1 और 2.7.2 पर परीक्षण किया गया है; पाइथन 3.2 के साथ काम के रूप में काम नहीं कर रहा है, लेकिन फिर, आप Python 3.x में do this right कर सकते हैं।
import sys
class NoDupNames(object):
def __init__(self):
self.namespaces = []
def __call__(self, frame, event, arg):
if event == "call":
if frame.f_code.co_flags == 66:
self.namespaces.append({})
elif event in ("line", "return") and self.namespaces:
for key in frame.f_locals.iterkeys():
if key in self.namespaces[-1]:
raise NameError("attribute '%s' already declared" % key)
self.namespaces[-1].update(frame.f_locals)
frame.f_locals.clear()
if event == "return":
frame.f_locals.update(self.namespaces.pop())
return self
def __enter__(self):
self.oldtrace = sys.gettrace()
sys.settrace(self)
def __exit__(self, type, value, traceback):
sys.settrace(self.oldtrace)
उपयोग:
with NoDupNames():
class Foo(object):
num = None
num = 42
परिणाम:
NameError: attribute 'num' already declared
यह कैसे काम करता है: हम प्रणाली का पता लगाने के हुक अप करने के लिए हुक। प्रत्येक बार पाइथन एक लाइन निष्पादित करने वाला है, हमें बुलाया जाता है। यह हमें देखने के लिए अनुमति देता है कि अंतिम कथन निष्पादित किए गए नामों को किस नाम से परिभाषित किया गया था। यह सुनिश्चित करने के लिए कि हम डुप्लिकेट को पकड़ सकते हैं, हम वास्तव में अपने स्थानीय चर परिवर्तक को बनाए रखते हैं और प्रत्येक पंक्ति के बाद पायथन को साफ़ करते हैं। कक्षा परिभाषा के अंत में, हम अपने स्थानीय लोगों को वापस पाइथन में कॉपी करते हैं। कुछ अन्य टॉमफूलरी नेस्टेड क्लास परिभाषाओं को संभालने और एकल कथन में एकाधिक असाइनमेंट को संभालने के लिए वहां है।
नकारात्मक के रूप में, हमारे "सभी स्थानीय लोगों को साफ़ करें!"दृष्टिकोण यदि आप ऐसा नहीं कर सकते हैं मतलब है:
with NoDupNames():
class Foo(object):
a = 6
b = 7
c = a * b
क्योंकि जहाँ तक अजगर जानता है के रूप में, वहाँ कोई नाम a
और b
जब c = a * b
क्रियान्वित किया जाता हैं, के रूप में हम उन्हें देखा था हम जितनी जल्दी उन को मंजूरी दे दी इसके अलावा, अगर। आप एक ही चर दो बार एक पंक्ति में (जैसे, a = 0; a = 1
) यह भी समझ नहीं होगा इसके अलावा आवंटित । हालांकि, यह अधिक विशिष्ट वर्ग परिभाषा के लिए काम करता है।
, आप एक के अंदर वर्ग परिभाषाओं के अलावा कुछ भी नहीं रखना चाहिए NoDupNames
संदर्भ। मुझे नहीं पता कि क्या होगा, शायद कुछ भी बुरा नहीं है। लेकिन मैंने कोशिश नहीं की है, इसलिए सिद्धांत में ब्रह्मांड को अपने स्वयं के प्लूघोल में चूसा जा सकता है।
यह संभवतः सबसे बुरा कोड है जिसे मैंने कभी लिखा है, लेकिन यह निश्चित रूप से मजेदार था!
प्रतिलिपि बनाना और चिपकाना आम तौर पर खराब कोडिंग अभ्यास का संकेत है - अधिकांश समय इसका मतलब है कि आपको किसी अन्य कार्य में कार्यक्षमता निकालना चाहिए। यदि आप इसे बाद में बदलना चाहते हैं, और इन तरह की समस्याएं हैं, तो यह समय, प्रयास को बचाएगा। –
लैटवेयर: आम तौर पर मैं सहमत हूं। हालांकि, यह यूनिट टेस्ट कोड है, जिसमें यह सर्वोत्तम अभ्यास है और उम्मीद है कि आपके पास छोटी विधियों का एक गुच्छा है, जिनमें से अधिकांश अलग-अलग सेटअप स्थितियों और दावों को छोड़कर काफी समान दिखते हैं। तो मैं कहूंगा कि कट और पेस्ट पाठ्यक्रम के लिए बराबर है, और बुरा अभ्यास का प्रतिनिधि नहीं है। –
@ स्कोटी: आप इसे कॉपी करने के बाद अपनी पहली कार्रवाई के रूप में एक विधि का नाम बदलने की आदत क्यों नहीं लेते? वैसे, यदि प्रत्येक विधि के लिए सेटअप कोड और दावे अलग-अलग हैं, तो केवल एक चीज जिसे आप वास्तव में कॉपी कर रहे हैं वह विधि का नाम है, जिसे आपने देखा होगा। –