Skip to content

execfile fixer produces code that does not close the file #57541

Closed

Description

@smarnach
mannequin
BPO 13332
Nosy @pitrou, @benjaminp, @asmeurer, @akheron, @smarnach
Superseder
  • bpo-45544: Close 2to3 issues and list them here
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = <Date 2021-10-20.22:36:26.926>
    created_at = <Date 2011-11-03.12:11:31.896>
    labels = ['type-bug', 'expert-2to3']
    title = 'execfile fixer produces code that does not close the file'
    updated_at = <Date 2021-10-20.22:41:03.719>
    user = 'https://github.com/smarnach'

    bugs.python.org fields:

    activity = <Date 2021-10-20.22:41:03.719>
    actor = 'iritkatriel'
    assignee = 'none'
    closed = True
    closed_date = <Date 2021-10-20.22:36:26.926>
    closer = 'iritkatriel'
    components = ['2to3 (2.x to 3.x conversion tool)']
    creation = <Date 2011-11-03.12:11:31.896>
    creator = 'smarnach'
    dependencies = []
    files = []
    hgrepos = []
    issue_num = 13332
    keywords = []
    message_count = 6.0
    messages = ['146918', '146924', '146925', '146931', '146953', '146977']
    nosy_count = 6.0
    nosy_names = ['pitrou', 'benjamin.peterson', 'VPeric', 'Aaron.Meurer', 'petri.lehtinen', 'smarnach']
    pr_nums = []
    priority = 'normal'
    resolution = 'wont fix'
    stage = 'resolved'
    status = 'closed'
    superseder = '45544'
    type = 'behavior'
    url = 'https://bugs.python.org/issue13332'
    versions = ['Python 3.2', 'Python 3.3']

    Activity

    1. smarnach commented on Nov 3, 2011

      smarnachmannequin
      MannequinAuthor

      The execfile fixer of the 2to3 script replaces the 2.x code

          execfile("a.py")

      by

      exec(compile(open("a.py").read(), "a.py", 'exec'))
      

      The new code does not explicitly close the file. This is not usually a problem in CPython, but

      1. the code will throw a RessourceWarnings if enabled and

      2. other Python implementation don't close the file immediately.

      (I think the 2to3 script should be as implementation-independent as possible.)

      The obvious fix would be to use a with-statement:

          with open("a.py") as new_name:
              exec(compile(new_name.read(), "a.py", 'exec'))

      If this is to be changed, I'd be happy to prepare a patch.

    2. akheron commented on Nov 3, 2011

      @akheron
      Member

      Sounds reasonable to me. Is it easy to generate unique identifier names in 2to3 fixers?

    3. pitrou commented on Nov 3, 2011

      @pitrou
      Member

      Be aware that execfile() is a simple function call and can be used in any expression.

    4. smarnach commented on Nov 3, 2011

      smarnachmannequin
      MannequinAuthor

      @petri: Yes, that's what the BaseFix.new_name() method is for.

      @antoine: I thought about this, though I don't think it is very common to call execfile() as part of an expression. The whole statement containing the function call would need to be wrapped.

    5. smarnach commented on Nov 3, 2011

      smarnachmannequin
      MannequinAuthor

      Getting the general case right seems a bit too difficult. Examples like

      [execfile(n) for n in names if condition(n)]
      
      execfile(execfile(n1) or n2)
      
      try: 1 / 0
      except execfile(n) or ZeroDivisionError: pass
      

      would require rather complex transformations to get exactly matching behaviour, and obviously we don't want to explode the fixer code to support such nonsense.

      I think it is enough to cover the case of an execfile() call that forms a statement of its own. Browsing through the first ten pages of a Google code search for "execfile" didn't reveal any other uses, except for a few that aren't covered by the current version of the fixer either. 1

      I'd suggest to simply throw a "could not convert" warning for any other uses of execfile(). Opinions?

    6. benjaminp commented on Nov 3, 2011

      @benjaminp
      Contributor

      Or you could just explicitly write out the exec(compile()) in your 2.x code.

    7. transferred this issue fromon Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      topic-2to3type-bugAn unexpected behavior, bug, or error

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions