[Tutor] flag to call methods on objects?
Dave Angel
davea at ieee.org
Fri Jul 31 12:26:55 CEST 2009
prasad rao wrote:
> hello
> I removed the bugs.But still getting error report.
>
>
>
>>> import mcript
>>>
>
> Traceback (most recent call last):
> File "<pyshell#6>", line 1, in <module>
> import mcript
> File "C:\Python26\mcript.py", line 78, in <module>
> a.main()
> File "C:\Python26\mcript.py", line 58, in main
> nl=__compress(__digi(__lengthen(line.strip())))+'\n'
> NameError: global name '_Cripto__compress' is not defined
>
> There is no string '_Cripto__compress' any whare in the script.
>
> So I dont know what corrections Ineed to make in the script.
>
> I am giving my code below again again .
>
> <code>
>
> #! usr/bin/env python
>
> import ast,random,os,zlib,string
> key=5
> class Craipto(object):
> def __init__(self,afile):
> self.afile=afile
> def __digi(self,astring):
> y=[]
> for x in astring:
> y.append(ord(x))
> y=str(y)
>
> return y
> def __undigi(self,astring):
>
> alist=ast.literal_eval(astring)
> y=[]
> for x in alist:
> y.append(chr(x))
> astring=''.join(y)
> return astring
> def __gen_string(self):
> s=''
> nl=random.sample(string.ascii_letters,key)
> for x in nl:s+=x
> return s
>
> def __lengthen(self,astring):
> s=list(astring)
> ns=''
> for x in s:
> ns+=x
> ns+=gen_string()
> return ns
> def __shorten(self,astring):
>
> s=list(astring)
> ns=''
> for x in range(0,len(s),key+1):
> ns+=s[x]
> return ns
> def __compress(self,astring):
> astring=zlib.compress(astring)
> return astring
> def __decompress(self,astring):
> astring=zlib.decompress(astring)
> return astring
> def main(self):
> sorce=open(self.afile,'r')
> data=(sorce.readlines())
> dest=open((os.path.split(self.afile)[0]+os.sep+'temp'),'w')
> if (data[0]).strip()=='flag1':
>
> ns='flag0\n'
> data=data[1:]
> for line in data:
> nl= __compress(__digi(__lengthen(line.strip())))+'\n'
> ns+=nl
> dest.write(ns)
> elif data[0].strip()=='flag0':
> ns='flag1\n'
> data=data[1:]
> for line in data:
> nl= __shorten((__undigi(__decompress(line.strip()))))+'\n'
> ns+=nl
> dest.write(ns)
> else:prind 'File does not begin with the flag'
>
> sorce.close()
> dest.close()
>
> os.remove(self.afile)
> os.rename((os.path.split(self.afile)[0]+os.sep+'temp'),self.afile)
>
>
> #========
> a=Cripto('C:/pp.txt')
> a.main()
>
> <\code>
>
>
I still see four problems. Your runtime error occurs because you
omitted the "self" on the call to self.__compress(). In fact, you omit
it nearly everywhere. Without it, Python will look for a global name,
which doesn't exist.
Second problem is that you spelled "print" as "prind" in your else clause.
Third is that when you do detect that the file doesn't begin properly,
you still truncate the file to nothing. The else clause should be roughly:
else:
print "File is malformed, no signature at beginning"
sorce.close()
dest.close()
os.remove( the temp file )
return
Fourth is that you're separating the "lines" of the encoded file with a
newline character, but I suspect that zlib.compress makes no promises
about avoiding that character(0a). If I'm right, you'll need another
approach. Either escape the byte sequence in __compress(), or use a
count instead of a separator. In either case, you'll need binary mode
for that part of the file I/O, if you want to be able to run on Windows.
There are a few other comments I could make about the code. First, why
did you make it a class? Perhaps your last language was Java, which
forces you into that particular paradigm? You never use self in any of
the methods except for __init__() and main(). And once main() is
finished, you now longer need the object. That should tell you that you
could make them all regular functions, and pass the filename directly to
main().
Next, why the double-underscore prefix on most of the methods? The only
effect that has on execution is that the error message shows a "mangled"
version of the function name. When it's a global, it mangles it with
the module name (_Cripto__compress), and when it's a method, it uses the
class name.
DaveA
More information about the Tutor
mailing list