2012-08-03 13 views
13

संभव डुप्लिकेट:
accessing a python int literals methodsइंटीजर शाब्दिक पायथन में एक वस्तु है?

अजगर में

सब कुछ एक वस्तु है। यहां तक ​​कि एक नंबर एक वस्तु है:

>>> a=1 
>>> type(a) 
<class 'int'> 
>>>a.real 
1 

मैंने कोशिश की है, तो निम्न क्योंकि हम एक वस्तु के वर्ग के सदस्यों तक पहुँचने के लिए सक्षम होना चाहिए:

>>> type(1) 
<class 'int'> 
>>> 1.real 
    File "<stdin>", line 1 
    1.real 
     ^
SyntaxError: invalid syntax 

ऐसा क्यों काम नहीं करता है?

+3

यह एक वाक्यविन्यास त्रुटि है। संकलक वाक्यविन्यास को समझ में नहीं आता है। भाषा वाक्यविन्यास (इसका व्याकरण) परिभाषित नहीं किया गया है ताकि आप एक पूर्णांक के बाद एक विधि नाम टाइप कर सकें। कार्यक्रम चलने पर यह कोई त्रुटि नहीं है - यह प्रोग्राम से पहले * पहले * है। पार्सर समझ में नहीं आता कि आपने क्या लिखा है। –

+0

