#!/usr/bin/env python """ Simple sample of variable name differences between Python 2.7 and Python 3.5. """ class PythonExpr: def __init__(self, expr): self.expr = expr = expr.strip().replace('\n', ' ') try: d = {} self.f_code = 'def f():\n return %s\n' % expr.strip() exec(self.f_code, d) self._f = d['f'] except: raise CompilerError(('Python expression error:\n' '%s: %s') % exc_info()[:2]) def _get_used_names(self): self._f_varnames = vnames = [] for vname in self._f.__code__.co_names: if vname[0] not in '$_': vnames.append(vname) if __name__ == '__main__': pe = PythonExpr('[x for x in context.assignedto if x.realname not in user_realnames]') pe._get_used_names() print(pe._f_varnames) # Python 2.7 displays this list: # ['context', 'assignedto', 'realname', 'user_realnames'] # Python 3.5 displays this list: # ['context', 'assignedto']