On 02/05/2014 04:30 PM, Alan Ho wrote:
Hi,
I am a novice in Python, having attended a course few weeks ago and I'm working
on my assignment now, and I encounter this issue when I was trying to print the
entire Windows Registry (WR) sub-keys directories (trying that first with the
below codes with adaptations from on-line research) and its value (later on).
Kindly advise if any, as it has been taking me few days. What I need is a
display on the std screen the entire directory of sub-keys (inserted into a
list) in a WR key say, HKEY_CURRENT_FIG, and then I will write the contents
into a text or CSV file.
Thanks advance!
Here are my codes,
-----------------
import winreg
def traverse(root, key, list):
hKey = winreg.OpenKey(root, key)
try:
i = 0
while True:
strFullSubKey = ""
try:
strSubKey = winreg.EnumKey(hKey, i)
if (key != ""):
strFullSubKey = key + "\\" + strSubKey
else:
strFullSubKey = strSubKey
except WindowsError:
hKey.Close()
return
traverse(root, strFullSubKey, list)
list.append(strFullSubKey)
i += 1
except WindowsError:
hKey.Close()
global list
list = list()
traverse (winreg.HKEY_CURRENT_CONFIG,"",list)
print (list)
-----------------
This is all right in my view, a good example of (forward) recursive traversal
(like for a tree). Very functional programming (FP), in fact. However, even in
FP, people often make up a more "intuitive" interface to their functions, and I
guess this would be much more pythonic. If you did this, your program may look like:
def win_key ():
def rec_keys (node, key, list): # often called 'loop'
# recursive func
keys = list()
rec_keys (winreg.HKEY_CURRENT_CONFIG, "", keys)
return keys
keys = win_keys()
print(keys)
First look at the last lines: they form a simple, "intuitive", usage. They are
just what the client of your service --making a list of win reg keys-- expects,
right? To achieve this, you have to make the recursivity an internal quality of
the service, an "implementation detail". Clinet, users, don't care how you do it
internally, you could in fact do ot otherwise, and they (the clients) should not
be forced to deal with tyour implementation requirements or choices.
The example above thus defines an *internal* recursive func, the FP equivalent
of a loop (for thos reason often called 'loop' in FP code). With (such)
recursive funcs, we must pass to the func a start or end case
(root=winreg.HKEY_CURRENT_CONFIG), a current index (key=""), a temporary result
(list=list). This is what users should not be forced to deal with.
Side-note: avoid using python built-in names like 'list'.
PS: I don't understand why there is an outer try...except. The only statement in
there that may fail I guess is "traverse(root, strFullSubKey, list)", but this
is a self-call (self-recursive), so possible failure are already caught in the
inner try...except. What happens if you get rid of it, and why?
(I may be wrong, but I suspect the following: you first had WindowsError
exceptions and to deal with them introduced the outer try...except; then,
because of the self-call, you had to introduce the inner try...except; but in
fact the latter is the only one you need, it catches all possible exception of
the process, WindowsError's. Notice both try...except constructs catch
WindowsError's. Again i may be wrong.)
d
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor