पायथन में टाइप करने के लिए विहित तरीका क्या है?


1276

यह जांचने का सबसे अच्छा तरीका है कि क्या दी गई वस्तु किसी प्रकार की है? कैसे के बारे में जाँच है कि क्या वस्तु एक प्रकार से विरासत में मिली है?

मान लीजिए कि मेरे पास एक वस्तु है o। मैं कैसे जांच करूं कि क्या यह एक है str?


7
ठीक है, पायथन में विहित दृष्टिकोण बिल्कुल भी प्रकार की जांच नहीं करना है (जब तक कि आप डीबगिंग नहीं कर रहे हैं)। आमतौर पर आप इसे एक स्ट्रिंग के रूप में उपयोग करने की कोशिश करते हैं (जैसे अन्य स्ट्रिंग्स के साथ कॉनटेनटेट, कंसोल को प्रिंट करना, आदि); अगर आपको लगता है कि यह विफल हो सकता है, तो try / छोड़कर या hasattr का उपयोग करें। उस ने कहा, स्वीकार किए जाते हैं जवाब है कि आप आमतौर पर अजगर दुनिया में "नहीं करना चाहिए" करने के लिए विहित तरीका है। : अधिक जानकारी के लिए, गूगल "अजगर बतख टाइपिंग" या इन पढ़ा voidspace.org.uk/python/articles/duck_typing.shtml stackoverflow.com/questions/610883/...
जॉन Coombs

9
मुझे लगता है कि श्री कूम्स गैर-जेएसएन धारावाहिक योग्य वर्गों जैसे उदाहरणों की अनदेखी कर रहे हैं। यदि किसी फ़ंक्शन (जिसका कोड प्रभावित नहीं कर सकता है) के माध्यम से डेटा का एक बड़ा हिस्सा डाल रहा है, तो कोई उस डेटा के कुछ टुकड़ों को उदाहरण के लिए, <str> को पास करने से पहले परिवर्तित करना चाहेगा। कम से कम मैं ऐसा ही हूं इस पृष्ठ पर समाप्त हुआ ...
जॉन कैरेल

2
ऐसा लगता है कि यह पूछने के लिए सबसे आम कारण है कि एक तार के तार और पुनरावृत्तियों के बीच अंतर करना चाहता है। यह एक मुश्किल सवाल है क्योंकि तार कर रहे हैं तार के iterables - एक एकल चरित्र स्ट्रिंग भी खुद का एक अनुक्रम (- एक शायद इस पर निर्भर नहीं होना चाहिए पिछली बार मैं जाँच की) है। लेकिन क्या कभी किसी स्ट्रिंग-लाइक का उपयोग होगा? जी हां । तो "मुझे तार और तार के अन्य पुनरावृत्तियों के बीच अंतर करने के लिए क्या करना चाहिए?" ठीक से है: "यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं"। :
क्लैक्

2
अजगर प्रकार एनोटेशन अब एक बात है। एक पर नजर डालें mypy
शीना

जवाबों:


1522

यह जाँचने के लिए कि oक्या कोई उदाहरण है strया किसी उपवर्ग का strउपयोग कर रहा है, आइंस्टीन का उपयोग करें (यह "विहित" तरीका होगा):

if isinstance(o, str):

यह जाँचने के लिए कि क्या प्रकार oठीक है str(उपवर्गों को बाहर करें):

if type(o) is str:

निम्नलिखित भी काम करता है, और कुछ मामलों में उपयोगी हो सकता है:

if issubclass(type(o), str):

देखें निर्मित कार्य प्रासंगिक जानकारी के लिए अजगर लाइब्रेरी संदर्भ में।

एक और ध्यान दें: इस मामले में, यदि आप पायथन 2 का उपयोग कर रहे हैं, तो आप वास्तव में उपयोग करना चाहते हैं:

if isinstance(o, basestring):

क्योंकि यह भी यूनिकोड तार पकड़ेगा ( unicodeका एक उपवर्ग नहीं है str, दोनों strऔर unicodeके उपवर्गों हैं basestring)। ध्यान दें कि basestringअब पायथन 3 में मौजूद नहीं है, जहां स्ट्रिंग्स का सख्त अलगाव है (str ) और बाइनरी डेटा ( bytes) ।

वैकल्पिक रूप से, isinstanceकक्षाओं के एक समूह को स्वीकार करता है। Trueयदि oकिसी के किसी उपवर्ग का उदाहरण है तो यह वापस आ जाएगा (str, unicode):

if isinstance(o, (str, unicode)):

31
str .__ उप-वर्ग __ () केवल str के प्रत्यक्ष उप-वर्ग को लौटाता है, और issubclass () या आइंस्टीन () के समान कार्य नहीं करता है। (ऐसा करने के लिए, आपको पुनरावर्ती कॉल करना होगा ।__ उपवर्ग __) ()।
थॉमस वाउचर

15
यह एक अच्छा जवाब है, लेकिन मुझे लगता है कि यह वास्तव में एक चेतावनी के साथ शुरू करना चाहिए जिसे आप आमतौर पर पायथन में नहीं करना चाहिए। जैसा कि यह है, यह धारणा को मान्य करता है कि यह "पायथन में करने के लिए विहित" है, जो यह नहीं है।
जॉन कूम्स ने 20

4
ये python2 उत्तर हैं। उदाहरण के लिए, पायथन 3 में कोई बेसरेस्ट्रिंग नहीं है।
dfrankow

4
उदाहरण और "बिल्कुल" के बीच अंतर क्या है? यदि type(a) is Objectऐसा नहीं है तो यह भी सच है isinstance(a, Object)। हालांकि, अगर type(a) is SubClassOfObject, फिर type(a) is Object == False, लेकिन isinstance(a, Object) == True। सही?
मविविलेज

1
@ मवविल्ज - का a is bअर्थ है ए और बी, एक ही बात है, अर्थात स्मृति में एक ही इकाई के संदर्भ में। तो aऔर bसाथ के रूप में, ठीक उसी वर्ग, नहीं उपवर्गों होना चाहिए था isinstance()। उदाहरण के लिए देखें stackoverflow.com/a/133024/1072212
टेरी ब्राउन

196

किसी ऑब्जेक्ट के प्रकार की जांच करने का सबसे पायथोनिक तरीका है ... इसे जांचना नहीं।

चूंकि पायथन डक टंकण को प्रोत्साहित करता है , आपको बस try...exceptवस्तु के तरीकों का उपयोग करना चाहिए जिस तरह से आप उनका उपयोग करना चाहते हैं। इसलिए यदि आपका फ़ंक्शन एक लिखने योग्य फ़ाइल ऑब्जेक्ट की तलाश कर रहा है, तो यह जांचें कि यह एक उपवर्ग है file, बस इसकी .write()विधि का उपयोग करने का प्रयास करें !

बेशक, कभी-कभी ये अच्छे अमूर्त टूट जाते हैं और isinstance(obj, cls)आपकी आवश्यकता होती है। लेकिन संयम से उपयोग करें।


75
IMHO, सबसे पाइथोनिक तरीका है जो भी तर्क दिया जाता है उसका सामना करना पड़ता है। अपने कोड में मैं अक्सर नहीं जान सकता कि क्या मैं किसी ऑब्जेक्ट या ऑब्जेक्ट की एक सरणी प्राप्त करता हूं, और मैं किसी एक ऑब्जेक्ट को एक-एलिमेंट सूची में बदलने के लिए आंतरिक रूप से टाइप-चेकिंग का उपयोग करता हूं।
सस्तनिन

