Python-list Digest, Vol 70, Issue 282
Ryniek90
ryniek90 at gmail.com
Wed Jul 22 12:10:52 EDT 2009
>
>> When i use this class in Python IDLE, i've got this error: "
>>
> ...
>
>> Traceback (most recent call last):
>> File "<pyshell#60>", line 1, in <module>
>> mod.print_module('socket')
>> File "<pyshell#57>", line 48, in print_module
>> module_open = open(self._this_module, 'rb')
>> IOError: [Errno 2] No such file or directory: ''
>> >>>
>> "
>>
>> As You can see, i can't assign the new value "os.path.join(root, f)" to
>> the 'self._this_module variable'.
>>
>
> In the __init__ method, you successfully set the `_this_module` attribute:
>
> self._this_module = ''
>
> That works, so it proves that you *can* set a private attribute.
>
> Later on, you call the `_SetVar` method, which does this:
>
> def _SetVar(self, attr, val):
> self.attr = val
>
> In English, this method does this:
>
> (1) Take two arguments, and store them in variables called "attr" and
> "val".
>
> (2) Assign the value stored in "val" to an attribute named exactly "attr".
>
> What you actually want is:
>
> (1) Take two arguments, and store them in variables called "attr" and
> "val".
>
> (2) Assign the value stored in "val" to an attribute with the name stored
> in the variable "attr".
>
> Can you see the difference?
>
> What you actually want is:
>
> def _SetVar(self, attr, val):
> setattr(self, attr, val)
>
>
> Your code is terribly complicated. This will probably do what you want.
> (Warning -- I haven't tested it, so there may be a few errors.)
>
>
> class ModPrint(object):
> u"""
> This will be the doc.
> """
> def __init__(self, default_search_path=''):
> self.default_search_path = ''
>
> def find_module(self, modulename, search_path=''):
> if search_path == '':
> # Try the default search path instead.
> search_path = self.default_search_path
> if search_path == '': # still blank.
> # Try the Python search path instead.
> search_path = sys.exec_prefix
> for root, dirs, files in os.walk(search_path):
> for f in files:
> if f == "%s.py" % modulename:
> return os.path.join(root, f)
>
> def get_module_text(self, modulename, search_path=''):
> filename = self.find_module(modulename, search_path)
> module_open = open(filename, 'rb')
> module_text = module_open.read()
> module_open.close()
> return module_text
>
>
> I changed the name of print_module_text because it doesn't actually print
> anything.
>
Thanks for ready class - it works great, but that code:
"
What you actually want is:
def _SetVar(self, attr, val):
setattr(self, attr, val)
"
Didn't worked, so i wil reuse your class, and modify it later. Now i see
that working on private objects complex.
More information about the Python-list
mailing list