एनोटेशन
- 10 मिनट्स
संदर्भ कार्यान्वयन का निर्माण करने के तरीके को समझने के लिए, हमें पहले संदर्भ कार्यान्वयन के बिल्डिंग ब्लॉक्स पर एक नज़र डालनी चाहिए: एनोटेशन।
एनोटेशन पायथन ऑब्जेक्ट हैं जो एक प्रशिक्षक प्रत्येक सबमिशन पर शर्तों पर जोर देने के लिए बनाता है; ये स्थितियां किसी मान की उपस्थिति, मूल्यों के बीच अस्थायी संबंध या यहां तक कि कोड के ब्लॉक की समय जटिलता जैसी चीजें हो सकती हैं। आप pybryt
पैकेज द्वारा प्रदान की गई कक्षाओं को तत्काल करके एनोटेशन बना सकते हैं।
एनोटेशन के तीन मुख्य प्रकार हैं:
- मूल्य एनोटेशन, जो छात्र के स्मृति पदचिह्न में कुछ मूल्य की उपस्थिति का दावा करते हैं।
- संबंधपरक एनोटेशन, जो छात्र के स्मृति पदचिह्न में मूल्यों के बीच संबंध का दावा करते हैं और बूलियन तर्क या अस्थायीता में स्थापित होते हैं।
- जटिलता एनोटेशन, जो कोड के एक ब्लॉक पर समय जटिलता का दावा करते हैं।
इस मॉड्यूल में, हम पहले प्रकार पर चर्चा करते हैं।
मूल्य एनोटेशन
मूल्य एनोटेशन छात्र के स्मृति पदचिह्न में मूल्य की उपस्थिति पर जोर दे हैं। वे वर्ग pybryt.Value
को तत्काल करके बनाए गए हैं, जो उस मूल्य को लेता है जिसे आप अपने एकमात्र स्थितिगत तर्क के रूप में देखना चाहते हैं।
उदाहरण के लिए, विचार करें कि आप यह जांचना चाहते थे कि एक छात्र ने एक सरणी को सही ढंग से प्रारंभ किया है। एक संदर्भ कार्यान्वयन में, आप सरणी को प्रारंभ करेंगे, फिर कक्षा का एक उदाहरण बनाएंगे:
>>> np.random.seed(42)
>>> arr = np.random.normal(size=(100,100))
>>> pybryt.Value(arr)
pybryt.Value
PyBryt आपके द्वारा बनाए गए सभी एनोटेशन को ट्रैक करता है, इसलिए जब तक आप उन्हें अधिक जटिल एनोटेशन बनाने के लिए उपयोग नहीं करना चाहते, तब तक उन्हें एक चर को असाइन करने की कोई आवश्यकता नहीं है।
मान एनोटेशन, जब संख्यात्मक मानों की जांच करने के लिए उपयोग किया जाता है - जिसमें सरणियाँ, संख्याओं के पुनरावृत्त और डेटाफ्रेम शामिल हैं - atol
और rtol
तर्कों का उपयोग करके पूर्ण और सापेक्ष सहिष्णुता का भी समर्थन करते हैं:
>>> value_annotation = pybryt.Value(arr, atol=1e-3)
>>> value_annotation.check_against(arr.round(3)), value_annotation.check_against(arr.round(2))
(True, False)
विधि pybryt.Value.check_against
एक बूलियन मान देता है जो दर्शाता है कि क्या इसे पारित वस्तु मूल्य एनोटेशन को संतुष्ट करती है। जैसा कि पहले दिखाया गया है, $10^{-3}$
की पूर्ण सहिष्णुता की अनुमति देकर, मान संतुष्ट था जब सरणी मानों को तीन स्थानों पर गोल किया गया था, लेकिन दो स्थानों पर गोल होने पर विफल रहा।
तुल्यता कार्य
जबकि Value
ऑब्जेक्ट यह निर्धारित करने के लिए एक एल्गोरिथ्म को परिभाषित करते हैं कि क्या दो ऑब्जेक्ट बराबर हैं, वे उपयोगकर्ताओं को तुलना के लिए उपयोग करने के लिए एक कस्टम तुल्यता फ़ंक्शन निर्दिष्ट करने की अनुमति भी देते हैं। उदाहरण के लिए, मान लें कि आप छात्र के कोड में एक स्ट्रिंग देखना चाहते थे, लेकिन उस स्ट्रिंग के पूंजीकरण के बारे में असंबद्ध थे। आप एक कस्टम तुल्यता फ़ंक्शन का उपयोग कर सकते हैं जो दो स्ट्रिंग्स के लोअरकेस प्रतिनिधित्व की तुलना करता है:
def str_equal_lower(s1, s2):
return s1.lower() == s2.lower()
फिर, आप हेक्साडेसिमल स्ट्रिंग्स की जांच करने के लिए Value
एनोटेशन बनाने के लिए इस फ़ंक्शन का उपयोग कर सकते हैं, उदाहरण के लिए:
>>> message = "hash me"
>>> sha1_hash = hashlib.sha1(message.encode()).hexdigest()
>>> sha1_annotation = pybryt.Value(sha1_hash, equivalence_fn=str_equal_lower)
>>> sha1_annotation.check_against(sha1_hash.upper())
True
एनोटेशन विकल्प
सभी एनोटेशन समर्थन विकल्प जो आपको उन एनोटेशन के पास या असफल होने के परिणामस्वरूप आपके छात्रों को प्राप्त प्रतिक्रिया को दर्जी करने की अनुमति देते हैं। इस प्रतिक्रिया को प्रदान करने के दो प्राथमिक तरीके कन्स्ट्रक्टर में success_message
और failure_message
तर्कों का उपयोग कर रहे हैं, जो सभी एनोटेशन के लिए उपलब्ध हैं:
v = pybryt.Value(1, success_message="Found 1!", failure_message="Didn't find 1 :(")
यदि मान छात्र के मेमोरी फुटप्रिंट में पाया जाता है, तो success_message
उस रिपोर्ट में शामिल है जो PyBryt का छात्र कार्यान्वयन चेकर उत्पन्न करता है; यदि यह नहीं मिलता है, तो failure_message
शामिल है। यदि ये तर्क प्रदान नहीं किए जाते हैं, तो कोई संदेश नहीं दिखाया जाता है।
इन संदेशों को एनोटेशन ऑब्जेक्ट में संगत रूप से नामित फ़ील्ड को अपडेट करके भी सेट किया जा सकता है:
v.success_message = "Congrats!"
v.failure_message = "Try again"
संग्रह एनोटेशन
रिलेशनल एनोटेशन का सबसे बुनियादी प्रकार संग्रह एनोटेशनहै, जो बस एनोटेशन के एक समूह को एक साथ एकत्र करता है ताकि उन्हें एक इकाई के रूप में संचालित किया जा सके। संग्रह में एनोटेशन के क्रम को लागू करना संभव है (सम्मिलन आदेश के आधार पर), लेकिन यह प्रवर्तन वैकल्पिक है। अन्य सभी एनोटेशन की तरह, success_message
और failure_message
तर्कों का उपयोग करके संग्रह संतुष्ट है या नहीं, इसके आधार पर प्रतिक्रिया प्रदान की जा सकती है।
संग्रह बनाने के लिए, किसी pybryt.Collection
को तत्काल करें. कन्स्ट्रक्टर किसी भी संख्या में स्थितीय तर्क लेता है, जो संग्रह में एनोटेशन के प्रारंभिक सेट के अनुरूप है। एक खाली संग्रह को प्रारंभ करने के लिए, कोई स्थितिगत तर्क प्रदान न करें।
col = pybryt.Collection(pybryt.Value(1))
संग्रह में एनोटेशन के क्रम को लागू करने के लिए, enforce_order=True
पास करें:
col = pybryt.Collection(pybryt.Value(1), enforce_order=True)
आप pybryt.Collection.add
का उपयोग करके संग्रह में एनोटेशन जोड़ सकते हैं:
col.add(pybryt.Value(2))
एक एनोटेशन संग्रह संतुष्ट होता है जब उसके सभी बच्चे संतुष्ट होते हैं और, यदि enforce_order
सच है, तो उसके बच्चों के संतोषजनक टाइमस्टैम्प गैर-घटते क्रम में होते हैं। उदाहरण के लिए, आइए दो मेमोरी फुटप्रिंट के खिलाफ col
की जांच करें: एक जिसमें 1 2 से पहले होता है, और दूसरा जिसमें 2 1 से पहले होता है।
>>> col.check(pybryt.MemoryFootprint.from_values(1, 1, 2, 2)), col.check(pybryt.MemoryFootprint.from_values(2, 1, 1, 2))
(AnnotationResult(satisfied=True, annotation=pybryt.Collection),
AnnotationResult(satisfied=False, annotation=pybryt.Collection))
एनोटेशन संग्रह एनोटेशन को एक साथ समूहीकृत करने के लिए उपयोगी हो सकते हैं जो एकजुट प्रतिक्रिया प्रदान करने के लिए एक समस्या के कुछ हिस्सों का प्रतिनिधित्व करते हैं। उदाहरण के लिए, यदि आप संख्याओं की सूची का योग करने के लिए संदर्भ लिख रहे हैं, तो आप प्रत्येक आंशिक योग के लिए एक संग्रह में एक एनोटेशन डाल सकते हैं जिसमें इसकी अपनी सफलता और विफलता संदेश हैं। छात्रों को तब उनकी राशि को मान्य करने के लिए उनकी प्रतिक्रिया में एक संदेश मिलता है। आप इस संग्रह का उपयोग सूची पर पुनरावृत्ति के क्रम को लागू करने के लिए भी कर सकते हैं, यह सुनिश्चित करने के लिए कि छात्र सही क्रम में जा रहे हैं।
केवल संग्रह से परे कई और प्रकार के संबंधपरक एनोटेशन हैं। आप उन्नत PyBryt मॉड्यूल में अधिक जान सकते हैं।