14
बल्कि इसके बाद इसकी लेखन पद्धति का उपयोग करने की कोशिश की जा रही है, ऐसे समय हैं जब आप बिना किसी अपवाद के यह करना चाहते हैं। इस मामले में आप कर सकते हैं ... if hasattr(ob, "write") and callable(ob.write): या कुछ func = getattr(ob, "write", None) if callable(func): ...
तानाशाहों को

142
बतख टाइपिंग एक पुस्तकालय का उपयोग करने के बारे में है । टाइप चेकिंग एक लाइब्रेरी लिखने के बारे में है । एक ही समस्या डोमेन नहीं।
रिकी

16
@ रिकी, मैं असहमत हूं। बतख टाइपिंग प्रसिद्ध शब्दार्थ के साथ इंटरफेस का उपयोग करने वाली वस्तुओं के साथ बातचीत करने के बारे में है। यह या तो पुस्तकालय कोड या ऐसे पुस्तकालय का उपयोग करने वाले कोड पर लागू हो सकता है।
दान लैंस्की

6
@ nyuszika7h, Python3 में hasattrकेवल एक गुण को दर्शाता है
ideasman42

57

isinstance(o, str)वापस आ जाएगा Trueयदि oएक strया एक प्रकार का है जो विरासत में मिला है str

type(o) is strवापस आ जाएगा Trueऔर अगर केवल oएक str है। यह वापस आ जाएगी False, तो oएक प्रकार है कि से विरासत में मिली की है str


6
बेशक, यह विफल हो जाएगा यदि ऑब्जेक्ट 'str' का उदाहरण नहीं है, लेकिन इसके बजाय कुछ स्ट्रिंग-जैसा है। जैसे यूनिकोड, mmap, UserString या कोई अन्य उपयोगकर्ता-परिभाषित प्रकार। पायथन में सामान्य दृष्टिकोण टाइपेकिट्स करने के लिए नहीं है।
थॉमस वाउटर्स 11

6
आपको माफी माँगने की ज़रूरत नहीं है, अपने ही सवाल का जवाब देना ठीक है। SO उत्तर के लिए है, कर्म नहीं।
एली बेंडरस्की

2
यह बहुत मददगार है। क्योंकि बीच का अंतर isinstanceऔर type(var) == type('')स्पष्ट नहीं है।
सस्तनिन

30

सवाल पूछे जाने और जवाब देने के बाद, पायथन में टाइप संकेत जोड़े गए । पाइथन में टाइप संकेत, प्रकारों की जाँच करने की अनुमति देते हैं लेकिन सांख्यिकीय रूप से टाइप की गई भाषाओं से बहुत अलग तरीके से। अजगर में टाइप करें संकेत कार्यों के साथ जुड़े क्रम सुलभ डेटा के रूप में कार्य करता है के साथ बहस की उम्मीद प्रकार सहयोगी है और इस अनुमति देता है प्रकार की जाँच की जानी करने के लिए। प्रकार संकेत वाक्यविन्यास का उदाहरण:

def foo(i: int):
    return i

foo(5)
foo('oops')

इस मामले में, हम चाहते हैं foo('oops')कि एनोटेट प्रकार के तर्क के लिए एक त्रुटि शुरू हो जाए int। जोड़ा प्रकार संकेत का कारण नहीं है स्क्रिप्ट सामान्य रूप से चलाए जाने पर होने वाली त्रुटि का है। हालाँकि, यह फ़ंक्शन के लिए अपेक्षित प्रकारों का वर्णन करने के लिए विशेषताओं को जोड़ता है जो अन्य प्रोग्राम क्वेरी कर सकते हैं और टाइप त्रुटियों के लिए जांच कर सकते हैं।

इनमें से एक अन्य प्रोग्राम जो टाइप त्रुटि खोजने के लिए इस्तेमाल किया जा सकता है mypy:

mypy script.py
script.py:12: error: Argument 1 to "foo" has incompatible type "str"; expected "int"

