पायथन वेरिएबल के प्रकार का निर्धारण कैसे करें?


1566

मैं एक चर के प्रकार को कैसे देख सकता हूं कि क्या यह 32 बिट्स पर हस्ताक्षरित है, 16 बिट पर हस्ताक्षरित है, आदि?

मैं इसे कैसे देखूं?



जवाबों:


1379

type()बिलिन फ़ंक्शन का उपयोग करें :

>>> i = 123
>>> type(i)
<type 'int'>
>>> type(i) is int
True
>>> i = 123.456
>>> type(i)
<type 'float'>
>>> type(i) is float
True

यह जाँचने के लिए कि क्या चर एक दिए गए प्रकार का है, उपयोग करें isinstance:

>>> i = 123
>>> isinstance(i, int)
True
>>> isinstance(i, (float, str, set, dict))
False

ध्यान दें कि पायथन में C / C ++ के समान प्रकार नहीं हैं, जो आपका प्रश्न प्रतीत होता है।


437

आप बिल्ट-इन फ़ंक्शन की तलाश में हो सकते हैं ।type()

नीचे दिए गए उदाहरण देखें, लेकिन जावा की तरह पायथन में कोई "अहस्ताक्षरित" प्रकार नहीं है।

सकारात्मक पूर्णांक:

>>> v = 10
>>> type(v)
<type 'int'>

बड़े सकारात्मक पूर्णांक:

>>> v = 100000000000000
>>> type(v)
<type 'long'>

नकारात्मक पूर्णांक:

>>> v = -10
>>> type(v)
<type 'int'>

वर्णों का शाब्दिक क्रम:

>>> v = 'hi'
>>> type(v)
<type 'str'>

फ्लोटिंग पॉइंट पूर्णांक:

>>> v = 3.14159
>>> type(v)
<type 'float'>

जब मैंने यह देखा तो मुझे डबल लेना पड़ा। Java SE8 में अब अहस्ताक्षरित पूर्णांक शामिल हैं, और मैंने इसके साथ इतना विकसित किया है कि यह पापपूर्ण लगता है कि Java ने SE8 के माध्यम से अहस्ताक्षरित पूर्णांक नहीं बनाए थे।
dddJewelsbbb

171

यह बहुत सरल है। आप इसे ऐसे करें।

print(type(variable_name))

110

पायथन में चर प्रकार का निर्धारण कैसे करें?

इसलिए यदि आपके पास एक चर है, उदाहरण के लिए:

one = 1

आप इसका प्रकार जानना चाहते हैं?

पायथन में हर चीज के बारे में सही तरीके और गलत तरीके हैं। यहाँ सही तरीका है:

उपयोग type

>>> type(one)
<type 'int'>

आप __name__ऑब्जेक्ट का नाम प्राप्त करने के लिए विशेषता का उपयोग कर सकते हैं । (यह कुछ विशेष विशेषताओं में से एक है जिसे __dunder__पाने के लिए आपको नाम का उपयोग करने की आवश्यकता है - inspectमॉड्यूल में इसके लिए कोई विधि भी नहीं है ।)

>>> type(one).__name__
'int'

उपयोग न करें __class__

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

चूँकि typeहमें वस्तु का वर्ग देता है, हमें इसे सीधे प्राप्त करने से बचना चाहिए। :

>>> one.__class__

यह आमतौर पर पहला विचार है कि लोगों के पास किसी वस्तु के प्रकार को किसी विधि से एक्सेस करते समय - वे पहले से ही विशेषताओं की तलाश कर रहे हैं, इसलिए प्रकार अजीब लगता है। उदाहरण के लिए:

class Foo(object):
    def foo(self):
        self.__class__

मत करो। इसके बजाय, टाइप करें (स्व):

class Foo(object):
    def foo(self):
        type(self)

किलों और झांकियों का कार्यान्वयन विवरण

