A.2 Patched functions
When Psyco starts, it replaces a few functions from the __builtin__ and sys modules with a version of its own. This trick fails if you made a copy of one of these functions elsewhere before Psyco has a chance to replace it, because the old copy will not behave properly in the presence of Psyco.
Built-in function |
Notes |
globals |
|
locals |
(1) |
vars |
(1) when called with no argument |
dir |
(1) when called with no argument |
eval |
(1)(2) when called with a single argument |
execfile |
(1) when called with a single argument |
input |
(1) |
sys._getframe |
(3) |
Notes:
- (1)
- A function run by Psyco has no native locals dictionary. Psyco 1.3 and above can emulate it properly if a certain optimization (early dead variable deletion) is disabled. Psyco should turn off this optimization automatically for functions where it detects a call to one of the above built-in functions, but this detection is a guess over the function's bytecode. It means that certain indirect calls can be missed. If this occurs at run-time, a psyco.warning is issued and the emulated locals dictionary is empty.
- (2)
- Note that it is common to find Python programs that use dynamic code evaluation for an effect that can be obtained by calling an ad-hoc built-in function instead. For example,
eval('self.'+attr)
is better written as getattr(self, attr)
and exec 'import '+module
is better written as __import__(module, globals(), locals(), [])
.
- (3)
- Frames corresponding to Psyco-evaluated functions are incomplete, as described in section A.1.
Additionally, the exec
statement is not supported yet, as seen in section A.3.
Release 1.6, documentation updated on updated December 3rd, 2007.