(आपको स्थापित करने की आवश्यकता हो सकती है mypy अपने पैकेज मैनेजर से । मुझे नहीं लगता कि यह सीपीथॉन के साथ आता है, लेकिन लगता है कि "आधिकारिकता" का कुछ स्तर है।)

इस तरह से जाँच करना, सांख्यिकीय रूप से संकलित भाषाओं में टाइप जाँच से अलग है। क्योंकि पायथन में प्रकार गतिशील होते हैं, टाइप चेकिंग रनटाइम पर की जानी चाहिए, जो एक लागत लगाता है - यहां तक ​​कि सही कार्यक्रमों पर - अगर हम जोर देते हैं कि यह हर मौके पर होता है। स्पष्ट प्रकार की जांच आवश्यकता से अधिक प्रतिबंधात्मक हो सकती है और अनावश्यक त्रुटियों का कारण बन सकती है (जैसे कि तर्क वास्तव में सटीक होना चाहिएlist प्रकार या क्या यह पर्याप्त रूप से पर्याप्त है?)।

स्पष्ट प्रकार की जाँच का नकारात्मक पक्ष यह है कि यह पहले की त्रुटियों को पकड़ सकता है और बतख टाइपिंग की तुलना में स्पष्ट त्रुटि संदेश दे सकता है। एक बतख प्रकार की सटीक आवश्यकताओं को केवल बाहरी दस्तावेज के साथ व्यक्त किया जा सकता है (उम्मीद है कि यह पूरी तरह से और सटीक है) और असंगत प्रकारों से त्रुटियां दूर हो सकती हैं जहां से वे उत्पन्न होते हैं।

पायथन के प्रकार संकेत एक ऐसे समझौते की पेशकश करने के लिए हैं जहां प्रकार निर्दिष्ट किए जा सकते हैं और जांचे जा सकते हैं लेकिन सामान्य कोड निष्पादन के दौरान कोई अतिरिक्त लागत नहीं है।

typingपैकेज ऑफर प्रकार चर उस प्रकार संकेत में इस्तेमाल किया जा सकता विशेष प्रकार की आवश्यकता के बिना आवश्यक व्यवहार व्यक्त करते हैं। उदाहरण के लिए, इसमें उन व्यवहारों के साथ किसी भी प्रकार की आवश्यकता को निर्दिष्ट करने के लिए चर Iterableऔर Callableसंकेत जैसे चर शामिल हैं।

जबकि प्रकार के संकेत प्रकारों की जांच करने के लिए सबसे Pythonic तरीका है, यह अक्सर और भी अधिक Pythonic है कि सभी प्रकार की जाँच न करें और बतख टाइपिंग पर निर्भर रहें। टाइप संकेत अपेक्षाकृत नए हैं और जूरी अभी भी बाहर है जब वे सबसे पायथोनिक समाधान हैं। एक अपेक्षाकृत विवादास्पद लेकिन बहुत ही सामान्य तुलना: टाइप संकेत दस्तावेज़ीकरण का एक रूप प्रदान करते हैं जिसे लागू किया जा सकता है, कोड को पहले उत्पन्न करने की अनुमति देता है और त्रुटियों को समझने में आसान है, उन त्रुटियों को पकड़ सकता है जो बतख टाइपिंग नहीं कर सकते हैं, और सांख्यिकीय रूप से जांच की जा सकती है (एक असामान्य रूप में) समझ लेकिन यह अभी भी रनटाइम के बाहर है)। दूसरी ओर, बतख टाइपिंग लंबे समय से पाइथोनिक तरीका रहा है, स्थैतिक टाइपिंग के संज्ञानात्मक ओवरहेड को लागू नहीं करता है, कम क्रिया है, और सभी व्यवहार्य प्रकारों को स्वीकार करेगा और फिर कुछ।


2
-1: मैपी विशेष रूप से खुद को "स्टैटिक टाइप चेकर" कहते हैं, इसलिए मुझे यकीन नहीं है कि आपको "टाइप चेकिंग रनटाइम पर किया जाना चाहिए"।
केविन