मैं एक चर के प्रकार को कैसे देख सकता हूं कि क्या यह 32 बिट्स पर हस्ताक्षरित है, 16 बिट पर हस्ताक्षरित है, आदि?

पायथन में, ये बारीकियां कार्यान्वयन विवरण हैं। इसलिए, आमतौर पर, हम पायथन में इस बारे में चिंता नहीं करते हैं। हालांकि, अपनी जिज्ञासा को शांत करने के लिए ...

पायथन 2 में, इंट आमतौर पर कार्यान्वयन के शब्द चौड़ाई (सिस्टम द्वारा सीमित) के बराबर एक हस्ताक्षरित पूर्णांक है । यह आमतौर पर सी में एक लंबे समय के रूप में लागू किया जाता है । जब पूर्णांक इससे बड़े हो जाते हैं, तो हम आमतौर पर उन्हें पायथन लॉन्ग (असीमित सटीकता के साथ, सी लॉन्ग के साथ भ्रमित नहीं होने के लिए) में बदल देते हैं।

उदाहरण के लिए, एक 32 बिट पायथन 2 में, हम यह अनुमान लगा सकते हैं कि int एक हस्ताक्षरित 32 बिट पूर्णांक है:

>>> import sys

>>> format(sys.maxint, '032b')
'01111111111111111111111111111111'
>>> format(-sys.maxint - 1, '032b') # minimum value, see docs.
'-10000000000000000000000000000000'

पायथन 3 में, पुराना int चला जाता है, और हम सिर्फ int के रूप में (Python's) का उपयोग करते हैं, जिसमें असीमित परिशुद्धता होती है।

हम पायथन की फ़्लोट्स के बारे में कुछ जानकारी भी प्राप्त कर सकते हैं, जिन्हें आमतौर पर सी में डबल के रूप में लागू किया जाता है:

>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, 
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, 
mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)

निष्कर्ष

__class__वैरिएबल के प्रकार को प्राप्त करने के लिए, एक शब्दार्थ नॉन रिपब्लिक एपीआई का उपयोग न करें । typeइसके बजाय उपयोग करें ।

और अजगर के कार्यान्वयन के विवरण के बारे में बहुत चिंता न करें। मुझे अपने आसपास के मुद्दों से निपटना नहीं पड़ा है। आप शायद या तो नहीं करेंगे, और यदि आप वास्तव में करते हैं, तो आपको पर्याप्त पता होना चाहिए कि इस उत्तर को नहीं देखना है कि क्या करना है।


प्रकार सामने आता है <type instance>लेकिन __class__देता है email.message.Message- मैं क्या गलत कर रहा हूं?
जसेंन

@ जेसेन आप पायथन 2 का उपयोग कर रहे हैं और विरासत में नहीं मिला है object?
हारून हॉल

हां, बस import email अपने स्वयं के आविष्कार के किसी भी वर्ग का उपयोग नहीं कर रहा हूं।
जस्सिन

65
print type(variable_name)

मैं भी इस तरह के सवालों से निपटने के लिए IPython इंटरैक्टिव दुभाषिया की अत्यधिक अनुशंसा करता हूं । यह आपको टाइप करने देता है variable_name?और प्रकार सहित ऑब्जेक्ट के बारे में जानकारी की पूरी सूची और प्रकार के लिए डॉक्टर स्ट्रिंग लौटाएगा।

जैसे

In [9]: var = 123

In [10]: var?
Type:       int
Base Class: <type 'int'>
String Form:    123
Namespace:  Interactive
Docstring:
    int(x[, base]) -> integer

यदि संभव हो तो एक स्ट्रिंग या संख्या को पूर्णांक में बदलें। एक फ़्लोटिंग पॉइंट तर्क को शून्य की ओर छोटा किया जाएगा (इसमें फ़्लोटिंग पॉइंट संख्या का एक स्ट्रिंग प्रतिनिधित्व शामिल नहीं है!) जब एक स्ट्रिंग को परिवर्तित किया जाता है, तो वैकल्पिक आधार का उपयोग करें। यह एक गैर-स्ट्रिंग को परिवर्तित करते समय एक आधार की आपूर्ति करने के लिए एक त्रुटि है। यदि तर्क पूर्णांक सीमा के बाहर है, तो इसके बजाय एक लंबी ऑब्जेक्ट वापस किया जाएगा।


