You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
execfile fixer produces code that does not close the file #57541
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=Noneclosed_at=<Date2021-10-20.22:36:26.926>created_at=<Date2011-11-03.12:11:31.896>labels= ['type-bug', 'expert-2to3']
title='execfile fixer produces code that does not close the file'updated_at=<Date2021-10-20.22:41:03.719>user='https://github.com/smarnach'
Be aware that execfile() is a simple function call and can be used in any expression.
smarnach commented on Nov 3, 2011
smarnachmannequin
MannequinAuthor
More actions
@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.
smarnach commented on Nov 3, 2011
smarnachmannequin
MannequinAuthor
More actions
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?
Activity
smarnach commentedon Nov 3, 2011
The execfile fixer of the 2to3 script replaces the 2.x code
by
The new code does not explicitly close the file. This is not usually a problem in CPython, but
the code will throw a RessourceWarnings if enabled and
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:
If this is to be changed, I'd be happy to prepare a patch.
akheron commentedon Nov 3, 2011
Sounds reasonable to me. Is it easy to generate unique identifier names in 2to3 fixers?
pitrou commentedon Nov 3, 2011
Be aware that execfile() is a simple function call and can be used in any expression.
smarnach commentedon Nov 3, 2011
@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.
smarnach commentedon Nov 3, 2011
Getting the general case right seems a bit too difficult. Examples like
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?
benjaminp commentedon Nov 3, 2011
Or you could just explicitly write out the exec(compile()) in your 2.x code.