@ केविन रिट्रोस्पेक्ट में, यह एक अनावश्यक विषयांतर था, लेकिन इसे और अधिक प्राप्त करने के लिए, पायथन के प्रकार संकेत रनटाइम डेटा में बदल जाते हैं और mypyएक पायथन मॉड्यूल है जो importlibउस डेटा का उपयोग करने के लिए उपयोग करता है। क्या यह "स्टैटिक टाइप चेकिंग" एक दार्शनिक प्रश्न है, लेकिन यह सामान्य भाषा दुभाषिया और आयात मशीनरी के शामिल होने के बाद से सबसे ज्यादा क्या उम्मीद करता है, उससे अलग है।
प्रिक्सोलिटिक

4
यह सच नहीं है। यह typed_ast का उपयोग करता है , जो अपने आप में अतिरिक्त विशेषताओं के साथ केवल एक क्लोन है। ast मॉड्यूल आयात नहीं करता है; यह उन्हें एक सार वाक्यविन्यास पेड़ में डाल देता है।
केविन

18

यहां एक उदाहरण दिया गया है कि डक टाइपिंग यह जानने के बिना कि यह खतरनाक कब है? उदाहरण के लिए: यहां पायथन कोड है (संभवतः उचित इंडेंटिंग को छोड़ना), ध्यान दें कि यह स्थिति आइंस्टीन और आइसबक्लासोफ कार्यों का ध्यान रखने से बचने योग्य है, यह सुनिश्चित करने के लिए कि जब आपको वास्तव में बतख की आवश्यकता होती है, तो आपको बम नहीं मिलता है।

class Bomb:
    def __init__(self):
        ""

    def talk(self):
        self.explode()

    def explode(self):
        print "BOOM!, The bomb explodes."

class Duck:
    def __init__(self):
        ""
    def talk(self):
        print "I am a duck, I will not blow up if you ask me to talk."    

class Kid:
    kids_duck = None

    def __init__(self):
        print "Kid comes around a corner and asks you for money so he could buy a duck."

    def takeDuck(self, duck):
        self.kids_duck = duck
        print "The kid accepts the duck, and happily skips along"

    def doYourThing(self):
        print "The kid tries to get the duck to talk"
        self.kids_duck.talk()

myKid = Kid()
myBomb = Bomb()
myKid.takeDuck(myBomb)
myKid.doYourThing()

36
प्रकार की जाँच के साथ भी, आप एक class EvilDuck(Duck)और ओवरराइड टॉक बना सकते हैं ()। या अधिक संभावना है, class ChineseCancerDuck(Duck)एक बुरा साइड इफेक्ट के साथ जो वर्षों बाद तक दिखाई नहीं देता है। आप अपने बच्चे की देखरेख करना बेहतर समझेंगे (और उसके खिलौनों का पूरी तरह से परीक्षण कर सकते हैं :)
ब्रेट थॉमस

36
बम बात नहीं करते। निरर्थक तरीके न जोड़ें और ऐसा नहीं होगा।
सही गुना

7
@ डमित्री, यह डक टंकण की आम आलोचना है: en.wikipedia.org/wiki/Duck_typing#Criticism ... आप मूल रूप से कह रहे हैं कि कोई भी इंटरफ़ेस जिसके लिए भाषा द्वारा शब्दावलियों को लागू नहीं किया गया है वह बुराई है। मेरा मानना ​​है कि यह जावा का दृष्टिकोण है। अजगर के बत्तख टाइपिंग का पूरा बिंदु यह है कि यह केवल तभी काम करता है जब विशिष्ट इंटरफेस के बारे में एक सामान्य रूप से परिभाषित सम्मेलन होता है। उदाहरण के लिए, आप __file__विशेषता को ओवरराइड करके (आमतौर पर फ़ाइल की तरह वस्तुओं की पहचान करने के लिए) कुछ और मतलब करने के लिए पायथन कोड का एक बहुत बड़ा हिस्सा बना सकते हैं ।
दान लैंस्की

