Okay -- so I promised that I would try the namespace mangling approach, and here's what I have come up with:
Approach #1: Pass in the variables to be swapped as strings. (boring) >>> import sys >>> def swap(n1,n2): ... try: ... raise RuntimeException() ... except: ... e,b,t = sys.exc_info() ... ldict = t.tb_frame.f_back.f_locals ... t = ldict[n1]; ... ldict[n1] = ldict[n2] ... ldict[n2] = t ... >>> x = 'A' >>> y = 'B' >>> id(x) 47946650437696 >>> id(y) 47946649710192 >>> swap('x','y') >>> print id(x) 47946649710192 >>> print id(y) 47946650437696 >>> print x,y B A Approach #2: Allow the user to pass in arbitrary objects, takes the id, infer what the variable in by hashing all possible objects, and then apply the swap operation above. >>> def swap2(o1,o2): ... try: ... raise RuntimeException() ... except: ... e,b,t = sys.exc_info() ... ldict = t.tb_frame.f_back.f_locals ... iddict = dict( (id(v), k ) for k,v in ldict.items() ) ... # print id(o1), id(o2) ... n1 = iddict[id(o1)] ... n2 = iddict[id(o2)] ... t = ldict[n1]; ... ldict[n1] = ldict[n2] ... ldict[n2] = t ... >>> print x,y B A >>> swap2(x,y) >>> print x,y A B >>> Now, I want to make the above codes more "Pythonic" -- is there a way to: 1. Get the function's arguments from the perspective of the caller? def f(x): print "caller's view of x = %s" % callersview(x) Then, f(1+2+3) would yield: caller's view of x = 1 + 2 + 3 2. Is there a better way to loopup by id? I'm not very familiar with sys.exc_info, but creating the id->name hash each time seems like overkill. 3. Is there a reference on all the special variables, like __foo__? 4. Is there any work on deparsing (like Perl's deparse) lambda functions to inline algebra and get a performance gain? Thanks again for your input, W ( from Perl-hacker to Python Programmer ) On Sun, Jul 11, 2010 at 2:37 PM, Stephen Hansen <me+list/pyt...@ixokai.io> wrote: > On 7/11/10 10:48 AM, wheres pythonmonks wrote: >> I'm an old Perl-hacker, and am trying to Dive in Python. I have some >> easy issues (Python 2.6) >> which probably can be answered in two seconds: >> >> 1. Why is it that I cannot use print in booleans?? e.g.: >>>>> True and print "It is true!" > > Because print is a statement. Statements have to start lines. If you > want to do this, use a function-- in Python 2.6 either via "from > __future__ import print_function" or writing your own, even if its just > a very thing wrapper around the print statement. > >> 2. How can I write a function, "def swap(x,y):..." so that "x = 3; y >> = 7; swap(x,y);" given x=7,y=3?? >> (I want to use Perl's Ref "\" operator, or C's &). >> (And if I cannot do this [other than creating an Int class], is this >> behavior limited to strings, >> tuples, and numbers) > > You can't do that*. Its not limited to any certain type of objects. You > can't manipulate calling scopes: if you really want to do that sort of > explicit namespace mangling, use dictionaries (or objects, really) as > the namespace to mangle and pass them around. > >> 3. Why might one want to store "strings" as "objects" in numpy >> arrays? (Maybe they wouldn't)? > > I don't use numpy. No idea. > >> 4. Is there a way for me to make some function-definitions explicitly >> module-local? > > In what sense? If you prepend them with an underscore, the function > won't be imported with "from x import *". You can also explicitly > control what is imported in that way with a module-level __all__ attribute. > > Now that won't stop someone from doing "import x" and > "x._your_private_function" but Python doesn't believe in enforicng > restrictions. > >> (Actually related to Q3 below: Is there a way to create an anonymous scope?) > > No. You can create a limited anonymous function with lambda, but note it > takes only an expression-- no statements in it. > >> 5. Is there a way for me to introduce a indention-scoped variables in python? >> See for example: http://evanjones.ca/python-pitfall-scope.html > > No. Python only has three scopes historically; local, global, and > builtin. Then post-2.2(ish, I forget) limited nested scoping -- but only > with nested functions, and you can't (until Python 3) re-bind variables > in outer scopes (though you can modify them if they are mutable objects). > > Python's scoping is very basic (we generally think this is a good thing; > others are never happy with it) and is not fully lexical scoped. > >> 6. Is there a Python Checker that enforces Strunk and White and is >> bad English grammar anti-python? (Only half joking) >> http://www.python.org/dev/peps/pep-0008/ > > Check out pylint and/or pychecker, which do various style-based > checking. If you're asking for something else, I can't pierce your > sarcasm to figure out what. > > -- > > Stephen Hansen > ... Also: Ixokai > ... Mail: me+list/python (AT) ixokai (DOT) io > ... Blog: http://meh.ixokai.io/ > > * Yes, I know its actually possible, to manipulate outer/calling scopes > with frame hacking. This is dangerous / bad / an implementation detail > that one should not rely on or use, generally speaking. If you need to > do this you're writing Java or Perl or C in Python, instead of writing > Python in Python, so are probably doing all kinds of things that are > slow / bad / dangerous / just not taking advantage of Python's strengths. > > > -- > http://mail.python.org/mailman/listinfo/python-list > > -- http://mail.python.org/mailman/listinfo/python-list