पायथन स्टैंडर्ड लाइब्रेरी में dis मॉड्यूल पायथन बाइटकोड के विश्लेषण के लिए विभिन्न फ़ंक्शन प्रदान करता है, जिसे डिसअसेंबल करके मानव-पठनीय रूप में बदल दिया जाता है। यह ऑप्टिमाइज़ेशन करने में मदद करता है। बाइटकोड इंटरप्रेटर का एक संस्करण-विशिष्ट कार्यान्वयन विवरण है।
dis() फ़ंक्शन
dis() फ़ंक्शन किसी भी पायथन कोड सोर्स यानी मॉड्यूल, क्लास, मेथड, फ़ंक्शन, या कोड ऑब्जेक्ट का डिसअसेंबल्ड रिप्रेजेंटेशन जनरेट करता है।
>>> def hello():
... print("hello world")
...
>>> import dis
>>> dis.dis(hello)
2 0 LOAD_GLOBAL 0 (print)
3 LOAD_CONST 1 ('hello world')
6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
Bytecode क्लास
बाइटकोड विश्लेषण API Bytecode क्लास में परिभाषित है। इसका कंस्ट्रक्टर Bytecode ऑब्जेक्ट लौटाता है जिसमें बाइटकोड का विश्लेषण करने के लिए निम्न मेथड्स होते हैं:
Bytecode()
यह कंस्ट्रक्टर है। एक फ़ंक्शन, जनरेटर, मेथड, सोर्स कोड स्ट्रिंग, या कोड ऑब्जेक्ट से संबंधित बाइटकोड का विश्लेषण करता है। यह कई फ़ंक्शन्स के चारों ओर एक सुविधाजनक रैपर है।
>>> string = dis.Bytecode(hello) >>> for x in string: ... print(x) Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=0, starts_line=2, is_jump_target=False) Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval='hello world', argrepr="'hello world'", offset=3, starts_line=None, is_jump_target=False) Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=6, starts_line=None, is_jump_target=False) Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=9, starts_line=None, is_jump_target=False) Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=10, starts_line=None, is_jump_target=False) Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=13, starts_line=None, is_jump_target=False)
code_info()
यह फ़ंक्शन पायथन कोड ऑब्जेक्ट की जानकारी लौटाता है।
>>> dis.code_info(hello) "Name: hello\nFilename: <pyshell#2>\nArgument count: 0\nKw-only arguments: 0\nNumber of locals: 0\nStack size: 2\nFlags: OPTIMIZED, NEWLOCALS, NOFREE\nConstants:\n 0: None\n 1: 'hello world'\nNames:\n 0: print"
show_code()
यह फ़ंक्शन पायथन मॉड्यूल, फ़ंक्शन या क्लास की विस्तृत कोड जानकारी प्रिंट करता है।
>>> dis.show_code(hello) Name: hello Filename: <pyshell#2> Argument count: 0 Kw-only arguments: 0 Number of locals: 0 Stack size: 2 Flags: OPTIMIZED, NEWLOCALS, NOFREE Constants: 0: None 1: 'hello world' Names: 0: print
disassemble()
यह फ़ंक्शन एक कोड ऑब्जेक्ट को डिसअसेंबल करता है और आउटपुट को निम्न कॉलम में विभाजित करता है:
- प्रत्येक लाइन की पहली इंस्ट्रक्शन के लिए लाइन नंबर
- करंट इंस्ट्रक्शन, --> के रूप में इंगित
- लेबल्ड इंस्ट्रक्शन, >> के साथ इंगित
- इंस्ट्रक्शन का एड्रेस
- ऑपरेशन कोड नाम
- ऑपरेशन पैरामीटर्स
- पैरामीटर्स की व्याख्या पैरेंथेसिस में
>>> codeInString = 'a = 5\nb = 6\nsum = a + b \nprint("sum = ",sum)'
>>> codeObejct = compile(codeInString, 'sumstring', 'exec')
>>> dis.disassemble(codeObejct)
आउटपुट
1 0 LOAD_CONST 0 (5)
3 STORE_NAME 0 (a)
2 6 LOAD_CONST 1 (6)
9 STORE_NAME 1 (b)
3 12 LOAD_NAME 0 (a)
15 LOAD_NAME 1 (b)
18 BINARY_ADD
19 STORE_NAME 2 (sum)
4 22 LOAD_NAME 3 (print)
25 LOAD_CONST 2 ('sum =')
28 LOAD_NAME 2 (sum)
31 CALL_FUNCTION 2 (2 positional, 0 keyword pair)
34 POP_TOP
35 LOAD_CONST 3 (None)
38 RETURN_VALUE
get_instructions()
यह फ़ंक्शन सप्लाई किए गए फ़ंक्शन, मेथड, सोर्स कोड स्ट्रिंग या कोड ऑब्जेक्ट में इंस्ट्रक्शन्स पर एक इटरेटर लौटाता है। इटरेटर सप्लाई किए गए कोड में प्रत्येक ऑपरेशन का विवरण देने वाले Instruction नेम्ड टपल्स की एक श्रृंखला जनरेट करता है।
>>> it = dis.get_instructions(code)
>>> for i in it:
... print(i)
Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=", line 2>, argrepr='", line 2>', offset=0, starts_line=2, is_jump_target=False)
Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval='hello', argrepr="'hello'", offset=3, starts_line=None, is_jump_target=False)
Instruction(opname='MAKE_FUNCTION', opcode=132, arg=0, argval=0, argrepr='', offset=6, starts_line=None, is_jump_target=False)
Instruction(opname='STORE_NAME', opcode=90, arg=0, argval='hello', argrepr='hello', offset=9, starts_line=None, is_jump_target=False)
Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=None, argrepr='None', offset=12, starts_line=None, is_jump_target=False)
Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=15, starts_line=None, is_jump_target=False)
फ़ंक्शन की जानकारी टपल-जैसे ऑब्जेक्ट के रूप में निम्न पैरामीटर्स के साथ होती है:
| Instruction | बाइटकोड ऑपरेशन का विवरण |
|---|---|
| opcode | ऑपरेशन के लिए न्यूमेरिक कोड, नीचे सूचीबद्ध ऑपकोड मानों और Opcode कलेक्शन में बाइटकोड मानों से मेल खाता है। |
| opname | ऑपरेशन के लिए मानव-पठनीय नाम |
| arg | ऑपरेशन के लिए न्यूमेरिक तर्क (यदि कोई हो), अन्यथा None |
| argval | हल किया गया तर्क मान (यदि ज्ञात हो), अन्यथा arg के समान |
| argrepr | ऑपरेशन तर्क का मानव-पठनीय विवरण |
| offset | बाइटकोड अनुक्रम के भीतर ऑपरेशन का प्रारंभ सूचकांक |
| starts_line | इस ऑपकोड द्वारा शुरू की गई लाइन (यदि कोई हो), अन्यथा None |
| is_jump_target | True यदि अन्य कोड यहाँ जंप करता है, अन्यथा False |