2
यह सब पुराने मजाक में उतरता है "डॉक्टर, ऐसा करने पर दर्द होता है।" ... "तो ऐसा मत करो।" किसी ऐसे व्यक्ति के लिए असंतोषजनक जिसका उपयोग "अगर यह संकलन करता है, तो यह चलता है", लेकिन यही कारण है कि परीक्षण जुनून गतिशील भाषा की दुनिया से बाहर हो गया।
क्लार्क

1
मूल रूप से @clacke, यह रनटाइम के प्रकारों को सख्ती से लागू करने के लिए बहुत महंगा है क्योंकि हर चीज एक वस्तु होनी चाहिए (ताकि किसी भी प्रकार के स्ट्रिंग से नक्शा करने के लिए), और ducktyping नहीं होने के लिए बहुत सुविधाजनक है क्योंकि ducktyping वास्तव में शक्तिशाली प्रोटोटाइप तकनीक की अनुमति देता है जो चीजों को दूर करती है आम तौर पर कठोर इंटरफेस के साथ करना बहुत मुश्किल है। इसके अलावा, किसी भी स्थिर भाषा में एक बिंदु का सामना करना पड़ता है, जहां इसे गतिशील पुस्तकालयों, मूल्यांकन और स्ट्रिंग, या इंटरफेस के माध्यम से बतख टाइपिंग बनाने की आवश्यकता होती है, और ये चीजें स्वाभाविक रूप से इसे बुराई नहीं बनाती हैं, बस बहुत शक्तिशाली।
दिमित्री

12

1
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
EKons

7

मुझे लगता है कि पायथन जैसी गतिशील भाषा का उपयोग करने के बारे में अच्छी बात यह है कि वास्तव में आपको ऐसा कुछ नहीं देखना चाहिए।

मैं सिर्फ आपकी वस्तु पर आवश्यक तरीकों को कॉल करूंगा और एक को पकड़ सकता हूं AttributeError। बाद में इस पर आप विभिन्न तरीकों से काम करने के लिए अन्य (प्रतीत होता है असंबंधित) वस्तुओं के साथ अपने तरीकों को कॉल करने की अनुमति देंगे, जैसे कि परीक्षण के लिए एक वस्तु का मज़ाक उड़ाना।

मैंने वेब से डेटा प्राप्त करते समय इसका बहुत उपयोग किया है, urllib2.urlopen()जिसके साथ ऑब्जेक्ट जैसी फ़ाइल लौटाता है । यह बदले में एक फ़ाइल से पढ़ी जाने वाली लगभग किसी भी विधि से पारित किया जा सकता है, क्योंकि यह उसी read()पद्धति को वास्तविक फ़ाइल के रूप में लागू करता है ।

लेकिन मुझे यकीन है कि उपयोग करने के लिए एक समय और स्थान है isinstance(), अन्यथा यह संभवतः नहीं होगा :)


जब आप इसका उपयोग करना चाहते हैं, तो इसका एक अच्छा उदाहरण है यदि आप एक गतिशील जोंस ऑब्जेक्ट को पार्स कर रहे हैं। यदि क्षेत्र कोई स्ट्रिंग या शब्दकोश है तो आप समय से पहले नहीं जानते।
ग्रे

6

अधिक जटिल प्रकार के सत्यापन के लिए, मुझे अजगर प्रकार संकेत एनोटेशन के आधार पर टाइप करने के दृष्टिकोण को पसंद करना है :

from typeguard import check_type
from typing import List

try:
    check_type('mylist', [1, 2], List[int])
except TypeError as e:
    print(e)

आप बहुत ही साफ-सुथरे और पठनीय अंदाज़ में बहुत जटिल मान्यताएँ निभा सकते हैं।

