software - python tutorial pdf
अजगर में, 0xbin() गलत क्यों लौटाता है? (3)
इस सवाल का पहले से ही यहाँ एक जवाब है:
कमांड इनपुट
0xbin()
गलत देता है:
>>> 0xbin()
False
ऐसा क्यों होता है? इस वाक्य-विन्यास का कोई अर्थ नहीं होना चाहिए। कार्य 0 से शुरू नहीं हो सकते हैं, हेक्स में कोई "i" और "n" नहीं हैं, और बिन फ़ंक्शन के पास कुछ तर्क होना चाहिए।
अभिव्यक्ति के सार वाक्यविन्यास वृक्ष को प्राप्त करने के लिए आप AST मॉड्यूल का उपयोग कर सकते हैं:
>>> import ast
>>> m = ast.parse('0xbin()')
>>> ast.dump(m)
'Module(
body=[Expr(
value=Compare(left=Num(n=11),
ops=[In()],
comparators=[Tuple(elts=[],
ctx=Load())
]
))])'
अमूर्त व्याकरण
देखें कि अभिव्यक्ति की व्याख्या कैसे की जाए, लेकिन tl?
0xb
:
Num(n=11)
0xb
हिस्सा है, और
Tuple(elts=[], ...)
एक फ़ंक्शन कॉल के बजाय एक खाली tuple की ओर संकेत करता है।
चेक करने के लिए आप पायथन के अपने टोकनर का उपयोग कर सकते हैं!
import tokenize
import io
line = b'0xbin()'
print(' '.join(token.string for token in tokenize.tokenize(io.BytesIO(line).readline) if token.type!=59))
यह आपके स्ट्रिंग में टोकन को प्रिंट करता है, रिक्त स्थान द्वारा अलग किया जाता है। इस मामले में, परिणाम होगा:
0xb in ( )
दूसरे शब्दों में, यह गलत रिटर्न करता है क्योंकि 11 नंबर (
0xb
) खाली ट्यूपल (
()
) में नहीं है।
(टिप्पणियों में
tokenize
के उपयोग के सुझाव के लिए रोमन ओडिसी के लिए धन्यवाद!)
EDIT: कोड को थोड़ा और अच्छी तरह से समझाने के लिए:
tokenize
फ़ंक्शन अजीब प्रारूप में इनपुट की अपेक्षा करता है, इसलिए
io.BytesIO(line).readline
एक फ़ंक्शन है जो कुछ
tokenize
में बाइट्स के क्रम को पढ़ सकता है।
tokenize
तो इसे tokenizes और
namedtuple
s की एक श्रृंखला लौटाता है;
हम प्रत्येक का प्रतिनिधित्व करने वाले स्ट्रिंग लेते हैं और उन्हें रिक्त स्थान के साथ जोड़ते हैं।
type != 59
भाग का उपयोग एन्कोडिंग विनिर्देशक को अनदेखा करने के लिए किया जाता है जो अन्यथा शुरुआत में दिखाई देगा।
यदि आप कोड को अलग करते हैं, तो आप देखेंगे कि
यस का उत्तर
, जिसमें उल्लेख है कि
0xbin()
को
0xbin()
रूप में व्याख्या किया
0xb in ()
, की पुष्टि की गई है:
>>> import dis
>>> dis.dis('0xbin()')
1 0 LOAD_CONST 0 (11)
2 BUILD_TUPLE 0
4 COMPARE_OP 6 (in)
6 RETURN_VALUE