पायथनच्या नवीन मॅच-केस पॅटर्नमध्ये डिकोडिंग सिंटॅक्स त्रुटी
Python 3.10 ने एक शक्तिशाली सादर केले जुळणी प्रकरण विधान, विकासकांना जटिल कंडिशन हाताळण्याचा एक स्वच्छ मार्ग वचन देतो. तथापि, हे जितके उपयुक्त वाटते तितकेच, अनेक Python उत्साहींना याद्या आणि शब्दकोषांसारख्या विशिष्ट डेटा स्ट्रक्चर्ससह मॅच-केस समाकलित करताना अनपेक्षित समस्यांचा सामना करावा लागतो. 🐍
व्हेरिएबलची a शी तुलना करण्याचा प्रयत्न करताना एक सामान्य समस्या उद्भवते शब्दकोश की यादी. अनेक वापरकर्ते, माझ्यासारखे, देखभाल सुलभ करण्यासाठी सूचीमध्ये की आयोजित करण्यास प्राधान्य देतात. तथापि, हा दृष्टिकोन निराशाजनक ठरू शकतो "सिंटॅक्स एरर: अवैध सिंटॅक्सजेव्हा मॅच-केससह वापरले जाते.
विशेष म्हणजे, पारंपारिक वापरताना समान तुलना निर्दोषपणे कार्य करते जर-तर विधाने, जे प्रश्न उपस्थित करतात: मॅच-केससह ते सारखेच का वागत नाही? ही समस्या विशेषतः गोंधळात टाकणारी आहे कारण मॅच-केस कोड सुलभ करण्यासाठी आहे, नवीन वाक्यरचना अडथळे जोडण्यासाठी नाही.
या लेखात, आम्ही व्यावहारिक उदाहरणे पाहू आणि समस्येचे कारण काय आहे ते शोधू. पायथनचे स्ट्रक्चरल पॅटर्न जुळणारे या परिस्थितींचे कसे अर्थ लावतात आणि नितळ अनुभवासाठी तुमचा कोड कसा जुळवून घ्यायचा ते आम्ही तपासू. या आव्हानाचा एकत्रितपणे सामना करूया! 👨💻
आज्ञा | वापराचे उदाहरण |
---|---|
match | पायथनमध्ये पॅटर्न मॅचिंग सुरू करण्यासाठी वापरले जाते, जेथे केस क्लॉजद्वारे निर्दिष्ट केलेल्या पॅटर्नच्या मालिकेसाठी खालील अभिव्यक्ती तपासली जाते. ही रचना एकाधिक परिस्थिती हाताळताना if-else च्या तुलनेत क्लिनर सिंटॅक्ससाठी परवानगी देते. |
case _ | मॅच-केस ब्लॉकमध्ये "कॅच-ऑल" किंवा डीफॉल्ट केस म्हणून कार्य करते. जेव्हा इतर कोणतेही पॅटर्न जुळत नाहीत, तेव्हा केस _ कार्यान्वित केले जाते, जे if-else स्ट्रक्चर्समधील "else" विधानाच्या समतुल्य असते. हे सुनिश्चित करते की सर्व इनपुट हाताळले जातात, कोड मजबूतता सुधारते. |
TypeError | जेव्हा एखादा अनपेक्षित डेटा प्रकार फंक्शन किंवा ऑपरेशनला पास केला जातो तेव्हा प्रकरणे हाताळण्यासाठी येथे अपवाद प्रकार वापरला जातो. TypeError पकडणे स्क्रिप्टला अचानक बंद होण्याऐवजी अवैध इनपुट प्रकारांना छान प्रतिसाद देण्यास सक्षम करते. |
self.assertEqual() | पायथनमधील युनिट चाचणीसाठी विशिष्ट, ही पद्धत फंक्शनचे आउटपुट अपेक्षित परिणामाशी जुळते का ते तपासते. स्क्रिप्टचा प्रत्येक भाग कोडच्या विश्वासार्हतेला समर्थन देत विविध परिस्थितींमध्ये हेतूनुसार वागतो हे सत्यापित करण्यासाठी हे आवश्यक आहे. |
unittest.TestCase | पायथनच्या युनिटेस्ट फ्रेमवर्कमधील एक वर्ग, जो संघटित पद्धतीने चाचणी प्रकरणे परिभाषित करण्यास अनुमती देतो. टेस्टकेस सबक्लासमधील प्रत्येक पद्धत एका अद्वितीय चाचणी परिस्थितीशी संबंधित आहे, मॉड्यूलर आणि पुन्हा वापरण्यायोग्य चाचणी धोरणांना समर्थन देते. |
def check_selection() | पुन्हा वापरता येण्याजोगे कार्य परिभाषित करते जे पूर्वनिर्धारित प्रकारांविरूद्ध निवडलेल्या आयटमची तपासणी करण्यासाठी मुख्य तर्क अंतर्भूत करते. चेक_सेलेक्शन सारख्या फंक्शन्समध्ये कोड मॉड्युलर करणे वाचनीयता वाढवते आणि विशिष्ट लॉजिकचे सोपे बदल किंवा चाचणी सक्षम करते. |
unittest.main() | थेट कार्यान्वित केल्यावर फाइलमधील सर्व चाचणी प्रकरणे चालवते. हे कोणत्याही टेस्टकेस क्लासेसमध्ये सर्व चाचणी पद्धती शोधते आणि चालवते, ज्यामुळे वातावरणात सहज चाचणी अंमलात आणता येते. हे बदलांनंतर कोड सुसंगतता प्रमाणित करण्यासाठी उपयुक्त ठरते. |
case "LF" | मॅच-केस स्ट्रक्चरमधील एक विशिष्ट पॅटर्न जो जुळत असलेले मूल्य "LF" च्या बरोबरीचे आहे की नाही हे तपासते. शाब्दिक मूल्यांशी थेट जुळवून, आम्ही तुलना वाक्यरचना सुलभ करतो आणि वाचनीयता वाढवून अतिरिक्त नेस्टेड इफ-एलसे स्टेटमेंट टाळतो. |
print() (in match-case) | मॅच-केस ब्लॉकमध्ये, नमुना जुळण्यांवर आधारित फीडबॅक देण्यासाठी प्रत्येक केससाठी प्रिंट() वापरला जातो. येथे प्रिंट() स्टेटमेंट्स ठेवून, स्क्रिप्ट प्रति केस थेट आउटपुट प्रदान करते, जलद डीबगिंग आणि सुलभ स्थिती सत्यापनास अनुमती देते. |
self.assertEqual(check_selection(...)) | assertEqual चाचणीला check_selection च्या आउटपुटसह एकत्र करते, ज्यामुळे वेगवेगळ्या इनपुटसाठी अपेक्षित आउटपुट प्रमाणित करणे शक्य होते. चाचणीची ही पद्धत हे सुनिश्चित करते की चेक_सेलेक्शनमधील प्रत्येक मॅच-केस परिस्थिती डिझाइन केल्याप्रमाणे वागते. |
याद्यांसह पायथन मॅच-केसमधील वाक्यरचना त्रुटी सोडवणे
पहिले स्क्रिप्ट उदाहरण पारंपारिक वापरून उपाय दाखवते if-elif-else सूचीमधील मूल्यांशी निवडलेल्या इनपुटची तुलना करण्यासाठी विधाने. पायथन 3.10 आणि 3.12 सह कार्य करताना हा दृष्टीकोन आवश्यक आहे, जेथे जुळणी प्रकरण सिंटॅक्सला सूची किंवा शब्दकोशातील घटकांशी थेट तुलना करताना समस्या येतात. येथे, स्क्रिप्ट मधील मूल्यांद्वारे पुनरावृत्ती होते चाचणी_प्रकार, स्ट्रिंगची सूची, आणि सह तुलना करते चाचणी_निवडलेली. जर चाचणी करून चाचणी_निवडलेली विशिष्ट सूची निर्देशांकांच्या बरोबरीने, आम्ही जुळणाऱ्या मूल्यांवर आधारित सशर्त कोड कार्यान्वित करू शकतो. ही पद्धत एक कार्यक्षम फॉलबॅक प्रदान करते, विशेषत: जर Python चे नवीन पॅटर्न जुळणारे वाक्यरचना वापरणे काही डेटा संरचना हाताळण्यासाठी अविश्वसनीय असल्याचे सिद्ध करते. की संग्रहित करण्यासाठी सूचीवर अवलंबून राहण्याची सवय असलेल्या विकासकांसाठी, ही रणनीती जुळणी आढळल्यास सातत्यपूर्ण आउटपुट सुनिश्चित करते, कारण फॉलबॅक एल्स् स्टेटमेंट हमी देते की न जुळणारी परिस्थिती "एरर" आउटपुट तयार करते. 🐍
दुसऱ्या स्क्रिप्टमध्ये, आम्ही पायथनच्या मॅच-केस सिंटॅक्सचा वापर करून एक दृष्टिकोन शोधतो. जरी जटिल कंडिशनल स्ट्रक्चर्स सुलभ करण्यासाठी हे आदर्श असले तरी, मॅच-केस अद्याप विशिष्ट समायोजनांशिवाय सूची किंवा शब्दकोशांशी थेट तुलना हाताळत नाही. तुलना करण्याऐवजी चाचणी_निवडलेली सूचीच्या विरूद्ध, आम्ही प्रत्येक अपेक्षित मूल्य केस स्थिती म्हणून लिहितो. अशा प्रकारे, प्रत्येक केस स्पष्टपणे स्ट्रिंग जुळणी हाताळते, नेस्टेड if-else स्टेटमेंट्स काढून टाकून वाचनीयता वाढवते. पॅटर्न मॅचिंग कोड स्पष्टता सुधारण्यासाठी डिझाइन केले असल्याने, प्रत्येक संभाव्य स्थितीला एकल केस म्हणून ठेवल्याने तो हेतू साध्य करण्यात मदत होते आणि पायथनच्या याद्या थेट हाताळण्याच्या मर्यादेसाठी एक प्रभावी उपाय प्रदान करते. सध्याच्या स्वरूपात Python च्या मॅच-केसशी अद्याप सुसंगत नसलेल्या संरचित डेटासह कार्य करताना येणाऱ्या वाक्यरचना त्रुटी देखील हे टाळते.
पुढे जाताना, तिसरी स्क्रिप्ट मॉड्यूलरिटी आणि पुन: उपयोगिता वाढवण्यासाठी कार्ये समाविष्ट करून या संरचनेवर तयार करते. व्याख्या करणे चेक_निवड फंक्शन, उदाहरणार्थ, आम्हाला कोर लॉजिक एन्कॅप्स्युलेट करण्यास अनुमती देते, ज्यामुळे प्रोग्रामच्या इतर भागांमध्ये फंक्शन कॉल करणे सोपे होते. ही मॉड्युलॅरिटी मोठ्या ऍप्लिकेशन्समध्ये विशेषतः उपयुक्त आहे जिथे अनेक ठिकाणी निवड तपासणी आवश्यक असू शकते. फंक्शनमध्ये कॅचिंगद्वारे अपवाद हाताळणी देखील समाविष्ट आहे TypeError, जे अनपेक्षित इनपुट कृपापूर्वक व्यवस्थापित करण्यात मदत करते. वास्तविक-जागतिक परिस्थितींमध्ये, जसे की वेब फॉर्ममध्ये वापरकर्ता इनपुट किंवा API कॉल, अवैध डेटा दिल्यास प्रोग्राम क्रॅश होणार नाही याची खात्री करणे आवश्यक आहे. बिल्ट-इन एरर हँडलिंगसह मॉड्यूलर फंक्शन्स प्रोग्राम्समध्ये स्थिरता वाढवतात आणि देखभालक्षमता सुधारतात. 👨💻
शेवटी, चौथ्या उदाहरणात पायथनचा वापर करून युनिट चाचणी समाविष्ट केली आहे एकक चाचणी मॉड्युल, वेगवेगळ्या इनपुट्सवर मॅच-केस सोल्यूशनची अचूकता सत्यापित करते. TestCase वर्गातील प्रत्येक चाचणी पद्धत संभाव्य मूल्याचे अनुकरण करते चाचणी_निवडलेली, जसे की "पूर्ण श्रेणी" किंवा "LF", आणि आउटपुट अपेक्षेशी जुळत आहे का ते तपासते. कोड लॉजिकमधील कोणताही बदल अनपेक्षित वर्तनास कारणीभूत होणार नाही याची खात्री करून, मोठ्या प्रकल्पांमध्ये अशा प्रकारे प्रत्येक काठाच्या केसची चाचणी करणे अमूल्य आहे. Unitest हे पुष्टी करण्यात मदत करते की आमच्या मॅच-केस स्टेटमेंटमधील प्रत्येक केस अनेक वातावरणात कार्य करते, ज्यामुळे ते विविध इनपुट परिस्थितींसाठी अधिक विश्वासार्ह आणि मजबूत बनते. विकास प्रक्रियेत चाचण्यांचा समावेश केल्याने कोड गुणवत्ता आणि विश्वासार्हता वाढते, विशेषत: कोडबेसमध्ये जेथे वारंवार बदल होऊ शकतात.
याद्या आणि शब्दकोशांची तुलना करताना पायथन मॅच-केस सिंटॅक्स त्रुटी हाताळणे
सूची तुलनेसह सशर्त तर्क व्यवस्थापित करण्यासाठी if-else कंडिशनल्स वापरून पायथन बॅक-एंड स्क्रिप्ट
test_types = ["Full range", "LF", "HF"]
test_selected = "Full range"
# Using if-elif-else to handle comparisons without match-case
if test_selected == test_types[0]:
print("mana")
elif test_selected == test_types[1]:
print("banana")
else:
print("error")
# Output will be 'mana' since test_selected matches test_types[0]
यादी तुलनासाठी पायथनच्या मॅच-केससह समाधान
Python 3.10 आणि उच्च मधील मॅच-केससह बॅक-एंड दृष्टीकोन प्रदर्शित करते, सूचीमधील वैयक्तिक मूल्ये तपासते
१
मॉड्यूलर फंक्शन्स आणि एरर हँडलिंगसह वर्धित आवृत्ती
Python बॅक-एंड स्क्रिप्ट एरर हाताळणीसह, पुनर्वापरतेसाठी फंक्शन्स वापरते
test_types = ["Full range", "LF", "HF"]
test_selected = "Full range"
def check_selection(selected, types):
"""
Function to check selected item against list of types.
Includes error handling for invalid input.
"""
try:
match selected:
case "Full range":
return "mana"
case "LF":
return "banana"
case _: # Default case
return "error"
except TypeError:
return "Invalid input - not a string"
# Execute function and print result
result = check_selection(test_selected, test_types)
print(result)
पायथनच्या युनिटटेस्ट लायब्ररीसह युनिट चाचणी
वातावरणात मॅच-केस कार्यक्षमता प्रमाणित करण्यासाठी पायथन युनिट चाचण्या
import unittest
# Import function to be tested from our main code
from main_code import check_selection
class TestSelectionMatching(unittest.TestCase):
def test_full_range(self):
self.assertEqual(check_selection("Full range", ["Full range", "LF", "HF"]), "mana")
def test_lf(self):
self.assertEqual(check_selection("LF", ["Full range", "LF", "HF"]), "banana")
def test_default(self):
self.assertEqual(check_selection("Unknown", ["Full range", "LF", "HF"]), "error")
def test_invalid_type(self):
self.assertEqual(check_selection(123, ["Full range", "LF", "HF"]), "Invalid input - not a string")
# Run unit tests if script is executed directly
if __name__ == '__main__':
unittest.main()
पायथनचे पॅटर्न मॅचिंग एक्सप्लोर करणे: कॉमन पीटफॉल्स आणि सिंटॅक्स सोल्यूशन्स
अजगराचा स्ट्रक्चरल पॅटर्न जुळणे, Python 3.10 मध्ये सादर केले गेले, विकसकांना जटिल कंडिशनल सुलभ करण्यात आणि कोड वाचनीयता सुधारण्यात मदत करण्यासाठी डिझाइन केले आहे. तथापि, हे वैशिष्ट्य अद्याप तुलनेने नवीन आहे, याचा अर्थ विकासक कदाचित अनुभवू शकतात अनपेक्षित वाक्यरचना समस्या विशिष्ट संदर्भांमध्ये वापरताना, जसे की सूचीतील घटकांशी जुळणारे घटक किंवा शब्दकोश की थेट. जेव्हा तुम्हाला एकाधिक परिस्थिती कार्यक्षमतेने हाताळण्याची आवश्यकता असते तेव्हा मॅच-केस रचना आदर्श असते. परंतु जेव्हा तुम्ही मूल्यांच्या सूचीशी थेट जुळण्याचा प्रयत्न करता तेव्हा समस्या उद्भवतात, कारण Python ला सूची निर्देशांकांमध्ये थेट प्रवेश न करता प्रत्येक केस नमुना वैध स्टँडअलोन अभिव्यक्ती असणे आवश्यक आहे.
एक सामान्यतः आढळणारी समस्या म्हणजे "वाक्यरचना त्रुटी: अवैध सिंटॅक्स" जे मॅच-केस स्टेटमेंटमधील सूची घटकांसह व्हेरिएबलची तुलना करण्याचा प्रयत्न करताना उद्भवते. ही वाक्यरचना त्रुटी सामान्यतः उद्भवते कारण मॅच-केस थेट सूची तुलना हाताळण्यासाठी ऑप्टिमाइझ केलेले नाही; त्याऐवजी, स्ट्रिंग्सची तुलना करताना ते अधिक चांगले कार्य करते, शाब्दिक, किंवा ट्यूपल्स याच्या आसपास जाण्यासाठी, प्रत्येक घटक सूची म्हणून न वापरता, व्यक्तिचलितपणे निर्दिष्ट करणे आवश्यक आहे case test_types[1], तुम्ही वापरू शकता १ सुरळीत अंमलबजावणीसाठी थेट. हा दृष्टिकोन वाक्यरचना त्रुटी न आणता कार्यक्षमता राखतो.
मॅच-केस वाचनीयतेच्या फायद्यांसह सूचीची लवचिकता हवी असलेल्या विकसकांसाठी, दुसरा पर्याय वापरत आहे गणना डायनॅमिक पॅटर्न मॅचिंग तयार करण्यासाठी सानुकूल फंक्शन्ससह. फंक्शन्समध्ये पॅटर्नची रचना करून किंवा मदतनीस सूची वापरून, तुम्ही वाक्यरचना मर्यादा टाळून जुळण्यासारखी रचना मिळवू शकता. डिक्शनरी की सह डायनॅमिक ऍप्लिकेशन्स कोडिंग करताना ही वर्कअराउंड आवश्यक आहे, कारण प्रत्येक कीला मॅच-केस ब्लॉकमधील सर्व संभाव्य मूल्य हार्डकोड न करता स्वतंत्र जुळणी म्हणून मानले जाऊ शकते. अशा पद्धती लवचिकता वाढवतात, कोड जसजसा वाढत जातो तसतसे देखभालक्षमता सुनिश्चित करते. 👨💻
Python च्या मॅच-केस सिंटॅक्स समस्यांवर वारंवार विचारले जाणारे प्रश्न
- याद्या वापरताना मॅच-केस सिंटॅक्स एरर का देतो?
- द SyntaxError घडते कारण मॅच-केस सूची-आधारित तुलनांऐवजी थेट पॅटर्नची अपेक्षा करते, जे केस स्ट्रक्चरमध्ये थेट समर्थित नाहीत.
- डिक्शनरी कीशी तुलना करताना मी सिंटॅक्स एरर मॅच-केससह कशी टाळू शकतो?
- प्रकरणांमध्ये थेट सूची किंवा शब्दकोश घटकांमध्ये प्रवेश करणे टाळा. त्याऐवजी, वैयक्तिक सेट करण्याचा प्रयत्न करा case प्रत्येक की किंवा मूल्यासाठी विधाने.
- मॅच-केस सूचीसह कार्य करत नसल्यास मी कोणते पर्यायी दृष्टिकोन वापरू शकतो?
- वापरण्याचा विचार करा if-elif सूचीसह डायनॅमिक तुलना हाताळण्यासाठी हेल्पर फंक्शनमधील स्टेटमेंट्स किंवा स्ट्रक्चरिंग पॅटर्न, जे लवचिकता देते आणि वाक्यरचना त्रुटी टाळते.
- मी जटिल कंडिशनलमध्ये कोड वाचनीयता सुलभ करण्यासाठी मॅच-केस वापरू शकतो का?
- होय, मॅच-केस बहुविध परिस्थितींसाठी कोड वाचनीयता मोठ्या प्रमाणात सुलभ करू शकते, विशेषत: सूची किंवा अनुक्रमणिका ऐवजी थेट भिन्न शाब्दिक मूल्ये व्यवस्थापित करताना.
- पायथन आधीच्या आवृत्त्यांमध्ये मॅच-केसला सपोर्ट करते का?
- नाही, ५ Python 3.10 मध्ये सादर केले होते, त्यामुळे पूर्वीच्या आवृत्त्या या वाक्यरचनाला समर्थन देत नाहीत. तुमचा प्रोजेक्ट मॅच-केसवर जास्त अवलंबून असल्यास अपग्रेड करण्याचा विचार करा.
- मॅच-केसमध्ये मी डीफॉल्ट केस कसे जोडू?
- वापरा case _ कोणतेही न जुळणारे नमुने पकडण्यासाठी अंतिम केस म्हणून, एक सारखे ७ पारंपारिक सशर्त मध्ये विधान.
- मॅच-केस if-elif पेक्षा वेगवान आहे का?
- जटिल जुळणाऱ्या परिस्थितींसाठी, मॅच-केस सामान्यतः अधिक कार्यक्षम असते कारण ते पॅटर्न जुळणीसाठी ऑप्टिमाइझ केलेले असते. तथापि, साध्या सशर्तांसाठी, दोघेही तुलनेने कामगिरी करतात.
- मी मॅच-केस सिंटॅक्सची चाचणी कशी करू?
- आपण पायथन वापरू शकता unittest चाचणी प्रकरणे तयार करण्यासाठी लायब्ररी, त्या प्रत्येकाचे प्रमाणीकरण case विविध इनपुट अंतर्गत अपेक्षित आउटपुट तयार करते.
- मॅच-केस अपवाद हाताळू शकतात?
- मॅच-केस स्वतःच अपवाद हाताळत नसताना, तुम्ही ते ए मध्ये गुंडाळू शकता try-except सारख्या त्रुटी व्यवस्थापित करण्यासाठी ब्लॉक करा TypeError.
- मॅच-केस नेस्टेड डिक्शनरीसह कार्य करते का?
- मॅच-केस ट्यूपल्समध्ये जुळण्याला समर्थन देते आणि प्रत्येक स्तर विशिष्ट नमुन्यांशी जुळत असल्यास नेस्टेड डेटा संरचना तपासू शकतो. जटिल नेस्टेड मॅचिंगला स्पष्टतेसाठी मदतनीस कार्ये आवश्यक असू शकतात.
Python मध्ये मॅच-केस सिंटॅक्सचे निराकरण करणे
पायथनचे मॅच-केस वैशिष्ट्य जुळण्यासाठी उपयुक्त नवीन वाक्यरचना आणते, परंतु सूची किंवा शब्दकोश घटकांसह कार्य करताना त्यास मर्यादा आहेत. if-else किंवा प्रत्येक केस वैयक्तिकरित्या परिभाषित करणे यासारखे सरळ पर्याय वापरणे, सामान्य त्रुटी टाळून सातत्य सुधारू शकते.
प्रगत पॅटर्न मॅचिंग आवश्यक असलेल्या डेव्हलपरसाठी, डायरेक्ट लिस्ट किंवा डिक्शनरी मॅच टाळणारे वर्कअराउंड आवश्यक आहेत. जटिल अभिव्यक्तीशिवाय पॅटर्न स्ट्रक्चर्सचा लाभ घेणे वाचनीयता टिकवून ठेवेल आणि Python 3.10+ अनुप्रयोगांसह सुसंगतता सुनिश्चित करेल. 👨💻
पायथन मॅच-केस सिंटॅक्सवर पुढील वाचन आणि संदर्भ
- Python's वर अंतर्दृष्टी प्रदान करते जुळणी-केस वाक्यरचना आणि सूची तुलनेसह वापरल्यास त्याच्या सामान्य समस्या. तपशीलांसाठी, भेट द्या पायथन 3.10 रिलीझ नोट्स .
- संरचित नमुना जुळण्याची उदाहरणे आणि टाळण्यासाठी सर्वोत्तम पद्धतींचा समावेश आहे वाक्यरचना त्रुटी पायथन कोडमध्ये. येथे अधिक शोधा रिअल पायथन: मॅच-केस वापरणे .
- Python च्या कंडिशनल स्ट्रक्चर्ससह सूची आणि शब्दकोश हाताळण्याबद्दल मार्गदर्शन देते. भेट द्या डेटा सायन्सच्या दिशेने: पॅटर्न मॅचिंग अधिक अंतर्दृष्टीसाठी.