check_type('foo', [1, 3.14], List[Union[int, float]])
# vs
isinstance(foo, list) and all(isinstance(a, (int, float)) for a in foo) 

6

आप एक प्रकार के __name__ का उपयोग करके एक चर के प्रकार की जांच कर सकते हैं।

उदाहरण के लिए:

>>> a = [1,2,3,4]  
>>> b = 1  
>>> type(a).__name__
'list'
>>> type(a).__name__ == 'list'
True
>>> type(b).__name__ == 'list'
False
>>> type(b).__name__
'int'

धन्यवाद, यह वह गुप्त कोड है जो मैं तब चाहता था जब मैं इसे उपयोगकर्ता के फीडबैक के रूप में प्रदर्शित कर रहा था। इसे खोजने के लिए मुझे बहुत लंबा समय लगा ...
हारून डी। मैरास्को

5

ह्यूगो को:

आप शायद के listबजाय मतलब हैarray , लेकिन यह पूरी समस्या के प्रकार की जाँच के साथ इंगित करता है - आप नहीं जानना चाहते हैं कि क्या प्रश्न में वस्तु एक सूची है, तो आप जानना चाहते हैं कि क्या यह किसी प्रकार का अनुक्रम है या यदि यह एक एकल वस्तु है। इसलिए इसे एक सीक्वेंस की तरह इस्तेमाल करने की कोशिश करें।

मान लें कि आप ऑब्जेक्ट को किसी मौजूदा अनुक्रम में जोड़ना चाहते हैं, या यदि यह ऑब्जेक्ट का अनुक्रम है, तो उन सभी को जोड़ें

try:
   my_sequence.extend(o)
except TypeError:
  my_sequence.append(o)

इसके साथ एक ट्रिक यह है कि अगर आप स्ट्रिंग्स और / या स्ट्रिंग्स के दृश्यों के साथ काम कर रहे हैं - तो यह मुश्किल है, क्योंकि एक स्ट्रिंग को अक्सर एकल ऑब्जेक्ट के रूप में सोचा जाता है, लेकिन यह पात्रों का एक क्रम भी है। इससे भी बदतर, क्योंकि यह वास्तव में एकल-लंबाई स्ट्रिंग्स का एक क्रम है।

मैं आमतौर पर अपने एपीआई को डिजाइन करने के लिए चुनता हूं ताकि यह केवल एक मूल्य या एक अनुक्रम को स्वीकार करे - यह चीजों को आसान बनाता है। इसे लगाना मुश्किल नहीं है[ ]जब आप इसे ज़रूरत में पास करते हैं, तो अपने एकल मूल्य के आसपास है।

(हालांकि यह तार के साथ त्रुटियों का कारण बन सकता है, क्योंकि वे अनुक्रम की तरह दिखते हैं (हैं)।)


0

प्रकार की जांच करने का एक सरल तरीका यह है कि आप जिस चीज़ को जानते हैं, उससे उसकी तुलना करें।

>>> a  = 1
>>> type(a) == type(1)
True
>>> b = 'abc'
>>> type(b) == type('')
True

-1

मुझे लगता है कि सबसे अच्छा तरीका है कि आप अपने चर को अच्छी तरह से टाइप करें। आप "टाइपिंग" लाइब्रेरी का उपयोग करके ऐसा कर सकते हैं।

उदाहरण:

from typing import NewType UserId = NewType ('UserId', int) some_id = UserId (524313) `

Https://docs.python.org/3/library/typing.html देखें


-7

आप निम्न पंक्ति के साथ जाँच कर सकते हैं कि दिया गया मान किस प्रकार का है:

def chr_type(chrx):
    if chrx.isalpha()==True:
        return 'alpha'
    elif chrx.isdigit()==True:
        return 'numeric'
    else:
        return 'nothing'

chr_type("12)

3
आप सुनिश्चित करें कि आप इस उत्तर को हटाना नहीं चाहते हैं @ वेंकटेशन?
ग्रे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.