मैं एक चर के प्रकार को कैसे देख सकता हूं कि क्या यह 32 बिट्स पर हस्ताक्षरित है, 16 बिट पर हस्ताक्षरित है, आदि?
मैं इसे कैसे देखूं?
मैं एक चर के प्रकार को कैसे देख सकता हूं कि क्या यह 32 बिट्स पर हस्ताक्षरित है, 16 बिट पर हस्ताक्षरित है, आदि?
मैं इसे कैसे देखूं?
जवाबों:
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 ++ के समान प्रकार नहीं हैं, जो आपका प्रश्न प्रतीत होता है।
आप बिल्ट-इन फ़ंक्शन की तलाश में हो सकते हैं ।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'>
पायथन में चर प्रकार का निर्धारण कैसे करें?
इसलिए यदि आपके पास एक चर है, उदाहरण के लिए:
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
- मैं क्या गलत कर रहा हूं?
object
?
import email
अपने स्वयं के आविष्कार के किसी भी वर्ग का उपयोग नहीं कर रहा हूं।
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
यदि संभव हो तो एक स्ट्रिंग या संख्या को पूर्णांक में बदलें। एक फ़्लोटिंग पॉइंट तर्क को शून्य की ओर छोटा किया जाएगा (इसमें फ़्लोटिंग पॉइंट संख्या का एक स्ट्रिंग प्रतिनिधित्व शामिल नहीं है!) जब एक स्ट्रिंग को परिवर्तित किया जाता है, तो वैकल्पिक आधार का उपयोग करें। यह एक गैर-स्ट्रिंग को परिवर्तित करते समय एक आधार की आपूर्ति करने के लिए एक त्रुटि है। यदि तर्क पूर्णांक सीमा के बाहर है, तो इसके बजाय एक लंबी ऑब्जेक्ट वापस किया जाएगा।
print type(str)
पाइथन 3.6 में एक त्रुटि देता है। उपयोगtype(str)
print(type(str))
print type(var)
गलत कोड को संशोधित करना चाहिए ।
उपयोग करने का एक और तरीका __class__
:
>>> a = [1, 2, 3, 4]
>>> a.__class__
<type 'list'>
>>> b = {'key1': 'val1'}
>>> b.__class__
<type 'dict'>
>>> c = 12
>>> c.__class__
<type 'int'>
यह थोड़ा अप्रासंगिक हो सकता है। लेकिन आप यहांisinstance(object, type)
बताए अनुसार किसी प्रकार की वस्तु की जांच कर सकते हैं ।
सवाल कुछ अस्पष्ट है - मुझे यकीन नहीं है कि आप "दृश्य" से क्या मतलब है। यदि आप मूल पायथन ऑब्जेक्ट के प्रकार को क्वेरी करने का प्रयास कर रहे हैं , तो @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)
क्या आप पायथन या ctypes का उपयोग करते हैं ?
पहले मामले में, आप बस नहीं कर सकते - क्योंकि पायथन ने 16/32 बिट पूर्णांक पर हस्ताक्षर / अहस्ताक्षरित नहीं किया है।
दूसरे मामले में, आप उपयोग कर सकते हैं type()
:
>>> import ctypes
>>> a = ctypes.c_uint() # unsigned int
>>> type(a)
<class 'ctypes.c_ulong'>
Ctypes पर अधिक संदर्भ के लिए, इसका प्रकार, आधिकारिक दस्तावेज देखें ।
जैसा कि आप वर्णन करते हैं, अजगर के पास ऐसे प्रकार नहीं हैं। अभिन्न मूल्यों का प्रतिनिधित्व करने के लिए दो प्रकारों का उपयोग किया जाता है:, int
जो सी में प्लेटफ़ॉर्म के इंट प्रकार से मेल खाता है, और long
, जो एक मनमाना सटीक पूर्णांक है (अर्थात यह आवश्यकतानुसार बढ़ता है और इसकी ऊपरी सीमा नहीं है)। int
s चुपचाप परिवर्तित हो जाते हैं long
यदि कोई अभिव्यक्ति परिणाम उत्पन्न करती है जिसे संग्रहीत नहीं किया जा सकता है int
।
यह वास्तव में इस बात पर निर्भर करता है कि आप किस स्तर पर हैं। पायथन 2.x में, ऐतिहासिक कारणों से दो पूर्णांक प्रकार, int
(विवश sys.maxint
) और long
(असीमित परिशुद्धता) हैं। पायथन कोड में, यह थोड़ा अंतर नहीं होना चाहिए क्योंकि दुभाषिया स्वचालित रूप से लंबे समय तक धर्मान्तरित होता है जब कोई संख्या बहुत बड़ी हो। यदि आप अंतर्निहित दुभाषिया में उपयोग किए जाने वाले वास्तविक डेटा प्रकारों के बारे में जानना चाहते हैं, तो यह कार्यान्वयन पर निर्भर है। (CPython के ऑब्जेक्ट्स / intobject.c और Objects / longobject.c में स्थित हैं।) सिस्टम मॉड्यूल के बारे में जानने के लिए स्ट्रक्चर मॉड्यूल का उपयोग करने के लिए cdleary उत्तर देखें।
Python2.x के लिए, उपयोग करें
print type(variable_name)
Python3.x के लिए, उपयोग करें
print(type(variable_name))
बस यह मत करो। किसी चीज का प्रकार पूछना अपने आप में गलत है। इसके बजाय बहुरूपता का उपयोग करें। यदि आवश्यक हो तो किसी भी प्रकार के इनपुट के लिए वही विधि खोजें या करें जो आपके लिए आवश्यक हो, और बिना कुछ पूछे बस उसे कॉल करें। यदि आपको किसी थर्ड पार्टी लाइब्रेरी द्वारा परिभाषित बिल्ट-इन टाइप्स या प्रकारों के साथ काम करने की आवश्यकता है, तो आप हमेशा उनसे विरासत में प्राप्त कर सकते हैं और इसके बजाय अपने डिजिटल डेरिवेटिव का उपयोग कर सकते हैं। या आप उन्हें अपनी कक्षा के अंदर लपेट सकते हैं। इस तरह की समस्याओं को हल करने के लिए यह वस्तु-उन्मुख तरीका है।
यदि आप सटीक प्रकार की जाँच करने और कुछ गंदे if
एस यहाँ और वहाँ रखने पर जोर देते हैं , तो आप इसे करने के लिए __class__
संपत्ति या type
फ़ंक्शन का उपयोग कर सकते हैं , लेकिन जल्द ही आप अपने आप को इन सभी if
को अतिरिक्त मामलों के साथ हर दो या तीन कमिट में अपडेट करते हुए पाएंगे । इसे करने का OO तरीका रोकता है और आपको केवल एक नए प्रकार के इनपुट के लिए एक नए वर्ग को परिभाषित करने देता है।