Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования PythonΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 55

Автор Π ΠΎΠΌΠ°Π½ Π‘ΡƒΠ·ΠΈ

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ лСксСм Python: ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова (NAME), Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ (STRING, NUMBER ΠΈ Ρ‚.ΠΏ.), ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (OP), Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ лСксСмы для обозначСния (измСнСния) отступов (INDENT, DEDENT) ΠΈ ΠΊΠΎΠ½Ρ†ΠΎΠ² строк (NEWLINE), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ (COMMENT). ЛСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ доступСн Ρ‡Π΅Ρ€Π΅Π· ΠΌΠΎΠ΄ΡƒΠ»ΡŒ tokenize, Π° опрСдСлСния ΠΊΠΎΠ΄ΠΎΠ² лСксСм содСрТатся Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ token стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Python. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π² дСйствии:

import StringIO, token, tokenize


prog_example = """

for i in range(100): # comment

 if i % 1 == 0: \

 print ":", t**2

""".strip()


rl = StringIO.StringIO(prog_example).readline


for t_type, t_str, (br,bc), (er,ec), logl in tokenize.generate_tokens(rl):

 print "%3i %10s : %20r" % (t_type, token.tok_name[t_type], t_str)

А Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Ρ€Π°Π·Π±ΠΈΠ² Π½Π° лСксСмы исходный ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

prog_example:

 1      NAME :       'for'

 1      NAME :         'i'

 1      NAME :        'in'

 1      NAME :     'range'

50        OP :         '('

 2    NUMBER :       '100'

50        OP :         ')'

50        OP :         ':'

52   COMMENT : '# comment'

 4   NEWLINE :        '\n'

 5    INDENT :         ' '

 1      NAME :        'if'

 1      NAME :         'i'

50        OP :         '%'

 2    NUMBER :         '1'

50        OP :        '=='

 2    NUMBER :         '0'

50        OP :         ':'

 1      NAME :     'print'

 3    STRING :       '":"'

50        OP :         ','

 1      NAME :         't'

50        OP :        '**'

 2    NUMBER :         '2'

 6    DEDENT :          ''

 0 ENDMARKER :          ''

ЀактичСски ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΏΠΎΡ‚ΠΎΠΊ лСксСм, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ. НапримСр, для синтаксичСского Β«ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°Π½ΠΈΡΒ» ΠΊΠΎΠ΄Π° Π½Π° языкС Python. Π‘Π»ΠΎΠ²Π°Ρ€ΡŒ token.tok_name позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ мнСмоничСскиС ΠΈΠΌΠ΅Π½Π° для Ρ‚ΠΈΠΏΠ° лСксСмы ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€Ρƒ.

БинтаксичСский Π°Π½Π°Π»ΠΈΠ·

Вторая стадия прСобразования исходного тСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° состоит Π² синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅ исходного тСкста. ΠœΠΎΠ΄ΡƒΠ»ΡŒ parser содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ suite() ΠΈ expr() для построСния Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² синтаксичСского Ρ€Π°Π·Π±ΠΎΡ€Π° соотвСтствСнно для ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Python. ΠœΠΎΠ΄ΡƒΠ»ΡŒ symbol содСрТит Π½ΠΎΠΌΠ΅Ρ€Π° символов Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Python, ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ для получСния названия символа ΠΈΠ· Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Python.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ достаточно простой ΠΊΠΎΠ΄ Python (prg) ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π΄Π΅Ρ€Π΅Π²ΠΎ синтаксичСского Ρ€Π°Π·Π±ΠΎΡ€Π° (ASTβ€“ΠΎΠ±ΡŠΠ΅ΠΊΡ‚), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΡƒΡ‚ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π² ΠΊΠΎΡ€Ρ‚Π΅ΠΆ ΠΈ красиво Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ pprint.pprint(). Π”Π°Π»Π΅Π΅ опрСдСляСтся функция для прСвращСния Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² символов Π² ΠΈΡ… мнСмоничСскиС обозначСния (ΠΈΠΌΠ΅Π½Π°) Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅:

import pprint, token, parser, symbol