@andrewcooke - मुझे लगता है कि सवाल (जिस तरह से खूबसूरती से प्रदर्शित) है * क्यों * पार्सर इसे संभाल नहीं सकता है? आप अन्य प्रकार के अक्षरों पर विशेषताओं/विधियों तक पहुंच सकते हैं (सामान्य '".join (...)' पर विचार करें, क्यों पूर्णांक नहीं? – mgilson

+0

वास्तव में यह करता है, लेकिन मैंने सोचा कि सवाल पूछने वाले व्यक्ति की मुख्य चिंता थी कि किसी भी तरह इसका मतलब था कि पूर्णांक ऑब्जेक्ट नहीं थे (देखें http://stackoverflow.com/questions/11801549/python-data-types-are-classes-or-data- उसी उपयोगकर्ता से संरचनाएं)। इसलिए इस पर मेरा जोर कैसे है एक अलग, पहले परत से। –

उत्तर

18

हां, एक पूर्णांक शाब्दिक पाइथन में एक ऑब्जेक्ट है। संक्षेप में, पार्सर को यह समझने में सक्षम होना चाहिए कि यह प्रकार पूर्णांक की वस्तु से निपट रहा है, जबकि कथन 1.real पार्सर को यह सोचने में भ्रमित करता है कि 1. शब्द real है, और इसलिए वाक्यविन्यास त्रुटि उठाती है।

यह परीक्षण करने के आप भी

>> (1).real 
    1 

के साथ ही कोशिश कर सकते हैं,

>> 1.0.real 
    1.0 
तो 1.real अजगर के मामले में

एक दशमलव बिंदु के रूप में . की व्याख्या कर रहा है।

संपादित

BasicWolf अच्छी तरह से भी कहते हैं - 1. 1 की चल बिन्दु प्रतिनिधित्व के रूप में व्याख्या की जा रही है, इसलिए 1.real(1.)real लेखन के बराबर है - कोई विशेषता का उपयोग ऑपरेटर अर्थात अवधि/पूर्ण विराम के साथ ऐसा। इसलिए वाक्यविन्यास त्रुटि।

आगे संपादित

mgilson उसका/उसकी टिप्पणी में की ओर संकेत के रूप में: पार्सर int के गुण और तरीकों के लिए उपयोग संभाल कर सकते हैं, लेकिन केवल जब तक बयान से यह स्पष्ट है कि यह एक दिया जा रहा है बनाता है int और float नहीं।

+13

'1 .real' भी काम करता है (और फ्लोट के लिए' 1..real')। –

+6

कारण यह है कि जब पाइथन कुछ अंकों को देखता है और फिर एक अवधि, तो यह इसे एक के रूप में मानता है दशमलव बिंदु और उम्मीद है कि यह एक फ्लोट है। ईटीए: ठीक है, आप उसी निष्कर्ष पर पहुंचे –

+1

+1, लेकिन हो सकता है कि आप भ्रमित शीर्षक के लिए एक स्पष्ट उत्तर जोड़ना चाहें: हां, एक पूर्णांक अक्षर एक वस्तु है; यही कारण नहीं है '1.real' असफल रहा है। – abarnert

7

हालांकि 1.real साथ व्यवहार unlogical लगता है, यह भाषा विनिर्देश की वजह से उम्मीद है: अजगर एक नाव के रूप में व्याख्या 1. (floating point literals) देख लेकिन जैसे @mutzmatron (1).real काम करता है ने बताया क्योंकि कोष्ठक में अभिव्यक्ति एक वैध अजगर वस्तु है।।

अद्यतन: नोट निम्नलिखित गड्ढों:

1 + 2j.real 
>>> 1.0  # due to the fact that 2j.real == 0 
# but 
1 + 2j.imag 
>>> 3.0  # due to the fact that 2j.imag == 2 
+0

'1 + 2j.real' केवल दुर्घटना से काम करता है, यह' 1 + (2j.real) 'के बराबर है, जो हमेशा' 1 + 0' के बराबर होता है। –

+0

@lazyr के पूरक के लिए धन्यवाद! –

2

तुम अब भी उपयोग कर सकते हैं 1.Real:

>>> hasattr(1, 'real') 
True 
>>> getattr(1, 'real') 
1 
7

एक भाषा आमतौर पर तीन परतों में बनाई जाती है।

जब आप किसी भाषा को प्रोग्राम प्रदान करते हैं तो इसे पहले प्रोग्राम को "पढ़ना" होता है। तो यह उस चीज़ को बनाता है जो उसने पढ़ा है जिसमें यह काम कर सकता है। और अंततः यह उस चीज़ को "एक कार्यक्रम" के रूप में चलाता है और (उम्मीद है) परिणाम प्रिंट करता है।

समस्या यह है कि पाइथन का पहला भाग - कार्यक्रम जो पढ़ता है - उलझन में है। यह उलझन में है, क्योंकि यह काफी चालाक

1.234 

और

1.letters 

क्या हो रहा जा करने के लिए उसके अनुसार आपकी 1.234 की तरह एक नंबर टाइप करने के लिए कोशिश कर रहे थे लेकिन एक गलती की है और है लगता है के बीच अंतर पता करने के लिए नहीं है इसके बजाय टाइप किए गए अक्षर (!)।

इसलिए 1 "वास्तव में है" के साथ इसका कोई लेना-देना नहीं है और यह एक वस्तु है या नहीं। उस तरह का तर्क दूसरे और तीसरे चरणों में होता है जो मैंने पहले वर्णित किया था, जब पाइथन निर्माण करने की कोशिश करता है और फिर प्रोग्राम चलाता है।

जो आपने खोला है वह केवल एक अजीब (लेकिन रोचक!) शिकन है जिसमें पाइथन प्रोग्राम पढ़ता है।

[मैं इसे एक बग कहूंगा, लेकिन शायद यह किसी कारण से ऐसा है। यह पता चला है कि कुछ चीजें कंप्यूटर पढ़ने के लिए कठिन हैं। पाइथन शायद डिज़ाइन किया गया है ताकि कंप्यूटर को प्रोग्राम पढ़ने के लिए यह आसान (तेज़) हो। इस "बग" को ठीक करने से संभवतः पाइथन का हिस्सा बन जाएगा जो प्रोग्राम को धीमा या अधिक जटिल पढ़ता है। तो यह शायद एक व्यापार बंद है।]

+0

+1, और [lexing] (http://en.wikipedia.org/wiki/Lexical_analysis) पर विकिपीडिया के आलेख का एक लिंक, जो पहले चरण को आम तौर पर बुलाया जाता है। – Izkata

संबंधित मुद्दे