2
मैंने अहस्ताक्षरित int, हस्ताक्षरित int आदि के लिए कहा
user46646

3
print type(str)पाइथन 3.6 में एक त्रुटि देता है। उपयोगtype(str)
Kolob Canyon

4
@KolobCanyon ऐसा इसलिए है क्योंकि 3.x में, प्रिंट को कोष्ठक की जरूरत है:print(type(str))
jcoppens

1
आपको वास्तव में print type(var)गलत कोड को संशोधित करना चाहिए ।
हान XIAO

54
a = "cool"
type(a)

//result 'str'
<class 'str'>
or 
do 
`dir(a)` 
to see the list of inbuilt methods you can have on the variable.

40

उपयोग करने का एक और तरीका __class__:

>>> a = [1, 2, 3, 4]
>>> a.__class__
<type 'list'>
>>> b = {'key1': 'val1'}
>>> b.__class__
<type 'dict'>
>>> c = 12
>>> c.__class__
<type 'int'>

1
पुन: टिप्पणी "नाम जो अंडरस्कोर से शुरू होते हैं ..." (एकल) अंडरस्कोर, डबल अंडरस्कोर ("डंडर्स") की तुलना में बहुत अलग हैं और वे निश्चित रूप से सार्वजनिक एपीआई का हिस्सा हैं और उनका उपयोग करना निश्चित रूप से ठीक है। यह मदद की हो सकती है ... youtu.be/wf-BqAjZb8M
माइकल

31

पायथन में सरल प्रकार की जाँच के उदाहरण:

assert type(variable_name) == int

assert type(variable_name) == bool

assert type(variable_name) == list

29

यह थोड़ा अप्रासंगिक हो सकता है। लेकिन आप यहांisinstance(object, type) बताए अनुसार किसी प्रकार की वस्तु की जांच कर सकते हैं


1
मुझे लगता है कि यह जाँच प्रक्रिया में उपयोग करने के प्रकार से बेहतर है। यदि आप जाँचना चाहते हैं और परिणाम के साथ कार्य करना चाहते हैं, तो आपको टाइप के साथ कैच पकड़ने का उपयोग करना होगा, लेकिन आइंस्टीन सही है या गलत
alkanschtein

24

सवाल कुछ अस्पष्ट है - मुझे यकीन नहीं है कि आप "दृश्य" से क्या मतलब है। यदि आप मूल पायथन ऑब्जेक्ट के प्रकार को क्वेरी करने का प्रयास कर रहे हैं , तो @atzz का उत्तर आपको सही दिशा में आगे बढ़ाएगा

हालांकि, अगर आप की कोशिश कर रहे उत्पन्न पायथन वस्तुओं (जैसे आदिम सी-प्रकार के अर्थ विज्ञान है uint32_t, int16_t), का उपयोग structमॉड्यूल। आप किसी दिए गए C- टाइप आदिम में बिट्स की संख्या निर्धारित कर सकते हैं:

>>> struct.calcsize('c') # char
1
>>> struct.calcsize('h') # short
2
>>> struct.calcsize('i') # int
4
>>> struct.calcsize('l') # long
4

यह arrayमॉड्यूल में भी परिलक्षित होता है , जो इन निम्न-स्तरीय प्रकारों के सरणियों को बना सकता है:

>>> array.array('c').itemsize # char
1

समर्थित अधिकतम पूर्णांक (पायथन 2 का int) sys.maxint द्वारा दिया गया है ।

>>> import sys, math
>>> math.ceil(math.log(sys.maxint, 2)) + 1 # Signedness
32.0