prg = """print 2*2"""


pprint.pprint(parser.suite(prg).totuple())


def pprint_ast(ast, level=0):

 if type(ast) == type(()):

  for a in ast:

   pprint_ast(a, level+1)

 elif type(ast) == type(""):

  print repr(ast)

 else:

  print " "*level,

  try:

   print symbol.sym_name[ast]

  except:

   print "token."+token.tok_name[ast],


print

pprint_ast(parser.suite(prg).totuple())

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ (структура Π΄Π΅Ρ€Π΅Π²Π° ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½Π° отступами):

(257,

 (264,

  (265,

   (266,

    (269,

     (1, 'print'),

      (292,

       (293,

        (294,

         (295,

          (297,

           (298,

            (299,

             (300,

              (301,

               (302,

                (303, (304, (305, (2, '2')))),

                (16, '*'),

                (303, (304, (305, (2, '2')))))))))))))))),

  (4, ''))),

  (0, ''))


   file_input

    stmt

     simple_stmt

      small_stmt

       print_stmt

        token.NAME 'print'

         test

          and_test

           not_test

            comparison

             expr

              xor_expr

               and_expr

                shift_expr

                 arith_expr

                  term

                   factor

                    power

                     atom

                      token.NUMBER '2'

                  token.STAR '*'

                  factor

                   power

                    atom

                     token.NUMBER '2'

      token.NEWLINE ''

    token.ENDMARKER ''

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ Π΄Π΅Ρ€Π΅Π²ΠΎ синтаксичСского Ρ€Π°Π·Π±ΠΎΡ€Π°, компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, подходящий для исполнСния ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ проводятся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ синтаксичСский Π°Π½Π°Π»ΠΈΠ·, компиляция ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ (вычислСниС) ΠΊΠΎΠ΄Π° (ΠΈ выраТСния) Π² языкС Python:

import parser


prg = """print 2*2"""

ast = parser.suite(prg)

code = ast.compile('filename.py')

exec code


prg = """2*2"""

ast = parser.expr(prg)

code = ast.compile('filename1.py')

print eval(code)

