PageRenderTime 42ms CodeModel.GetById 20ms app.highlight 6ms RepoModel.GetById 15ms app.codeStats 0ms

/Lib/lib2to3/fixes/fix_execfile.py

http://unladen-swallow.googlecode.com/
Python | 51 lines | 39 code | 5 blank | 7 comment | 0 complexity | f968686ed347fd544fc69fd9cb6073cd MD5 | raw file
 1# Copyright 2006 Google, Inc. All Rights Reserved.
 2# Licensed to PSF under a Contributor Agreement.
 3
 4"""Fixer for execfile.
 5
 6This converts usages of the execfile function into calls to the built-in
 7exec() function.
 8"""
 9
10from .. import fixer_base
11from ..fixer_util import (Comma, Name, Call, LParen, RParen, Dot, Node,
12                          ArgList, String, syms)
13
14
15class FixExecfile(fixer_base.BaseFix):
16
17    PATTERN = """
18    power< 'execfile' trailer< '(' arglist< filename=any [',' globals=any [',' locals=any ] ] > ')' > >
19    |
20    power< 'execfile' trailer< '(' filename=any ')' > >
21    """
22
23    def transform(self, node, results):
24        assert results
25        filename = results["filename"]
26        globals = results.get("globals")
27        locals = results.get("locals")
28
29        # Copy over the prefix from the right parentheses end of the execfile
30        # call.
31        execfile_paren = node.children[-1].children[-1].clone()
32        # Construct open().read().
33        open_args = ArgList([filename.clone()], rparen=execfile_paren)
34        open_call = Node(syms.power, [Name("open"), open_args])
35        read = [Node(syms.trailer, [Dot(), Name('read')]),
36                Node(syms.trailer, [LParen(), RParen()])]
37        open_expr = [open_call] + read
38        # Wrap the open call in a compile call. This is so the filename will be
39        # preserved in the execed code.
40        filename_arg = filename.clone()
41        filename_arg.set_prefix(" ")
42        exec_str = String("'exec'", " ")
43        compile_args = open_expr + [Comma(), filename_arg, Comma(), exec_str]
44        compile_call = Call(Name("compile"), compile_args, "")
45        # Finally, replace the execfile call with an exec call.
46        args = [compile_call]
47        if globals is not None:
48            args.extend([Comma(), globals.clone()])
49        if locals is not None:
50            args.extend([Comma(), locals.clone()])
51        return Call(Name("exec"), args, prefix=node.get_prefix())