वहाँ भी sys.getizeof है , जो अवशिष्ट स्मृति में पायथन ऑब्जेक्ट का वास्तविक आकार देता है :

>>> a = 5
>>> sys.getsizeof(a) # Residual memory.
12

फ्लोट डेटा और सटीक डेटा के लिए, sys.float_info का उपयोग करें :

>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)

7
प्रश्न, जैसा कि मैं इसे समझता हूं, पायथन में "चर" के प्रकार के बारे में पूछता है। आपका उत्तर आम तौर पर सही लेकिन ऑफ टॉपिक होता है।
tzot

19

क्या आप पायथन या ctypes का उपयोग करते हैं ?

पहले मामले में, आप बस नहीं कर सकते - क्योंकि पायथन ने 16/32 बिट पूर्णांक पर हस्ताक्षर / अहस्ताक्षरित नहीं किया है।

दूसरे मामले में, आप उपयोग कर सकते हैं type():

>>> import ctypes
>>> a = ctypes.c_uint() # unsigned int
>>> type(a)
<class 'ctypes.c_ulong'>

Ctypes पर अधिक संदर्भ के लिए, इसका प्रकार, आधिकारिक दस्तावेज देखें


15

जैसा कि आप वर्णन करते हैं, अजगर के पास ऐसे प्रकार नहीं हैं। अभिन्न मूल्यों का प्रतिनिधित्व करने के लिए दो प्रकारों का उपयोग किया जाता है:, intजो सी में प्लेटफ़ॉर्म के इंट प्रकार से मेल खाता है, और long, जो एक मनमाना सटीक पूर्णांक है (अर्थात यह आवश्यकतानुसार बढ़ता है और इसकी ऊपरी सीमा नहीं है)। ints चुपचाप परिवर्तित हो जाते हैं longयदि कोई अभिव्यक्ति परिणाम उत्पन्न करती है जिसे संग्रहीत नहीं किया जा सकता है int


11

अजगर 3.4 और इसके बाद के संस्करण के लिए सरल

print (type(variable_name))

पायथन 2.7 और ऊपर

print type(variable_name)

10

यह वास्तव में इस बात पर निर्भर करता है कि आप किस स्तर पर हैं। पायथन 2.x में, ऐतिहासिक कारणों से दो पूर्णांक प्रकार, int(विवश sys.maxint) और long(असीमित परिशुद्धता) हैं। पायथन कोड में, यह थोड़ा अंतर नहीं होना चाहिए क्योंकि दुभाषिया स्वचालित रूप से लंबे समय तक धर्मान्तरित होता है जब कोई संख्या बहुत बड़ी हो। यदि आप अंतर्निहित दुभाषिया में उपयोग किए जाने वाले वास्तविक डेटा प्रकारों के बारे में जानना चाहते हैं, तो यह कार्यान्वयन पर निर्भर है। (CPython के ऑब्जेक्ट्स / intobject.c और Objects / longobject.c में स्थित हैं।) सिस्टम मॉड्यूल के बारे में जानने के लिए स्ट्रक्चर मॉड्यूल का उपयोग करने के लिए cdleary उत्तर देखें।



-29

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

यदि आप सटीक प्रकार की जाँच करने और कुछ गंदे ifएस यहाँ और वहाँ रखने पर जोर देते हैं , तो आप इसे करने के लिए __class__संपत्ति या typeफ़ंक्शन का उपयोग कर सकते हैं , लेकिन जल्द ही आप अपने आप को इन सभी ifको अतिरिक्त मामलों के साथ हर दो या तीन कमिट में अपडेट करते हुए पाएंगे । इसे करने का OO तरीका रोकता है और आपको केवल एक नए प्रकार के इनपुट के लिए एक नए वर्ग को परिभाषित करने देता है।


4
मुझे वास्तव में यह पता नहीं है कि यह उत्तर मौजूदा लोगों के लिए क्या जोड़ा गया (शायद पहले वाक्य से परे?)
user2305193
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.