namespaces
Rob Williscroft
rtw at freenet.co.uk
Sun Jul 31 12:45:14 EDT 2005
Steven D'Aprano wrote in
news:pan.2005.07.31.14.30.04.607118 at REMOVETHIScyber.com.au in
comp.lang.python:
> Quoting Rob Williscroft:
>
>> > def translate( text )
>> > import string all=string.maketrans('','')
>> > badcars=all.translate(all,string.letters+string.digits)
>> > TABLE = string.maketrans(badcars,'_'*len(badcars))
>> >
>> > global translate
>> > def translate( text ):
>> > return text.translate(TABLE)
>> >
>> > return translate( text )
>
> This is a difficult piece of code to understand and maintain.
Its 8 lines, of self contained code. It does everyting its supposed to do
and nothing its not.
> You have
> a function called translate, which in turn calls the string
> translate() method. That's okay. But then you have a global variable
> *also* called translate -- does that refer to the same function?
This is how globals work in python, if you wish to (re)bind to a global
before reading it at function scope, you need to say so.
> Is
> this self-modifying code? That is a dangerous, hard to debug, hard to
> understand technique that is too-clever-by-half.
>
Maybe so, but if true, python as a language is too-clever-by-half.
> Then you create a local variable, also called translate, also a
No, that isn't how globals work in python, there is no local called
translate above.
> function, which simply calls the translate method of its argument. A
> waste of a function, when all you need to do is call the pre-existing
> translate method. If I have understood this code correctly, the
> *local* translate is bound to the *global* translate, which is the
> function being defined.
Close but there isn't, and never was, a *local* translate function.
> And lastly, just to complete the confusion, the original function
> itself appears to call itself -- presumably the rebound copy that
> points to what was the local copy -- recursively, with the same
> argument.
def f()
global g
def g():
return "something"
return g()
f() is a function that (re)creates a global function g() and calls it.
Is it just that translate() rebinds itself that is too much, or do you
object to f() too ? I do object to f() but only because its useless.
> That's a nifty piece of code for showing how clever you are at writing
> mildly obfuscated code. But for commercial use, where the code has to
> be maintained and debugged, it is a terrible idea.
8 lines of self contained code are a terrible idea !, you have IMO a
very strange idea of what is or isn't maintainable.
Is using generators and decorators a terrible idea too ?
Rob.
--
http://www.victim-prime.dsl.pipex.com/
More information about the Python-list
mailing list