Ѐункция parser.suite() (ΠΈΠ»ΠΈ parser.expr()) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ASTβ€“ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Π΄Π΅Ρ€Π΅Π²ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ compile() компилируСтся Π² Python Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΈ сохраняСтся Π² ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ code. Π’Π΅ΠΏΠ΅Ρ€ΡŒ этот ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ (ΠΈΠ»ΠΈ, Π² случаС выраТСния β€” Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° exec (ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ eval()).

Π—Π΄Π΅ΡΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ Π² Python появился ΠΏΠ°ΠΊΠ΅Ρ‚ compiler, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π½Π°Π»ΠΈΠ·Π° исходного ΠΊΠΎΠ΄Π° Π½Π° Python ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°. Π’ Π΄Π°Π½Π½ΠΎΠΉ Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΎΠ½ Π½Π΅ рассматриваСтся, Π½ΠΎ Ρ‚Π΅, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ эти процСссы, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Python.

Π˜Π·ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°

Для изучСния Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Python–программы ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ dis (сокращСниС ΠΎΡ‚ «дизассСмблСр»), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Π² мнСмоничСском Π²ΠΈΠ΄Π΅. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ:

>>> def f():

... print 2*2

...

>>> dis.dis(f)

 2  0 LOAD_CONST      1 (2)

    3 LOAD_CONST      1 (2)

    6 BINARY_MULTIPLY

    7 PRINT_ITEM

    8 PRINT_NEWLINE

    9 LOAD_CONST      0 (None)

   12 RETURN_VALUE

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ΡΡ функция f(), которая Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΈ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния 2*2. Ѐункция dis() модуля dis Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f() Π² Π²ΠΈΠ΄Π΅ Π½Π΅ΠΊΠΎΠ³ΠΎ «ассСмблСра», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Python прСдставлСн мнСмоничСскими ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ стСк, поэтому LOAD_CONST ΠΊΠ»Π°Π΄Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка, Π° BINARY_MULTIPLY Π±Π΅Ρ€Π΅Ρ‚ со стСка Π΄Π²Π° значСния ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π½Π° стСк Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΡ… пСрСмноТСния. Ѐункция Π±Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° return Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ None. Как ΠΈ Π² случаС с ΠΊΠΎΠ΄Π°ΠΌΠΈ для микропроцСссора, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

ΠœΠ½Π΅ΠΌΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² спискС dis.opname (Π½ΠΈΠΆΠ΅ ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ задСйствованныС ΠΈΠΌΠ΅Π½Π°):

>>> import dis

>>> [n for n in dis.opname if n[0] != "<"]

['STOP_CODE', 'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'DUP_TOP', 'ROT_FOUR',

'NOP', 'UNARY_POSITIVE', 'UNARY_NEGATIVE', 'UNARY_NOT', 'UNARY_CONVERT',

'UNARY_INVERT', 'LIST_APPEND', 'BINARY_POWER', 'BINARY_MULTIPLY',

'BINARY_DIVIDE', 'BINARY_MODULO', 'BINARY_ADD', 'BINARY_SUBTRACT',

'BINARY_SUBSCR', 'BINARY_FLOOR_DIVIDE', 'BINARY_TRUE_DIVIDE',

'INPLACE_FLOOR_DIVIDE', 'INPLACE_TRUE_DIVIDE', 'SLICE+0', 'SLICE+1',

'SLICE+2', 'SLICE+3', 'STORE_SLICE+0', 'STORE_SLICE+1', 'STORE_SLICE+2',

'STORE_SLICE+3', 'DELETE_SLICE+0', 'DELETE_SLICE+1', 'DELETE_SLICE+2',

'DELETE_SLICE+3', 'INPLACE_ADD', 'INPLACE_SUBTRACT', 'INPLACE_MULTIPLY',

'INPLACE_DIVIDE', 'INPLACE_MODULO', 'STORE_SUBSCR', 'DELETE_SUBSCR',

'BINARY_LSHIFT', 'BINARY_RSHIFT', 'BINARY_AND', 'BINARY_XOR', 'BINARY_OR',

'INPLACE_POWER', 'GET_ITER', 'PRINT_EXPR', 'PRINT_ITEM', 'PRINT_NEWLINE',

'PRINT_ITEM_TO', 'PRINT_NEWLINE_TO', 'INPLACE_LSHIFT', 'INPLACE_RSHIFT',

'INPLACE_AND', 'INPLACE_XOR', 'INPLACE_OR', 'BREAK_LOOP', 'LOAD_LOCALS',

'RETURN_VALUE', 'IMPORT_STAR', 'EXEC_STMT', 'YIELD_VALUE', 'POP_BLOCK',

'END_FINALLY', 'BUILD_CLASS', 'STORE_NAME', 'DELETE_NAME',

'UNPACK_SEQUENCE', 'FOR_ITER', 'STORE_ATTR', 'DELETE_ATTR', 'STORE_GLOBAL',

'DELETE_GLOBAL', 'DUP_TOPX', 'LOAD_CONST', 'LOAD_NAME', 'BUILD_TUPLE',

'BUILD_LIST', 'BUILD_MAP', 'LOAD_ATTR', 'COMPARE_OP', 'IMPORT_NAME',

'IMPORT_FROM', 'JUMP_FORWARD', 'JUMP_IF_FALSE', 'JUMP_IF_TRUE',

'JUMP_ABSOLUTE', 'LOAD_GLOBAL', 'CONTINUE_LOOP', 'SETUP_LOOP',

'SETUP_EXCEPT', 'SETUP_FINALLY', 'LOAD_FAST', 'STORE_FAST', 'DELETE_FAST',

'RAISE_VARARGS', 'CALL_FUNCTION', 'MAKE_FUNCTION', 'BUILD_SLICE',

'MAKE_CLOSURE', 'LOAD_CLOSURE', 'LOAD_DEREF', 'STORE_DEREF',

'CALL_FUNCTION_VAR', 'CALL_FUNCTION_KW', 'CALL_FUNCTION_VAR_KW',