tttthomasssss
नोटों के रूप में, type
(वर्ग) दिखाई देते हैं। वे चीजों के विभिन्न प्रकार हैं:
In [435]: type(np.float64)
Out[435]: type
प्रकार type
साधन (आमतौर पर) है कि यह एक समारोह है, तो यह रूप में इस्तेमाल किया जा सकता है:
In [436]: np.float64(0)
Out[436]: 0.0
In [437]: type(_)
Out[437]: numpy.float64
एक अंकीय वस्तु का निर्माण। असल में यह एक वर्ग परिभाषा की तरह दिखता है। लेकिन चूंकि numpy
बहुत सारे संकलित कोड का उपयोग करता है, और इसके ndarray
अपने स्वयं के __new__
का उपयोग करता है, तो मुझे आश्चर्य नहीं होगा कि यह लाइन को परेशान करता है।
In [438]: np.float64.__hash__??
Type: wrapper_descriptor
String Form:<slot wrapper '__hash__' of 'float' objects>
Docstring: x.__hash__() <==> hash(x)
मैं इस होगा hash(np.float64)
सोच रहा था, लेकिन यह वास्तव में उस प्रकार का एक उद्देश्य है, उदा के लिए हैश हो सकता है hash(np.float64(0))
। उस स्थिति में hash(np.float64)
बस डिफ़ॉल्ट type.__hash__
विधि का उपयोग करता है।
dtype
को आगे बढ़ते:
In [441]: d(0)
...
TypeError: 'numpy.dtype' object is not callable
In [442]: d.__hash__??
Type: method-wrapper
String Form:<method-wrapper '__hash__' of numpy.dtype object at 0xb60f8a60>
Docstring: x.__hash__() <==> hash(x)
np.dtype
ऐसा लगता है कि किसी विशेष __hash__
विधि को परिभाषित नहीं करता, यह सिर्फ object
से विरासत:
In [439]: d=np.dtype(np.float64)
In [440]: type(d)
Out[440]: numpy.dtype
d
एक समारोह या वर्ग नहीं है।
इसके अलावा float64
और d
के बीच अंतर बताने वाला वर्ग विरासत ढेर
In [443]: np.float64.__mro__
Out[443]:
(numpy.float64,
numpy.floating,
numpy.inexact,
numpy.number,
numpy.generic,
float,
object)
In [444]: d.__mro__
...
AttributeError: 'numpy.dtype' object has no attribute '__mro__'
In [445]: np.dtype.__mro__
Out[445]: (numpy.dtype, object)
तो np.float64
या तो एक हैश परिभाषित नहीं करता है, यह सिर्फ float
से विरासत को देखो। d
में __mro__
नहीं है क्योंकि यह एक वस्तु है, न कि वर्ग।
numpy
में पर्याप्त संकलित कोड है, और इसका एक लंबा इतिहास है, कि आप हमेशा पाइथन दस्तावेज पर आवेदन नहीं कर सकते हैं।
np.dtype
और np.float64
जाहिर सुनिश्चित करें कि __hash__
तरीकों का पालन बनाने में किसी भी प्रयास नहीं किया __eq__
तरीकों कि उन्हें एक दूसरे के साथ तुलना में होने की अनुमति है, लेकिन numpy
डेवलपर्स की है। सबसे अधिक संभावना है क्योंकि उन्हें या तो एक शब्दकोश कुंजी के रूप में उपयोग करने की आवश्यकता नहीं है।
मैं कभी नहीं देखा है कोड की तरह:
In [453]: dd={np.float64:12,d:34}
In [454]: dd
Out[454]: {dtype('float64'): 34, numpy.float64: 12}
In [455]: dd[np.float64]
Out[455]: 12
In [456]: dd[d]
Out[456]: 34
दरअसल 'प्रकार (डी) == प्रकार (np.float64)' 'गलत है '। और पायथन कहते हैं कि केवल "संख्यात्मक मान जो बराबर तुलना करते हैं, वही हैश मान"। – AndyG
यदि आप इसके बजाय 'd = np.float64' कहते हैं, तो हैश समकक्ष हैं। – AndyG
@AndyG निश्चित है, लेकिन ऐसा इसलिए है क्योंकि वे वही वस्तु हैं। पाइथन वादा करता है कि यदि वे बराबर की तुलना करते हैं तो उन्हें हैश बराबर होना चाहिए। –